cmakewizard.cxx 3.1 KB

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