| /* Distributed under the OSI-approved BSD 3-Clause License. See accompanying |
| file Copyright.txt or https://cmake.org/licensing for details. */ |
| #include "cmMarkAsAdvancedCommand.h" |
| |
| #include "cmExecutionStatus.h" |
| #include "cmMakefile.h" |
| #include "cmMessageType.h" |
| #include "cmPolicies.h" |
| #include "cmState.h" |
| #include "cmStateTypes.h" |
| #include "cmStringAlgorithms.h" |
| #include "cmSystemTools.h" |
| #include "cmake.h" |
| |
| // cmMarkAsAdvancedCommand |
| bool cmMarkAsAdvancedCommand(std::vector<std::string> const& args, |
| cmExecutionStatus& status) |
| { |
| if (args.empty()) { |
| status.SetError("called with incorrect number of arguments"); |
| return false; |
| } |
| |
| unsigned int i = 0; |
| const char* value = "1"; |
| bool overwrite = false; |
| if (args[0] == "CLEAR" || args[0] == "FORCE") { |
| overwrite = true; |
| if (args[0] == "CLEAR") { |
| value = "0"; |
| } |
| i = 1; |
| } |
| |
| cmMakefile& mf = status.GetMakefile(); |
| cmState* state = mf.GetState(); |
| |
| for (; i < args.size(); ++i) { |
| std::string const& variable = args[i]; |
| |
| bool issueMessage = false; |
| bool oldBehavior = false; |
| bool ignoreVariable = false; |
| switch (mf.GetPolicyStatus(cmPolicies::CMP0102)) { |
| case cmPolicies::WARN: |
| if (mf.PolicyOptionalWarningEnabled("CMAKE_POLICY_WARNING_CMP0102")) { |
| if (!state->GetCacheEntryValue(variable)) { |
| issueMessage = true; |
| } |
| } |
| CM_FALLTHROUGH; |
| case cmPolicies::OLD: |
| oldBehavior = true; |
| break; |
| case cmPolicies::NEW: |
| case cmPolicies::REQUIRED_IF_USED: |
| case cmPolicies::REQUIRED_ALWAYS: |
| if (!state->GetCacheEntryValue(variable)) { |
| ignoreVariable = true; |
| } |
| break; |
| } |
| |
| // First see if we should issue a message about CMP0102 |
| if (issueMessage) { |
| std::string err = cmStrCat( |
| "Policy CMP0102 is not set: The variable named \"", variable, |
| "\" is not in the cache. This results in an empty cache entry which " |
| "is no longer created when policy CMP0102 is set to NEW. Run \"cmake " |
| "--help-policy CMP0102\" for policy details. Use the cmake_policy " |
| "command to set the policy and suppress this warning."); |
| mf.IssueMessage(MessageType::AUTHOR_WARNING, err); |
| } |
| |
| // If it's not in the cache and we're using the new behavior, nothing to |
| // see here. |
| if (ignoreVariable) { |
| continue; |
| } |
| |
| // Check if we want the old behavior of making a dummy cache entry. |
| if (oldBehavior) { |
| if (!state->GetCacheEntryValue(variable)) { |
| status.GetMakefile().GetCMakeInstance()->AddCacheEntry( |
| variable, nullptr, nullptr, cmStateEnums::UNINITIALIZED); |
| overwrite = true; |
| } |
| } |
| |
| // We need a cache entry to do this. |
| if (!state->GetCacheEntryValue(variable)) { |
| cmSystemTools::Error("This should never happen..."); |
| return false; |
| } |
| if (!state->GetCacheEntryProperty(variable, "ADVANCED") || overwrite) { |
| state->SetCacheEntryProperty(variable, "ADVANCED", value); |
| } |
| } |
| return true; |
| } |