/*============================================================================ CMake - Cross Platform Makefile Generator Copyright 2000-2009 Kitware, Inc., Insight Software Consortium Distributed under the OSI-approved BSD License (the "License"); see accompanying file Copyright.txt for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the License for more information. ============================================================================*/ #include "cmakewizard.h" #include "cmake.h" #include "cmCacheManager.h" cmakewizard::cmakewizard() { this->ShowAdvanced = false; } void cmakewizard::AskUser(const char* key, cmCacheManager::CacheIterator& iter) { printf("Variable Name: %s\n", key); const char* helpstring = iter.GetProperty("HELPSTRING"); printf("Description: %s\n", (helpstring?helpstring:"(none)")); printf("Current Value: %s\n", iter.GetValue()); printf("New Value (Enter to keep current value): "); char buffer[4096]; if(!fgets(buffer, static_cast(sizeof(buffer) - 1), stdin)) { buffer[0] = 0; } if(strlen(buffer) > 0) { std::string sbuffer = buffer; std::string::size_type pos = sbuffer.find_last_not_of(" \n\r\t"); std::string value = ""; if ( pos != std::string::npos ) { value = sbuffer.substr(0, pos+1); } if ( value.size() > 0 ) { if(iter.GetType() == cmCacheManager::PATH || iter.GetType() == cmCacheManager::FILEPATH) { cmSystemTools::ConvertToUnixSlashes(value); } if(iter.GetType() == cmCacheManager::BOOL) { if(!cmSystemTools::IsOn(value.c_str())) { value = "OFF"; } } iter.SetValue(value.c_str()); } } printf("\n"); } bool cmakewizard::AskAdvanced() { printf("Would you like to see advanced options? [No]:"); char buffer[4096]; if(!fgets(buffer, static_cast(sizeof(buffer) - 1), stdin)) { buffer[0] = 0; } if(buffer[0]) { if(buffer[0] == 'y' || buffer[0] == 'Y') { return true; } } return false; } void cmakewizard::ShowMessage(const char* m) { printf("%s\n", m); } int cmakewizard::RunWizard(std::vector const& args) { this->ShowAdvanced = this->AskAdvanced(); cmSystemTools::DisableRunCommandOutput(); cmake make; make.SetArgs(args); make.SetCMakeCommand(args[0].c_str()); make.LoadCache(); make.SetCacheArgs(args); std::map askedCache; bool asked = false; // continue asking questions until no new questions are asked do { asked = false; // run cmake this->ShowMessage( "Please wait while cmake processes CMakeLists.txt files....\n"); make.Configure(); this->ShowMessage("\n"); // load the cache from disk cmCacheManager *cachem = make.GetCacheManager(); cachem->LoadCache(make.GetHomeOutputDirectory()); cmCacheManager::CacheIterator i = cachem->NewIterator(); // iterate over all entries in the cache for(;!i.IsAtEnd(); i.Next()) { std::string key = i.GetName(); if( i.GetType() == cmCacheManager::INTERNAL || i.GetType() == cmCacheManager::STATIC || i.GetType() == cmCacheManager::UNINITIALIZED ) { continue; } if(askedCache.count(key)) { std::string& e = askedCache.find(key)->second; if(e != i.GetValue()) { if(this->ShowAdvanced || !i.GetPropertyAsBool("ADVANCED")) { this->AskUser(key.c_str(), i); asked = true; } } } else { if(this->ShowAdvanced || !i.GetPropertyAsBool("ADVANCED")) { this->AskUser(key.c_str(), i); asked = true; } } askedCache[key] = i.GetValue(); } cachem->SaveCache(make.GetHomeOutputDirectory()); } while(asked); if(make.Generate() == 0) { this->ShowMessage("CMake complete, run make to build project.\n"); return 0; } return 1; }