mirror of
https://github.com/Kitware/CMake.git
synced 2026-05-02 20:29:49 -05:00
option: No CMP077 warnings when both cache and local variable exists
Previously we would warn when the local and cache version of a variable exists, but this use case doesn't need a warning as it maintains backwards compatibility.
This commit is contained in:
+36
-26
@@ -28,32 +28,28 @@ bool cmOptionCommand::InitialPass(std::vector<std::string> const& args,
|
||||
}
|
||||
|
||||
// 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;
|
||||
bool checkAndWarn = false;
|
||||
{
|
||||
auto status = this->Makefile->GetPolicyStatus(cmPolicies::CMP0077);
|
||||
const char* existsBeforeSet =
|
||||
this->Makefile->GetStateSnapshot().GetDefinition(args[0]);
|
||||
switch (status) {
|
||||
case cmPolicies::WARN:
|
||||
checkAndWarn = (existsBeforeSet != nullptr);
|
||||
break;
|
||||
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 (existsBeforeSet) {
|
||||
return true;
|
||||
}
|
||||
} break;
|
||||
}
|
||||
}
|
||||
|
||||
// See if a cache variable with this name already exists
|
||||
@@ -74,5 +70,19 @@ bool cmOptionCommand::InitialPass(std::vector<std::string> const& args,
|
||||
bool init = cmSystemTools::IsOn(initialValue.c_str());
|
||||
this->Makefile->AddCacheDefinition(args[0], init ? "ON" : "OFF",
|
||||
args[1].c_str(), cmStateEnums::BOOL);
|
||||
|
||||
if (checkAndWarn) {
|
||||
const char* existsAfterSet =
|
||||
this->Makefile->GetStateSnapshot().GetDefinition(args[0]);
|
||||
if (!existsAfterSet) {
|
||||
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());
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user