From 33856b1d62e5311f456c458295ccc900eb9a38f0 Mon Sep 17 00:00:00 2001 From: Brad King Date: Thu, 20 Feb 2025 16:30:51 -0500 Subject: Add CMAKE_POLICY_VERSION_MINIMUM environment variable Extend commit 1a35351125 (Add CMAKE_POLICY_VERSION_MINIMUM to help configure outdated projects, 2025-02-13, v4.0.0-rc1~12^2) with an environment variable to initialize the cache entry. That will make it easier to use when `cmake` is invoked under layers of scripting. Closes: #26715 --- Help/envvar/CMAKE_POLICY_VERSION_MINIMUM.rst | 11 +++++++++++ Help/manual/cmake-env-variables.7.rst | 1 + Help/release/4.0.rst | 2 ++ Help/variable/CMAKE_POLICY_VERSION_MINIMUM.rst | 4 ++++ Source/cmake.cxx | 15 +++++++++++++++ Tests/EnforceConfig.cmake.in | 1 + .../cmake_minimum_required/PolicyVersionEnvVar-stderr.txt | 4 ++++ .../cmake_minimum_required/PolicyVersionEnvVar.cmake | 1 + .../PolicyVersionEnvVarBad-result.txt | 1 + .../PolicyVersionEnvVarBad-stderr.txt | 10 ++++++++++ .../cmake_minimum_required/PolicyVersionEnvVarBad.cmake | 1 + .../PolicyVersionEnvVarBadCache-result.txt | 1 + .../PolicyVersionEnvVarBadCache-stderr.txt | 9 +++++++++ .../PolicyVersionEnvVarBadCache.cmake | 0 .../PolicyVersionEnvVarBadScript-result.txt | 1 + .../PolicyVersionEnvVarBadScript-stderr.txt | 7 +++++++ .../PolicyVersionEnvVarBadScript.cmake | 1 + .../PolicyVersionEnvVarCache-stderr.txt | 4 ++++ .../cmake_minimum_required/PolicyVersionEnvVarCache.cmake | 0 .../PolicyVersionEnvVarScript-stderr.txt | 4 ++++ .../PolicyVersionEnvVarScript.cmake | 1 + Tests/RunCMake/cmake_minimum_required/RunCMakeTest.cmake | 10 ++++++++++ 22 files changed, 89 insertions(+) create mode 100644 Help/envvar/CMAKE_POLICY_VERSION_MINIMUM.rst create mode 100644 Tests/RunCMake/cmake_minimum_required/PolicyVersionEnvVar-stderr.txt create mode 100644 Tests/RunCMake/cmake_minimum_required/PolicyVersionEnvVar.cmake create mode 100644 Tests/RunCMake/cmake_minimum_required/PolicyVersionEnvVarBad-result.txt create mode 100644 Tests/RunCMake/cmake_minimum_required/PolicyVersionEnvVarBad-stderr.txt create mode 100644 Tests/RunCMake/cmake_minimum_required/PolicyVersionEnvVarBad.cmake create mode 100644 Tests/RunCMake/cmake_minimum_required/PolicyVersionEnvVarBadCache-result.txt create mode 100644 Tests/RunCMake/cmake_minimum_required/PolicyVersionEnvVarBadCache-stderr.txt create mode 100644 Tests/RunCMake/cmake_minimum_required/PolicyVersionEnvVarBadCache.cmake create mode 100644 Tests/RunCMake/cmake_minimum_required/PolicyVersionEnvVarBadScript-result.txt create mode 100644 Tests/RunCMake/cmake_minimum_required/PolicyVersionEnvVarBadScript-stderr.txt create mode 100644 Tests/RunCMake/cmake_minimum_required/PolicyVersionEnvVarBadScript.cmake create mode 100644 Tests/RunCMake/cmake_minimum_required/PolicyVersionEnvVarCache-stderr.txt create mode 100644 Tests/RunCMake/cmake_minimum_required/PolicyVersionEnvVarCache.cmake create mode 100644 Tests/RunCMake/cmake_minimum_required/PolicyVersionEnvVarScript-stderr.txt create mode 100644 Tests/RunCMake/cmake_minimum_required/PolicyVersionEnvVarScript.cmake diff --git a/Help/envvar/CMAKE_POLICY_VERSION_MINIMUM.rst b/Help/envvar/CMAKE_POLICY_VERSION_MINIMUM.rst new file mode 100644 index 0000000..0521f5c --- /dev/null +++ b/Help/envvar/CMAKE_POLICY_VERSION_MINIMUM.rst @@ -0,0 +1,11 @@ +CMAKE_POLICY_VERSION_MINIMUM +---------------------------- + +.. versionadded:: 4.0 + +.. include:: ENV_VAR.txt + +The default value for :variable:`CMAKE_POLICY_VERSION_MINIMUM` when there +is no explicit configuration given on the first run while creating a new +build tree. On later runs in an existing build tree the value persists in +the cache as :variable:`CMAKE_POLICY_VERSION_MINIMUM`. diff --git a/Help/manual/cmake-env-variables.7.rst b/Help/manual/cmake-env-variables.7.rst index 140fc83..198e71f 100644 --- a/Help/manual/cmake-env-variables.7.rst +++ b/Help/manual/cmake-env-variables.7.rst @@ -27,6 +27,7 @@ Environment Variables that Change Behavior /envvar/CMAKE_INCLUDE_PATH /envvar/CMAKE_LIBRARY_PATH /envvar/CMAKE_MAXIMUM_RECURSION_DEPTH + /envvar/CMAKE_POLICY_VERSION_MINIMUM /envvar/CMAKE_PREFIX_PATH /envvar/CMAKE_PROGRAM_PATH /envvar/CMAKE_TLS_VERIFY diff --git a/Help/release/4.0.rst b/Help/release/4.0.rst index a7a7860..9122798 100644 --- a/Help/release/4.0.rst +++ b/Help/release/4.0.rst @@ -75,6 +75,8 @@ Variables * The :variable:`CMAKE_POLICY_VERSION_MINIMUM` variable was added to help packagers and end users try to configure existing projects that have not been updated to work with supported CMake versions. + The :envvar:`CMAKE_POLICY_VERSION_MINIMUM` environment variable was + added to initialize it. * The :variable:`CMAKE_XCODE_SCHEME_LLDB_INIT_FILE` variable and corresponding :prop_tgt:`XCODE_SCHEME_LLDB_INIT_FILE` target property were added to tell diff --git a/Help/variable/CMAKE_POLICY_VERSION_MINIMUM.rst b/Help/variable/CMAKE_POLICY_VERSION_MINIMUM.rst index cf48ecf..d1fa143 100644 --- a/Help/variable/CMAKE_POLICY_VERSION_MINIMUM.rst +++ b/Help/variable/CMAKE_POLICY_VERSION_MINIMUM.rst @@ -16,6 +16,10 @@ to externally set policies for which a project has not itself been updated: ``-DCMAKE_POLICY_VERSION_MINIMUM=3.5``, to try configuring a project that has not been updated to set at least that policy version itself. + Alternatively, users may set the :envvar:`CMAKE_POLICY_VERSION_MINIMUM` + environment variable to initialize the cache entry in new build trees + automatically. + * Projects may set this variable before a call to :command:`add_subdirectory` that adds a third-party project in order to set its policy version without modifying third-party code. diff --git a/Source/cmake.cxx b/Source/cmake.cxx index 0bee1cc..934f635 100644 --- a/Source/cmake.cxx +++ b/Source/cmake.cxx @@ -547,6 +547,21 @@ void cmake::PrintPresetEnvironment() // Parse the args bool cmake::SetCacheArgs(std::vector const& args) { + static std::string const kCMAKE_POLICY_VERSION_MINIMUM = + "CMAKE_POLICY_VERSION_MINIMUM"; + if (!this->State->GetInitializedCacheValue(kCMAKE_POLICY_VERSION_MINIMUM)) { + cm::optional policyVersion = + cmSystemTools::GetEnvVar(kCMAKE_POLICY_VERSION_MINIMUM); + if (policyVersion && !policyVersion->empty()) { + this->AddCacheEntry( + kCMAKE_POLICY_VERSION_MINIMUM, *policyVersion, + "Override policy version for cmake_minimum_required calls.", + cmStateEnums::STRING); + this->State->SetCacheEntryProperty(kCMAKE_POLICY_VERSION_MINIMUM, + "ADVANCED", "1"); + } + } + auto DefineLambda = [](std::string const& entry, cmake* state) -> bool { std::string var; std::string value; diff --git a/Tests/EnforceConfig.cmake.in b/Tests/EnforceConfig.cmake.in index fd785a5..f9f476d 100644 --- a/Tests/EnforceConfig.cmake.in +++ b/Tests/EnforceConfig.cmake.in @@ -36,6 +36,7 @@ unset(ENV{CMAKE_GENERATOR_INSTANCE}) unset(ENV{CMAKE_GENERATOR_PLATFORM}) unset(ENV{CMAKE_GENERATOR_TOOLSET}) unset(ENV{CMAKE_EXPORT_COMPILE_COMMANDS}) +unset(ENV{CMAKE_POLICY_VERSION_MINIMUM}) # Verify that our module implementations do not recurse too much. set(ENV{CMAKE_MAXIMUM_RECURSION_DEPTH} 100) diff --git a/Tests/RunCMake/cmake_minimum_required/PolicyVersionEnvVar-stderr.txt b/Tests/RunCMake/cmake_minimum_required/PolicyVersionEnvVar-stderr.txt new file mode 100644 index 0000000..75d5a7e --- /dev/null +++ b/Tests/RunCMake/cmake_minimum_required/PolicyVersionEnvVar-stderr.txt @@ -0,0 +1,4 @@ +^CMAKE_POLICY_VERSION_MINIMUM='3\.10' +CMAKE_MINIMUM_REQUIRED_VERSION='3\.1' +CMP0071='NEW' +CMP0072=''$ diff --git a/Tests/RunCMake/cmake_minimum_required/PolicyVersionEnvVar.cmake b/Tests/RunCMake/cmake_minimum_required/PolicyVersionEnvVar.cmake new file mode 100644 index 0000000..e158354 --- /dev/null +++ b/Tests/RunCMake/cmake_minimum_required/PolicyVersionEnvVar.cmake @@ -0,0 +1 @@ +include(${CMAKE_CURRENT_LIST_DIR}/PolicyVersionVar.cmake) diff --git a/Tests/RunCMake/cmake_minimum_required/PolicyVersionEnvVarBad-result.txt b/Tests/RunCMake/cmake_minimum_required/PolicyVersionEnvVarBad-result.txt new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/Tests/RunCMake/cmake_minimum_required/PolicyVersionEnvVarBad-result.txt @@ -0,0 +1 @@ +1 diff --git a/Tests/RunCMake/cmake_minimum_required/PolicyVersionEnvVarBad-stderr.txt b/Tests/RunCMake/cmake_minimum_required/PolicyVersionEnvVarBad-stderr.txt new file mode 100644 index 0000000..1ddab39 --- /dev/null +++ b/Tests/RunCMake/cmake_minimum_required/PolicyVersionEnvVarBad-stderr.txt @@ -0,0 +1,10 @@ +^CMake Error at CMakeLists\.txt:1 \(cmake_minimum_required\): + Invalid CMAKE_POLICY_VERSION_MINIMUM value "\.\.\.3\.10"\. A numeric + major\.minor\[\.patch\[\.tweak\]\] must be given\. ++ +CMake Error at PolicyVersionVarBad\.cmake:1 \(cmake_minimum_required\): + Invalid CMAKE_POLICY_VERSION_MINIMUM value "\.\.\.3\.10"\. A numeric + major\.minor\[\.patch\[\.tweak\]\] must be given\. +Call Stack \(most recent call first\): + PolicyVersionEnvVarBad\.cmake:[0-9]+ \(include\) + CMakeLists\.txt:[0-9]+ \(include\)$ diff --git a/Tests/RunCMake/cmake_minimum_required/PolicyVersionEnvVarBad.cmake b/Tests/RunCMake/cmake_minimum_required/PolicyVersionEnvVarBad.cmake new file mode 100644 index 0000000..8ae5e2a --- /dev/null +++ b/Tests/RunCMake/cmake_minimum_required/PolicyVersionEnvVarBad.cmake @@ -0,0 +1 @@ +include(${CMAKE_CURRENT_LIST_DIR}/PolicyVersionVarBad.cmake) diff --git a/Tests/RunCMake/cmake_minimum_required/PolicyVersionEnvVarBadCache-result.txt b/Tests/RunCMake/cmake_minimum_required/PolicyVersionEnvVarBadCache-result.txt new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/Tests/RunCMake/cmake_minimum_required/PolicyVersionEnvVarBadCache-result.txt @@ -0,0 +1 @@ +1 diff --git a/Tests/RunCMake/cmake_minimum_required/PolicyVersionEnvVarBadCache-stderr.txt b/Tests/RunCMake/cmake_minimum_required/PolicyVersionEnvVarBadCache-stderr.txt new file mode 100644 index 0000000..cb46948 --- /dev/null +++ b/Tests/RunCMake/cmake_minimum_required/PolicyVersionEnvVarBadCache-stderr.txt @@ -0,0 +1,9 @@ +^CMake Error at PolicyVersionVarBad\.cmake:1 \(cmake_minimum_required\): + Invalid CMAKE_POLICY_VERSION_MINIMUM value "\.\.\.3\.10"\. A numeric + major\.minor\[\.patch\[\.tweak\]\] must be given\. +Call Stack \(most recent call first\): + PolicyVersionEnvVarBad\.cmake:[0-9]+ \(include\) ++ +CMake Error at CMakeLists\.txt:1 \(cmake_minimum_required\): + Invalid CMAKE_POLICY_VERSION_MINIMUM value "\.\.\.3\.10"\. A numeric + major\.minor\[\.patch\[\.tweak\]\] must be given\.$ diff --git a/Tests/RunCMake/cmake_minimum_required/PolicyVersionEnvVarBadCache.cmake b/Tests/RunCMake/cmake_minimum_required/PolicyVersionEnvVarBadCache.cmake new file mode 100644 index 0000000..e69de29 diff --git a/Tests/RunCMake/cmake_minimum_required/PolicyVersionEnvVarBadScript-result.txt b/Tests/RunCMake/cmake_minimum_required/PolicyVersionEnvVarBadScript-result.txt new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/Tests/RunCMake/cmake_minimum_required/PolicyVersionEnvVarBadScript-result.txt @@ -0,0 +1 @@ +1 diff --git a/Tests/RunCMake/cmake_minimum_required/PolicyVersionEnvVarBadScript-stderr.txt b/Tests/RunCMake/cmake_minimum_required/PolicyVersionEnvVarBadScript-stderr.txt new file mode 100644 index 0000000..b808e08 --- /dev/null +++ b/Tests/RunCMake/cmake_minimum_required/PolicyVersionEnvVarBadScript-stderr.txt @@ -0,0 +1,7 @@ +^CMake Error at [^ +]*/PolicyVersionVarBad\.cmake:1 \(cmake_minimum_required\): + Invalid CMAKE_POLICY_VERSION_MINIMUM value "\.\.\.3\.10"\. A numeric + major\.minor\[\.patch\[\.tweak\]\] must be given\. +Call Stack \(most recent call first\): + [^ +]*/PolicyVersionEnvVarBadScript\.cmake:[0-9]+ \(include\)$ diff --git a/Tests/RunCMake/cmake_minimum_required/PolicyVersionEnvVarBadScript.cmake b/Tests/RunCMake/cmake_minimum_required/PolicyVersionEnvVarBadScript.cmake new file mode 100644 index 0000000..8ae5e2a --- /dev/null +++ b/Tests/RunCMake/cmake_minimum_required/PolicyVersionEnvVarBadScript.cmake @@ -0,0 +1 @@ +include(${CMAKE_CURRENT_LIST_DIR}/PolicyVersionVarBad.cmake) diff --git a/Tests/RunCMake/cmake_minimum_required/PolicyVersionEnvVarCache-stderr.txt b/Tests/RunCMake/cmake_minimum_required/PolicyVersionEnvVarCache-stderr.txt new file mode 100644 index 0000000..75d5a7e --- /dev/null +++ b/Tests/RunCMake/cmake_minimum_required/PolicyVersionEnvVarCache-stderr.txt @@ -0,0 +1,4 @@ +^CMAKE_POLICY_VERSION_MINIMUM='3\.10' +CMAKE_MINIMUM_REQUIRED_VERSION='3\.1' +CMP0071='NEW' +CMP0072=''$ diff --git a/Tests/RunCMake/cmake_minimum_required/PolicyVersionEnvVarCache.cmake b/Tests/RunCMake/cmake_minimum_required/PolicyVersionEnvVarCache.cmake new file mode 100644 index 0000000..e69de29 diff --git a/Tests/RunCMake/cmake_minimum_required/PolicyVersionEnvVarScript-stderr.txt b/Tests/RunCMake/cmake_minimum_required/PolicyVersionEnvVarScript-stderr.txt new file mode 100644 index 0000000..75d5a7e --- /dev/null +++ b/Tests/RunCMake/cmake_minimum_required/PolicyVersionEnvVarScript-stderr.txt @@ -0,0 +1,4 @@ +^CMAKE_POLICY_VERSION_MINIMUM='3\.10' +CMAKE_MINIMUM_REQUIRED_VERSION='3\.1' +CMP0071='NEW' +CMP0072=''$ diff --git a/Tests/RunCMake/cmake_minimum_required/PolicyVersionEnvVarScript.cmake b/Tests/RunCMake/cmake_minimum_required/PolicyVersionEnvVarScript.cmake new file mode 100644 index 0000000..e158354 --- /dev/null +++ b/Tests/RunCMake/cmake_minimum_required/PolicyVersionEnvVarScript.cmake @@ -0,0 +1 @@ +include(${CMAKE_CURRENT_LIST_DIR}/PolicyVersionVar.cmake) diff --git a/Tests/RunCMake/cmake_minimum_required/RunCMakeTest.cmake b/Tests/RunCMake/cmake_minimum_required/RunCMakeTest.cmake index b4cc911..8871447 100644 --- a/Tests/RunCMake/cmake_minimum_required/RunCMakeTest.cmake +++ b/Tests/RunCMake/cmake_minimum_required/RunCMakeTest.cmake @@ -14,3 +14,13 @@ run_cmake_script(PolicyVersionVarScript -DCMAKE_POLICY_VERSION_MINIMUM=3.10) run_cmake_with_options(PolicyVersionVarBad -DCMAKE_POLICY_VERSION_MINIMUM=...3.10) run_cmake_with_options(PolicyVersionVarBadCache -DCMAKE_POLICY_VERSION_MINIMUM=...3.10 -C ${CMAKE_CURRENT_LIST_DIR}/PolicyVersionVarBad.cmake) run_cmake_script(PolicyVersionVarBadScript -DCMAKE_POLICY_VERSION_MINIMUM=...3.10) + +set(ENV{CMAKE_POLICY_VERSION_MINIMUM} 3.10) +run_cmake(PolicyVersionEnvVar) +run_cmake_with_options(PolicyVersionEnvVarCache -C ${CMAKE_CURRENT_LIST_DIR}/PolicyVersionEnvVar.cmake) +run_cmake_script(PolicyVersionEnvVarScript) +set(ENV{CMAKE_POLICY_VERSION_MINIMUM} ...3.10) +run_cmake(PolicyVersionEnvVarBad) +run_cmake_with_options(PolicyVersionEnvVarBadCache -C ${CMAKE_CURRENT_LIST_DIR}/PolicyVersionEnvVarBad.cmake) +run_cmake_script(PolicyVersionEnvVarBadScript) +unset(ENV{CMAKE_POLICY_VERSION_MINIMUM}) -- cgit v0.12