diff options
author | Brad King <brad.king@kitware.com> | 2022-03-04 18:20:50 (GMT) |
---|---|---|
committer | Brad King <brad.king@kitware.com> | 2022-03-04 18:55:12 (GMT) |
commit | 30313aa72166ef06cde8c64ab1e582f8a242502e (patch) | |
tree | dce3c7dbe42dc55cd68912e8efe338f498dacb2e /Source/cmWhileCommand.cxx | |
parent | 8895284e115648ecfed020af2e55403341f3dd76 (diff) | |
download | CMake-30313aa72166ef06cde8c64ab1e582f8a242502e.zip CMake-30313aa72166ef06cde8c64ab1e582f8a242502e.tar.gz CMake-30313aa72166ef06cde8c64ab1e582f8a242502e.tar.bz2 |
while: diagnose errors during condition evaluation
Add a policy to diagnose condition errors in a compatible way.
Fixes: #23296
Diffstat (limited to 'Source/cmWhileCommand.cxx')
-rw-r--r-- | Source/cmWhileCommand.cxx | 33 |
1 files changed, 29 insertions, 4 deletions
diff --git a/Source/cmWhileCommand.cxx b/Source/cmWhileCommand.cxx index a93a81f..68d5a9a 100644 --- a/Source/cmWhileCommand.cxx +++ b/Source/cmWhileCommand.cxx @@ -17,6 +17,8 @@ #include "cmMakefile.h" #include "cmMessageType.h" #include "cmOutputConverter.h" +#include "cmPolicies.h" +#include "cmStringAlgorithms.h" #include "cmSystemTools.h" #include "cmake.h" @@ -79,9 +81,8 @@ bool cmWhileFunctionBlocker::Replay(std::vector<cmListFileFunction> functions, return out; }; - // FIXME(#23296): For compatibility with older versions of CMake, we - // tolerate condition errors that evaluate to false. We should add - // a policy to enforce such errors. + // For compatibility with projects that do not set CMP0130 to NEW, + // we tolerate condition errors that evaluate to false. bool enforceError = true; std::string errorString; MessageType messageType; @@ -110,14 +111,38 @@ bool cmWhileFunctionBlocker::Replay(std::vector<cmListFileFunction> functions, } } + if (!errorString.empty() && !enforceError) { + // This error should only be enforced if CMP0130 is NEW. + switch (mf.GetPolicyStatus(cmPolicies::CMP0130)) { + case cmPolicies::WARN: + // Convert the error to a warning and enforce it. + messageType = MessageType::AUTHOR_WARNING; + enforceError = true; + break; + case cmPolicies::OLD: + // OLD behavior is to silently ignore the error. + break; + case cmPolicies::REQUIRED_ALWAYS: + case cmPolicies::REQUIRED_IF_USED: + case cmPolicies::NEW: + // NEW behavior is to enforce the error. + enforceError = true; + break; + } + } + if (!errorString.empty() && enforceError) { - std::string err = "had incorrect arguments:\n "; + std::string err = "while() given incorrect arguments:\n "; for (auto const& i : expandedArguments) { err += " "; err += cmOutputConverter::EscapeForCMake(i.GetValue()); } err += "\n"; err += errorString; + if (mf.GetPolicyStatus(cmPolicies::CMP0130) == cmPolicies::WARN) { + err = + cmStrCat(cmPolicies::GetPolicyWarning(cmPolicies::CMP0130), '\n', err); + } mf.GetCMakeInstance()->IssueMessage(messageType, err, whileBT); if (messageType == MessageType::FATAL_ERROR) { cmSystemTools::SetFatalErrorOccured(); |