/*============================================================================ 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 "cmVariableRequiresCommand.h" #include "cmCacheManager.h" // cmLibraryCommand bool cmVariableRequiresCommand ::InitialPass(std::vectorconst& args, cmExecutionStatus &) { if(args.size() < 3 ) { this->SetError("called with incorrect number of arguments"); return false; } std::string testVariable = args[0]; if(!this->Makefile->IsOn(testVariable.c_str())) { return true; } std::string resultVariable = args[1]; bool requirementsMet = true; std::string notSet; bool hasAdvanced = false; for(unsigned int i = 2; i < args.size(); ++i) { if(!this->Makefile->IsOn(args[i].c_str())) { requirementsMet = false; notSet += args[i]; notSet += "\n"; cmCacheManager::CacheIterator it = this->Makefile->GetCacheManager()->GetCacheIterator(args[i].c_str()); if(!it.IsAtEnd() && it.GetPropertyAsBool("ADVANCED")) { hasAdvanced = true; } } } const char* reqVar = this->Makefile->GetDefinition(resultVariable.c_str()); // if reqVar is unset, then set it to requirementsMet // if reqVar is set to true, but requirementsMet is false , then // set reqVar to false. if(!reqVar || (!requirementsMet && this->Makefile->IsOn(reqVar))) { this->Makefile->AddDefinition(resultVariable.c_str(), requirementsMet); } if(!requirementsMet) { std::string message = "Variable assertion failed:\n"; message += testVariable + " Requires that the following unset variables are set:\n"; message += notSet; message += "\nPlease set them, or set "; message += testVariable + " to false, and re-configure.\n"; if(hasAdvanced) { message += "One or more of the required variables is advanced." " To set the variable, you must turn on advanced mode in cmake."; } cmSystemTools::Error(message.c_str()); } return true; }