From 059b90a0b4760c3c0bb761870be2a0811f80ce70 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Sch=C3=BCrmann?= Date: Sun, 29 Aug 2021 23:05:38 +0200 Subject: CMakeDependentOption: Introduce policy CMP0127 for full Condition Syntax Fixes: #22303 --- Help/manual/cmake-policies.7.rst | 8 +++ Help/policy/CMP0127.rst | 32 ++++++++++++ Help/release/dev/cmake_dependent_option_policy.rst | 6 +++ Modules/CMakeDependentOption.cmake | 61 +++++++++++++++------- Source/cmPolicies.h | 5 +- .../Parentheses-CMP0127-NEW-stdout.txt | 1 + .../Parentheses-CMP0127-NEW.cmake | 9 ++++ .../Parentheses-CMP0127-WARN-stderr.txt | 9 ++++ .../Parentheses-CMP0127-WARN-stdout.txt | 2 + .../Parentheses-CMP0127-WARN.cmake | 9 ++++ .../Regex-CMP0127-NEW-stdout.txt | 1 + .../CMakeDependentOption/Regex-CMP0127-NEW.cmake | 7 +++ .../Regex-CMP0127-OLD-stdout.txt | 1 + .../CMakeDependentOption/Regex-CMP0127-OLD.cmake | 7 +++ .../RunCMake/CMakeDependentOption/Regex-stdout.txt | 1 - Tests/RunCMake/CMakeDependentOption/Regex.cmake | 5 -- .../CMakeDependentOption/RunCMakeTest.cmake | 5 +- .../Simple-CMP0127-OLD-stdout.txt | 1 + .../CMakeDependentOption/Simple-CMP0127-OLD.cmake | 6 +++ 19 files changed, 149 insertions(+), 27 deletions(-) create mode 100644 Help/policy/CMP0127.rst create mode 100644 Help/release/dev/cmake_dependent_option_policy.rst create mode 100644 Tests/RunCMake/CMakeDependentOption/Parentheses-CMP0127-NEW-stdout.txt create mode 100644 Tests/RunCMake/CMakeDependentOption/Parentheses-CMP0127-NEW.cmake create mode 100644 Tests/RunCMake/CMakeDependentOption/Parentheses-CMP0127-WARN-stderr.txt create mode 100644 Tests/RunCMake/CMakeDependentOption/Parentheses-CMP0127-WARN-stdout.txt create mode 100644 Tests/RunCMake/CMakeDependentOption/Parentheses-CMP0127-WARN.cmake create mode 100644 Tests/RunCMake/CMakeDependentOption/Regex-CMP0127-NEW-stdout.txt create mode 100644 Tests/RunCMake/CMakeDependentOption/Regex-CMP0127-NEW.cmake create mode 100644 Tests/RunCMake/CMakeDependentOption/Regex-CMP0127-OLD-stdout.txt create mode 100644 Tests/RunCMake/CMakeDependentOption/Regex-CMP0127-OLD.cmake delete mode 100644 Tests/RunCMake/CMakeDependentOption/Regex-stdout.txt delete mode 100644 Tests/RunCMake/CMakeDependentOption/Regex.cmake create mode 100644 Tests/RunCMake/CMakeDependentOption/Simple-CMP0127-OLD-stdout.txt create mode 100644 Tests/RunCMake/CMakeDependentOption/Simple-CMP0127-OLD.cmake diff --git a/Help/manual/cmake-policies.7.rst b/Help/manual/cmake-policies.7.rst index b9e3d45..0f0c0ab 100644 --- a/Help/manual/cmake-policies.7.rst +++ b/Help/manual/cmake-policies.7.rst @@ -51,6 +51,14 @@ The :variable:`CMAKE_MINIMUM_REQUIRED_VERSION` variable may also be used to determine whether to report an error on use of deprecated macros or functions. +Policies Introduced by CMake 3.22 +================================= + +.. toctree:: + :maxdepth: 1 + + CMP0127: cmake_dependent_option() supports full Condition Syntax. + Policies Introduced by CMake 3.21 ================================= diff --git a/Help/policy/CMP0127.rst b/Help/policy/CMP0127.rst new file mode 100644 index 0000000..8560bbf --- /dev/null +++ b/Help/policy/CMP0127.rst @@ -0,0 +1,32 @@ +CMP0127 +------- + +:command:`cmake_dependent_option` supports full :ref:`Condition Syntax`. + +The ```` parameter accepts a :ref:`semicolon-separated list ` of conditions. CMake 3.21 and lower evaluates each +``condition`` as ``if(${condition})``, which does not properly handle +conditions with nested paren groups. CMake 3.22 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 ``CMP0127`` provides compatibility for projects that have not +been updated to expect the new behavior. + +This policy was introduced in CMake version 3.22. CMake version +|release| warns when the policy is not set and uses ``OLD`` behavior. +Use the :command:`cmake_policy` command to set it to ``OLD`` or ``NEW`` +explicitly. + +.. include:: DEPRECATED.txt diff --git a/Help/release/dev/cmake_dependent_option_policy.rst b/Help/release/dev/cmake_dependent_option_policy.rst new file mode 100644 index 0000000..c131170 --- /dev/null +++ b/Help/release/dev/cmake_dependent_option_policy.rst @@ -0,0 +1,6 @@ +cmake_dependent_option_policy +----------------------------- + +* The :module:`CMakeDependentOption` module :command:`cmake_dependent_option` + macro now supports full :ref:`Condition Syntax`. + See policy :policy:`CMP0127`. diff --git a/Modules/CMakeDependentOption.cmake b/Modules/CMakeDependentOption.cmake index 96855d2..b7c478f 100644 --- a/Modules/CMakeDependentOption.cmake +++ b/Modules/CMakeDependentOption.cmake @@ -10,44 +10,62 @@ Macro to provide an option dependent on other options. This macro presents an option to the user only if a set of other conditions are true. -Usage: +.. command:: cmake_dependent_option -.. code-block:: cmake + .. code-block:: cmake - cmake_dependent_option(