CMake/Source/cmOptionCommand.cxx
Brad King ee2b446c95 Create CMake Policy CMP0015 to fix set(CACHE)
The set(CACHE) and option() commands should always expose the cache
value.  Previously we failed to expose the value when it was already set
if a local variable definition hid it.  When set to NEW, this policy
tells the commands to always remove the local variable definition to
expose the cache value.  See issue #9008.
2009-09-10 16:59:45 -04:00

77 lines
2.3 KiB
C++

/*=========================================================================
Program: CMake - Cross-Platform Makefile Generator
Module: $RCSfile$
Language: C++
Date: $Date$
Version: $Revision$
Copyright (c) 2002 Kitware, Inc., Insight Consortium. All rights reserved.
See Copyright.txt or http://www.cmake.org/HTML/Copyright.html for details.
This software is distributed WITHOUT ANY WARRANTY; without even
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the above copyright notices for more information.
=========================================================================*/
#include "cmOptionCommand.h"
// cmOptionCommand
bool cmOptionCommand
::InitialPass(std::vector<std::string> const& args, cmExecutionStatus &)
{
bool argError = false;
if(args.size() < 2)
{
argError = true;
}
// for VTK 4.0 we have to support the option command with more than 3
// arguments if CMAKE_MINIMUM_REQUIRED_VERSION is not defined, if
// CMAKE_MINIMUM_REQUIRED_VERSION is defined, then we can have stricter
// checking.
if(this->Makefile->GetDefinition("CMAKE_MINIMUM_REQUIRED_VERSION"))
{
if(args.size() > 3)
{
argError = true;
}
}
if(argError)
{
std::string m = "called with incorrect number of arguments: ";
for(size_t i =0; i < args.size(); ++i)
{
m += args[i];
m += " ";
}
this->SetError(m.c_str());
return false;
}
std::string initialValue = "Off";
// Now check and see if the value has been stored in the cache
// already, if so use that value and don't look for the program
cmCacheManager::CacheIterator it =
this->Makefile->GetCacheManager()->GetCacheIterator(args[0].c_str());
if(!it.IsAtEnd())
{
if ( it.GetType() != cmCacheManager::UNINITIALIZED )
{
it.SetProperty("HELPSTRING", args[1].c_str());
this->Makefile->UseCacheDefinition(it);
return true;
}
if ( it.GetValue() )
{
initialValue = it.GetValue();
}
}
if(args.size() == 3)
{
initialValue = args[2];
}
this->Makefile->AddCacheDefinition(args[0].c_str(), initialValue.c_str(),
args[1].c_str(), cmCacheManager::BOOL);
return true;
}