cmakewizard.cxx 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. #include "cmCacheManager.h"
  2. #include "cmake.h"
  3. bool advanced = false;
  4. void Ask(const char* key, cmCacheManager::CacheEntry & entry)
  5. {
  6. if(!advanced)
  7. {
  8. if(cmCacheManager::GetInstance()->IsAdvanced(key))
  9. {
  10. return;
  11. }
  12. }
  13. std::cout << "Variable Name: " << key << "\n";
  14. std::cout << "Description: " << entry.m_HelpString << "\n";
  15. std::cout << "Current Value: " << entry.m_Value.c_str() << "\n";
  16. std::cout << "New Value (Enter to keep current value): ";
  17. char buffer[4096];
  18. buffer[0] = 0;
  19. std::cin.getline(buffer, sizeof(buffer));
  20. if(buffer[0])
  21. {
  22. cmCacheManager::CacheEntry *entry =
  23. cmCacheManager::GetInstance()->GetCacheEntry(key);
  24. if(entry)
  25. {
  26. entry->m_Value = buffer;
  27. }
  28. else
  29. {
  30. std::cerr << "strange error, should be in cache but is not... " << key << "\n";
  31. }
  32. }
  33. std::cout << "\n";
  34. }
  35. int main(int ac, char** av)
  36. {
  37. std::vector<std::string> args;
  38. for(int j=0; j < ac; ++j)
  39. {
  40. args.push_back(av[j]);
  41. }
  42. cmSystemTools::DisableRunCommandOutput();
  43. std::cout << "Would you like to see advanced options? [No]:";
  44. char buffer[4096];
  45. buffer[0] = 0;
  46. std::cin.getline(buffer, sizeof(buffer));
  47. if(buffer[0])
  48. {
  49. if(buffer[0] == 'y' || buffer[0] == 'Y')
  50. {
  51. advanced = true;
  52. }
  53. }
  54. cmake make;
  55. cmCacheManager::CacheEntryMap askedCache;
  56. bool asked = false;
  57. // continue asking questions until no new questions are asked
  58. do
  59. {
  60. asked = false;
  61. // run cmake
  62. std::cout << "Please wait while cmake processes CMakeLists.txt files....\n";
  63. make.Generate(args);
  64. std::cout << "\n";
  65. // load the cache from disk
  66. cmCacheManager::GetInstance()->
  67. LoadCache(cmSystemTools::GetCurrentWorkingDirectory().c_str());
  68. cmCacheManager::CacheEntryMap const& currentCache =
  69. cmCacheManager::GetInstance()->GetCacheMap();
  70. // iterate over all entries in the cache
  71. for(cmCacheManager::CacheEntryMap::const_iterator i = currentCache.begin();
  72. i != currentCache.end(); ++i)
  73. {
  74. std::string key = i->first;
  75. cmCacheManager::CacheEntry ce = i->second;
  76. if(ce.m_Type == cmCacheManager::INTERNAL
  77. || ce.m_Type == cmCacheManager::STATIC)
  78. {
  79. continue;
  80. }
  81. if(askedCache.count(key))
  82. {
  83. cmCacheManager::CacheEntry& e = askedCache.find(key)->second;
  84. if(e.m_Value != ce.m_Value)
  85. {
  86. Ask(key.c_str(), ce);
  87. asked = true;
  88. }
  89. }
  90. else
  91. {
  92. Ask(key.c_str(), ce);
  93. asked = true;
  94. }
  95. askedCache[key] = i->second;
  96. }
  97. cmCacheManager::GetInstance()->
  98. SaveCache(cmSystemTools::GetCurrentWorkingDirectory().c_str());
  99. }
  100. while(asked);
  101. std::cout << "CMake complete, run make to build project.\n";
  102. return 0;
  103. }