mirror of
https://github.com/Kitware/CMake.git
synced 2026-05-07 22:59:56 -05:00
option: respect existing normal variable
Add policy CMP0077 to change this behavior in a compatible way.
This commit is contained in:
committed by
Brad King
parent
12e6f83319
commit
2a5f5c0e31
@@ -2,11 +2,16 @@
|
||||
file Copyright.txt or https://cmake.org/licensing for details. */
|
||||
#include "cmOptionCommand.h"
|
||||
|
||||
#include <sstream>
|
||||
|
||||
#include "cmAlgorithms.h"
|
||||
#include "cmMakefile.h"
|
||||
#include "cmPolicies.h"
|
||||
#include "cmState.h"
|
||||
#include "cmStateSnapshot.h"
|
||||
#include "cmStateTypes.h"
|
||||
#include "cmSystemTools.h"
|
||||
#include "cmake.h"
|
||||
|
||||
class cmExecutionStatus;
|
||||
|
||||
@@ -22,18 +27,47 @@ bool cmOptionCommand::InitialPass(std::vector<std::string> const& args,
|
||||
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
|
||||
// Determine the state of the option policy
|
||||
auto status = this->Makefile->GetPolicyStatus(cmPolicies::CMP0077);
|
||||
const char* exists =
|
||||
this->Makefile->GetStateSnapshot().GetDefinition(args[0]);
|
||||
switch (status) {
|
||||
case cmPolicies::WARN:
|
||||
if (exists) {
|
||||
std::ostringstream w;
|
||||
w << cmPolicies::GetPolicyWarning(cmPolicies::CMP0077)
|
||||
<< "\n"
|
||||
"For compatibility with older versions of CMake, option "
|
||||
"is clearing the normal variable '"
|
||||
<< args[0] << "'.";
|
||||
this->Makefile->IssueMessage(cmake::AUTHOR_WARNING, w.str());
|
||||
}
|
||||
case cmPolicies::OLD:
|
||||
// OLD behavior does not warn.
|
||||
break;
|
||||
case cmPolicies::REQUIRED_ALWAYS:
|
||||
case cmPolicies::REQUIRED_IF_USED:
|
||||
case cmPolicies::NEW: {
|
||||
// See if a local variable with this name already exists.
|
||||
// If so we ignore the option command.
|
||||
if (exists) {
|
||||
return true;
|
||||
}
|
||||
} break;
|
||||
}
|
||||
|
||||
// See if a cache variable with this name already exists
|
||||
// If so just make sure the doc state is correct
|
||||
cmState* state = this->Makefile->GetState();
|
||||
const char* existingValue = state->GetCacheEntryValue(args[0]);
|
||||
if (existingValue) {
|
||||
if (state->GetCacheEntryType(args[0]) != cmStateEnums::UNINITIALIZED) {
|
||||
state->SetCacheEntryProperty(args[0], "HELPSTRING", args[1]);
|
||||
return true;
|
||||
}
|
||||
initialValue = existingValue;
|
||||
if (existingValue &&
|
||||
(state->GetCacheEntryType(args[0]) != cmStateEnums::UNINITIALIZED)) {
|
||||
state->SetCacheEntryProperty(args[0], "HELPSTRING", args[1]);
|
||||
return true;
|
||||
}
|
||||
|
||||
// Nothing in the cache so add it
|
||||
std::string initialValue = existingValue ? existingValue : "Off";
|
||||
if (args.size() == 3) {
|
||||
initialValue = args[2];
|
||||
}
|
||||
|
||||
+3
-1
@@ -226,7 +226,9 @@ class cmMakefile;
|
||||
0, cmPolicies::WARN) \
|
||||
SELECT(POLICY, CMP0076, \
|
||||
"target_sources() command converts relative paths to absolute.", 3, \
|
||||
13, 0, cmPolicies::WARN)
|
||||
13, 0, cmPolicies::WARN) \
|
||||
SELECT(POLICY, CMP0077, "option() honors normal variables.", 3, 13, 0, \
|
||||
cmPolicies::WARN)
|
||||
|
||||
#define CM_SELECT_ID(F, A1, A2, A3, A4, A5, A6) F(A1)
|
||||
#define CM_FOR_EACH_POLICY_ID(POLICY) \
|
||||
|
||||
Reference in New Issue
Block a user