From dd3482f6752d09d55d5f12a2e8cdbe1624344cf4 Mon Sep 17 00:00:00 2001 From: Craig Scott Date: Sun, 27 Nov 2022 19:14:35 +1100 Subject: cmTargetPropCommandBase: Restore ArgumentFlags enum value bool logic The values of the cmTargetPropCommandBase::ArgumentFlags enum are combined in boolean OR and AND operations in various places. That used to be valid, but some values were added over time which did not preserve support for such boolean logic. Update the enum values such that they are increasing powers of 2 to restore that capability. Fixes: #24199 --- Source/cmTargetPropCommandBase.h | 4 ++-- Tests/RunCMake/target_compile_options/RunCMakeTest.cmake | 1 + Tests/RunCMake/target_compile_options/bad_keyword-result.txt | 1 + Tests/RunCMake/target_compile_options/bad_keyword-stderr.txt | 2 ++ Tests/RunCMake/target_compile_options/bad_keyword.cmake | 5 +++++ 5 files changed, 11 insertions(+), 2 deletions(-) create mode 100644 Tests/RunCMake/target_compile_options/bad_keyword-result.txt create mode 100644 Tests/RunCMake/target_compile_options/bad_keyword-stderr.txt create mode 100644 Tests/RunCMake/target_compile_options/bad_keyword.cmake diff --git a/Source/cmTargetPropCommandBase.h b/Source/cmTargetPropCommandBase.h index 6bf7c3c..487beb4 100644 --- a/Source/cmTargetPropCommandBase.h +++ b/Source/cmTargetPropCommandBase.h @@ -24,8 +24,8 @@ public: NO_FLAGS = 0x0, PROCESS_BEFORE = 0x1, PROCESS_AFTER = 0x2, - PROCESS_SYSTEM = 0x3, - PROCESS_REUSE_FROM = 0x4 + PROCESS_SYSTEM = 0x4, + PROCESS_REUSE_FROM = 0x8 }; bool HandleArguments(std::vector const& args, diff --git a/Tests/RunCMake/target_compile_options/RunCMakeTest.cmake b/Tests/RunCMake/target_compile_options/RunCMakeTest.cmake index f726759..d703839 100644 --- a/Tests/RunCMake/target_compile_options/RunCMakeTest.cmake +++ b/Tests/RunCMake/target_compile_options/RunCMakeTest.cmake @@ -1,6 +1,7 @@ include(RunCMake) run_cmake(empty_keyword_args) +run_cmake(bad_keyword) if (CMAKE_C_COMPILER_ID MATCHES "GNU|LCC|Clang") macro(run_cmake_target test subtest target) diff --git a/Tests/RunCMake/target_compile_options/bad_keyword-result.txt b/Tests/RunCMake/target_compile_options/bad_keyword-result.txt new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/Tests/RunCMake/target_compile_options/bad_keyword-result.txt @@ -0,0 +1 @@ +1 diff --git a/Tests/RunCMake/target_compile_options/bad_keyword-stderr.txt b/Tests/RunCMake/target_compile_options/bad_keyword-stderr.txt new file mode 100644 index 0000000..e22013e --- /dev/null +++ b/Tests/RunCMake/target_compile_options/bad_keyword-stderr.txt @@ -0,0 +1,2 @@ +CMake Error at bad_keyword\.cmake:[0-9]+ \(target_compile_options\): + target_compile_options called with invalid arguments diff --git a/Tests/RunCMake/target_compile_options/bad_keyword.cmake b/Tests/RunCMake/target_compile_options/bad_keyword.cmake new file mode 100644 index 0000000..b7e6fca --- /dev/null +++ b/Tests/RunCMake/target_compile_options/bad_keyword.cmake @@ -0,0 +1,5 @@ +add_library(iface INTERFACE) + +# SYSTEM is a recognized keyword for the base class used to implement the +# command. Verify that we don't allow it. +target_compile_options(iface SYSTEM PRIVATE) -- cgit v0.12 From ab5aeca849821afa8f0d2ac66a9f307f6b48ef4a Mon Sep 17 00:00:00 2001 From: Craig Scott Date: Sun, 27 Nov 2022 20:35:14 +1100 Subject: Help: Clarify behavior of BEFORE with target_compile_options() --- Help/command/target_compile_options.rst | 3 ++- Help/policy/CMP0101.rst | 24 ++++++++++++++++-------- 2 files changed, 18 insertions(+), 9 deletions(-) diff --git a/Help/command/target_compile_options.rst b/Help/command/target_compile_options.rst index 8f13f45..698f62d 100644 --- a/Help/command/target_compile_options.rst +++ b/Help/command/target_compile_options.rst @@ -19,7 +19,8 @@ Arguments ^^^^^^^^^ If ``BEFORE`` is specified, the content will be prepended to the property -instead of being appended. +instead of being appended. See policy :policy:`CMP0101` which affects +whether ``BEFORE`` will be ignored in certain cases. The ``INTERFACE``, ``PUBLIC`` and ``PRIVATE`` keywords are required to specify the :ref:`scope ` of the following arguments. diff --git a/Help/policy/CMP0101.rst b/Help/policy/CMP0101.rst index f02bccc..6781079 100644 --- a/Help/policy/CMP0101.rst +++ b/Help/policy/CMP0101.rst @@ -3,16 +3,24 @@ CMP0101 .. versionadded:: 3.17 -:command:`target_compile_options` now honors ``BEFORE`` keyword in all scopes. +:command:`target_compile_options` now always honors the ``BEFORE`` keyword. -In CMake 3.16 and below the :command:`target_compile_options` ignores the -``BEFORE`` keyword in private scope. CMake 3.17 and later honors -``BEFORE`` keyword in all scopes. This policy provides compatibility for -projects that have not been updated to expect the new behavior. +In CMake 3.16 and below, the :command:`target_compile_options` command +ignores the ``BEFORE`` keyword when inserting items into the +:prop_tgt:`COMPILE_OPTIONS` target property (``PRIVATE`` and ``PUBLIC`` +items). CMake 3.17 and later honors the ``BEFORE`` keyword in all cases. +This policy provides compatibility for projects that have not been updated +to expect the new behavior. -The ``OLD`` behavior for this policy is to not honor ``BEFORE`` keyword in -private scope. The ``NEW`` behavior of this policy is to honor -``BEFORE`` keyword in all scopes. +The behavior of inserting items into the :prop_tgt:`INTERFACE_COMPILE_OPTIONS` +target property (``PUBLIC`` and ``INTERFACE`` items) is not affected by this +policy. The ``BEFORE`` keyword has always been honored when adding items to +:prop_tgt:`INTERFACE_COMPILE_OPTIONS`. + +The ``OLD`` behavior for this policy is to not honor the ``BEFORE`` keyword +when inserting into the :prop_tgt:`COMPILE_OPTIONS` property. +The ``NEW`` behavior for this policy is to honor the ``BEFORE`` keyword in +all cases. This policy was introduced in CMake version 3.17. Use the :command:`cmake_policy` command to set it to ``OLD`` or ``NEW`` explicitly. -- cgit v0.12