From 6a7d5e414d07a1d511b66432626a7f2e884edf34 Mon Sep 17 00:00:00 2001 From: Peter Kokot Date: Tue, 26 Nov 2024 02:16:43 +0100 Subject: [PATCH] FeatureSummary: Introduce policy CMP0183 for full Condition Syntax Closes: #26468 --- Help/manual/cmake-policies.7.rst | 1 + Help/policy/CMP0183.rst | 33 +++++++++++++++ Help/release/dev/add_feature_info.rst | 6 +++ Modules/FeatureSummary.cmake | 40 +++++++++++++++---- Source/cmPolicies.h | 5 ++- ...eSummaryParentheses-CMP0183-NEW-stdout.txt | 3 ++ ...eatureSummaryParentheses-CMP0183-NEW.cmake | 11 +++++ ...SummaryParentheses-CMP0183-WARN-stderr.txt | 9 +++++ ...SummaryParentheses-CMP0183-WARN-stdout.txt | 7 ++++ ...atureSummaryParentheses-CMP0183-WARN.cmake | 10 +++++ ...FeatureSummaryRegex-CMP0183-NEW-stdout.txt | 3 ++ .../FeatureSummaryRegex-CMP0183-NEW.cmake | 8 ++++ ...FeatureSummaryRegex-CMP0183-OLD-stdout.txt | 3 ++ .../FeatureSummaryRegex-CMP0183-OLD.cmake | 8 ++++ .../FeatureSummary/RunCMakeTest.cmake | 4 ++ 15 files changed, 142 insertions(+), 9 deletions(-) create mode 100644 Help/policy/CMP0183.rst create mode 100644 Help/release/dev/add_feature_info.rst create mode 100644 Tests/RunCMake/FeatureSummary/FeatureSummaryParentheses-CMP0183-NEW-stdout.txt create mode 100644 Tests/RunCMake/FeatureSummary/FeatureSummaryParentheses-CMP0183-NEW.cmake create mode 100644 Tests/RunCMake/FeatureSummary/FeatureSummaryParentheses-CMP0183-WARN-stderr.txt create mode 100644 Tests/RunCMake/FeatureSummary/FeatureSummaryParentheses-CMP0183-WARN-stdout.txt create mode 100644 Tests/RunCMake/FeatureSummary/FeatureSummaryParentheses-CMP0183-WARN.cmake create mode 100644 Tests/RunCMake/FeatureSummary/FeatureSummaryRegex-CMP0183-NEW-stdout.txt create mode 100644 Tests/RunCMake/FeatureSummary/FeatureSummaryRegex-CMP0183-NEW.cmake create mode 100644 Tests/RunCMake/FeatureSummary/FeatureSummaryRegex-CMP0183-OLD-stdout.txt create mode 100644 Tests/RunCMake/FeatureSummary/FeatureSummaryRegex-CMP0183-OLD.cmake diff --git a/Help/manual/cmake-policies.7.rst b/Help/manual/cmake-policies.7.rst index 92f59ff88b..216f17adcb 100644 --- a/Help/manual/cmake-policies.7.rst +++ b/Help/manual/cmake-policies.7.rst @@ -57,6 +57,7 @@ Policies Introduced by CMake 3.32 .. toctree:: :maxdepth: 1 + CMP0183: add_feature_info() supports full Condition Syntax. CMP0182: Create shared library archives by default on AIX. CMP0181: Link command-line fragment variables are parsed and re-quoted. diff --git a/Help/policy/CMP0183.rst b/Help/policy/CMP0183.rst new file mode 100644 index 0000000000..5c00cc185b --- /dev/null +++ b/Help/policy/CMP0183.rst @@ -0,0 +1,33 @@ +CMP0183 +------- + +.. versionadded:: 3.32 + +:command:`add_feature_info` supports full :ref:`Condition Syntax`. + +The ```` parameter accepts a :ref:`semicolon-separated list ` of conditions. CMake 3.31 and lower evaluate each +``condition`` as ``if(${condition})``, which does not properly handle +conditions with nested paren groups. CMake 3.32 and above instead prefer +to evaluate each ``condition`` as ``if()``, where ```` +is re-parsed as if literally written in a call to :command:`if`. This +allows expressions like:: + + "A AND (B OR C)" + +but requires expressions like:: + + "FOO MATCHES (UPPER|lower)" + +to be re-written as:: + + "FOO MATCHES \"(UPPER|lower)\"" + +Policy ``CMP0183`` provides compatibility for projects that have not +been updated to expect the new behavior. + +.. |INTRODUCED_IN_CMAKE_VERSION| replace:: 3.32 +.. |WARNS_OR_DOES_NOT_WARN| replace:: warns +.. include:: STANDARD_ADVICE.txt + +.. include:: DEPRECATED.txt diff --git a/Help/release/dev/add_feature_info.rst b/Help/release/dev/add_feature_info.rst new file mode 100644 index 0000000000..776d804522 --- /dev/null +++ b/Help/release/dev/add_feature_info.rst @@ -0,0 +1,6 @@ +add_feature_info +---------------- + +* The :module:`FeatureSummary` module :command:`add_feature_info` + command now supports full :ref:`Condition Syntax`. + See policy :policy:`CMP0183`. diff --git a/Modules/FeatureSummary.cmake b/Modules/FeatureSummary.cmake index 009ca38955..f7285544d2 100644 --- a/Modules/FeatureSummary.cmake +++ b/Modules/FeatureSummary.cmake @@ -627,6 +627,10 @@ endfunction() .. versionchanged:: 3.8 ```` can be a list of conditions. + .. versionchanged:: 3.32 + Full :ref:`Condition Syntax` is now supported for ````. + See policy :policy:`CMP0183`. + Example for setting the info for a feature: .. code-block:: cmake @@ -635,15 +639,29 @@ endfunction() add_feature_info(Foo WITH_FOO "The Foo feature provides very cool stuff.") #]=======================================================================] function(ADD_FEATURE_INFO _name _depends _desc) + cmake_policy(GET CMP0183 _CDO_CMP0183 + PARENT_SCOPE # undocumented, do not use outside of CMake + ) set(_enabled 1) - foreach(_d ${_depends}) - string(REGEX REPLACE " +" ";" _d "${_d}") - if(${_d}) - else() - set(_enabled 0) - break() - endif() - endforeach() + if("x${_CDO_CMP0183}x" STREQUAL "xNEWx") + foreach(_d ${_depends}) + cmake_language(EVAL CODE " + if(${_d}) + else() + set(_enabled 0) + endif()" + ) + endforeach() + else() + foreach(_d ${_depends}) + string(REGEX REPLACE " +" ";" _d "${_d}") + if(${_d}) + else() + set(_enabled 0) + break() + endif() + endforeach() + endif() if (${_enabled}) set_property(GLOBAL APPEND PROPERTY ENABLED_FEATURES "${_name}") else () @@ -651,6 +669,12 @@ function(ADD_FEATURE_INFO _name _depends _desc) endif () set_property(GLOBAL PROPERTY _CMAKE_${_name}_DESCRIPTION "${_desc}" ) + + if("x${_CDO_CMP0183}x" STREQUAL "xx" AND "x${_depends}x" MATCHES "[^A-Za-z0-9_.; ]") + cmake_policy(GET_WARNING CMP0183 _CDO_CMP0183_WARNING) + message(AUTHOR_WARNING "${_CDO_CMP0183_WARNING}") + endif() + unset(_CDO_CMP0183) endfunction() diff --git a/Source/cmPolicies.h b/Source/cmPolicies.h index f5e6a5bdbe..e70e159aef 100644 --- a/Source/cmPolicies.h +++ b/Source/cmPolicies.h @@ -550,7 +550,10 @@ class cmMakefile; "Link command-line fragment variables are parsed and re-quoted.", 3, \ 32, 0, WARN) \ SELECT(POLICY, CMP0182, \ - "Create shared library archives by default on AIX.", 3, 32, 0, WARN) + "Create shared library archives by default on AIX.", 3, 32, 0, WARN) \ + SELECT(POLICY, CMP0183, \ + "add_feature_info() supports full Condition Syntax.", 3, 32, 0, \ + WARN) #define CM_SELECT_ID(F, A1, A2, A3, A4, A5, A6) F(A1) #define CM_FOR_EACH_POLICY_ID(POLICY) \ diff --git a/Tests/RunCMake/FeatureSummary/FeatureSummaryParentheses-CMP0183-NEW-stdout.txt b/Tests/RunCMake/FeatureSummary/FeatureSummaryParentheses-CMP0183-NEW-stdout.txt new file mode 100644 index 0000000000..a18e8f7f6e --- /dev/null +++ b/Tests/RunCMake/FeatureSummary/FeatureSummaryParentheses-CMP0183-NEW-stdout.txt @@ -0,0 +1,3 @@ +-- The following features have been enabled: + + \* Foo, Foo\. diff --git a/Tests/RunCMake/FeatureSummary/FeatureSummaryParentheses-CMP0183-NEW.cmake b/Tests/RunCMake/FeatureSummary/FeatureSummaryParentheses-CMP0183-NEW.cmake new file mode 100644 index 0000000000..154d2c01bf --- /dev/null +++ b/Tests/RunCMake/FeatureSummary/FeatureSummaryParentheses-CMP0183-NEW.cmake @@ -0,0 +1,11 @@ +include(FeatureSummary) + +cmake_policy(SET CMP0183 NEW) + +set(WITH_FOO 1) +set(WITH_BAR 1) +set(WITH_BAZ 0) + +add_feature_info(Foo "WITH_FOO AND (WITH_BAR OR WITH_BAZ)" "Foo.") + +feature_summary(WHAT ALL) diff --git a/Tests/RunCMake/FeatureSummary/FeatureSummaryParentheses-CMP0183-WARN-stderr.txt b/Tests/RunCMake/FeatureSummary/FeatureSummaryParentheses-CMP0183-WARN-stderr.txt new file mode 100644 index 0000000000..efd7a4efb2 --- /dev/null +++ b/Tests/RunCMake/FeatureSummary/FeatureSummaryParentheses-CMP0183-WARN-stderr.txt @@ -0,0 +1,9 @@ +^CMake Warning \(dev\) at [^ +]*/Modules/FeatureSummary\.cmake:[0-9]+ \(message\): + Policy CMP0183 is not set: add_feature_info\(\) supports full Condition + Syntax\. Run "cmake --help-policy CMP0183" for policy details. Use the + cmake_policy command to set the policy and suppress this warning\. +Call Stack \(most recent call first\): + FeatureSummaryParentheses-CMP0183-WARN\.cmake:[0-9]+ \(add_feature_info\) + CMakeLists\.txt:[0-9]+ \(include\) +This warning is for project developers. Use -Wno-dev to suppress it.$ diff --git a/Tests/RunCMake/FeatureSummary/FeatureSummaryParentheses-CMP0183-WARN-stdout.txt b/Tests/RunCMake/FeatureSummary/FeatureSummaryParentheses-CMP0183-WARN-stdout.txt new file mode 100644 index 0000000000..2b4a5ed8fe --- /dev/null +++ b/Tests/RunCMake/FeatureSummary/FeatureSummaryParentheses-CMP0183-WARN-stdout.txt @@ -0,0 +1,7 @@ +-- The following features have been enabled: + + \* Bar, Bar\. + +-- The following features have been disabled: + + \* Foo, Foo\. diff --git a/Tests/RunCMake/FeatureSummary/FeatureSummaryParentheses-CMP0183-WARN.cmake b/Tests/RunCMake/FeatureSummary/FeatureSummaryParentheses-CMP0183-WARN.cmake new file mode 100644 index 0000000000..3fbd7d3e3d --- /dev/null +++ b/Tests/RunCMake/FeatureSummary/FeatureSummaryParentheses-CMP0183-WARN.cmake @@ -0,0 +1,10 @@ +include(FeatureSummary) + +set(WITH_FOO 1) +set(WITH_BAR 1) +set(WITH_BAZ 0) + +add_feature_info(Foo "WITH_FOO AND (WITH_BAR OR WITH_BAZ)" "Foo.") +add_feature_info(Bar "WITH_FOO;WITH_BAR" "Bar.") + +feature_summary(WHAT ALL) diff --git a/Tests/RunCMake/FeatureSummary/FeatureSummaryRegex-CMP0183-NEW-stdout.txt b/Tests/RunCMake/FeatureSummary/FeatureSummaryRegex-CMP0183-NEW-stdout.txt new file mode 100644 index 0000000000..a18e8f7f6e --- /dev/null +++ b/Tests/RunCMake/FeatureSummary/FeatureSummaryRegex-CMP0183-NEW-stdout.txt @@ -0,0 +1,3 @@ +-- The following features have been enabled: + + \* Foo, Foo\. diff --git a/Tests/RunCMake/FeatureSummary/FeatureSummaryRegex-CMP0183-NEW.cmake b/Tests/RunCMake/FeatureSummary/FeatureSummaryRegex-CMP0183-NEW.cmake new file mode 100644 index 0000000000..f60103ab98 --- /dev/null +++ b/Tests/RunCMake/FeatureSummary/FeatureSummaryRegex-CMP0183-NEW.cmake @@ -0,0 +1,8 @@ +include(FeatureSummary) + +cmake_policy(SET CMP0183 NEW) + +set(FOO "lower") +add_feature_info(Foo "FOO MATCHES \"(UPPER|lower)\"" "Foo.") + +feature_summary(WHAT ALL) diff --git a/Tests/RunCMake/FeatureSummary/FeatureSummaryRegex-CMP0183-OLD-stdout.txt b/Tests/RunCMake/FeatureSummary/FeatureSummaryRegex-CMP0183-OLD-stdout.txt new file mode 100644 index 0000000000..a18e8f7f6e --- /dev/null +++ b/Tests/RunCMake/FeatureSummary/FeatureSummaryRegex-CMP0183-OLD-stdout.txt @@ -0,0 +1,3 @@ +-- The following features have been enabled: + + \* Foo, Foo\. diff --git a/Tests/RunCMake/FeatureSummary/FeatureSummaryRegex-CMP0183-OLD.cmake b/Tests/RunCMake/FeatureSummary/FeatureSummaryRegex-CMP0183-OLD.cmake new file mode 100644 index 0000000000..590d202355 --- /dev/null +++ b/Tests/RunCMake/FeatureSummary/FeatureSummaryRegex-CMP0183-OLD.cmake @@ -0,0 +1,8 @@ +include(FeatureSummary) + +cmake_policy(SET CMP0183 OLD) + +set(FOO "lower") +add_feature_info(Foo "FOO MATCHES (UPPER|lower)" "Foo.") + +feature_summary(WHAT ALL) diff --git a/Tests/RunCMake/FeatureSummary/RunCMakeTest.cmake b/Tests/RunCMake/FeatureSummary/RunCMakeTest.cmake index c672c1640e..0a8d344a30 100644 --- a/Tests/RunCMake/FeatureSummary/RunCMakeTest.cmake +++ b/Tests/RunCMake/FeatureSummary/RunCMakeTest.cmake @@ -21,3 +21,7 @@ run_cmake(FeatureSummaryCustomRequired) run_cmake(FeatureSummaryCustomRequiredListA) run_cmake(FeatureSummaryCustomRequiredListB) run_cmake(FeatureSummaryCustomDescription) +run_cmake(FeatureSummaryParentheses-CMP0183-NEW) +run_cmake(FeatureSummaryParentheses-CMP0183-WARN) +run_cmake(FeatureSummaryRegex-CMP0183-NEW) +run_cmake(FeatureSummaryRegex-CMP0183-OLD)