From c48d2d8480402a75e1509b19c145f004126dda10 Mon Sep 17 00:00:00 2001 From: Brad King Date: Thu, 3 Jun 2021 10:36:06 -0400 Subject: VS: Place per-source preprocessor definitions after target-wide ones When the VS 2010+ generators were first implemented in commit 7491f52992 (ENH: first pass at VS 10, can bootstrap CMake, but many tests still fail, 2009-06-25, v2.8.0~546), the per-source preprocessor definitions were placed before target-wide preprocessor definitions for consistency with the behavior of VS 9 2008 and below. However, those generators are not used much anymore. Instead prefer consistency with the order used by the Ninja and Makefile generators. --- Help/release/dev/compile-options-order.rst | 7 +++++++ Source/cmVisualStudioGeneratorOptions.cxx | 10 ++++------ 2 files changed, 11 insertions(+), 6 deletions(-) create mode 100644 Help/release/dev/compile-options-order.rst diff --git a/Help/release/dev/compile-options-order.rst b/Help/release/dev/compile-options-order.rst new file mode 100644 index 0000000..2e182cd --- /dev/null +++ b/Help/release/dev/compile-options-order.rst @@ -0,0 +1,7 @@ +compile-options-order +--------------------- + +* The :ref:`Visual Studio Generators` for VS 2010 and above now place + per-source preprocessor definitions after target-wide preprocssor + definitions. This makes VS consistent with the :ref:`Ninja Generators` + and the :ref:`Makefile Generators`. diff --git a/Source/cmVisualStudioGeneratorOptions.cxx b/Source/cmVisualStudioGeneratorOptions.cxx index 937b4ce..505d58a 100644 --- a/Source/cmVisualStudioGeneratorOptions.cxx +++ b/Source/cmVisualStudioGeneratorOptions.cxx @@ -418,7 +418,9 @@ void cmVisualStudioGeneratorOptions::OutputPreprocessorDefinitions( } std::ostringstream oss; - const char* sep = ""; + if (this->Version >= cmGlobalVisualStudioGenerator::VS10) { + oss << "%(" << tag << ")"; + } std::vector::const_iterator de = cmRemoveDuplicates(this->Defines); for (std::string const& di : cmMakeRange(this->Defines.cbegin(), de)) { @@ -437,11 +439,7 @@ void cmVisualStudioGeneratorOptions::OutputPreprocessorDefinitions( } } // Store the flag in the project file. - oss << sep << define; - sep = ";"; - } - if (this->Version >= cmGlobalVisualStudioGenerator::VS10) { - oss << ";%(" << tag << ")"; + oss << ';' << define; } this->OutputFlag(fout, indent, tag, oss.str()); -- cgit v0.12 From df79fe055b010131737517c0169e4c82db42482a Mon Sep 17 00:00:00 2001 From: Brad King Date: Thu, 3 Jun 2021 10:52:36 -0400 Subject: Help: Remove incorrect "versionadded" for CMAKE__FLAGS_ These variables have been around for a long time, but the current form of the document was added later. --- Help/variable/CMAKE_LANG_FLAGS_CONFIG.rst | 2 -- 1 file changed, 2 deletions(-) diff --git a/Help/variable/CMAKE_LANG_FLAGS_CONFIG.rst b/Help/variable/CMAKE_LANG_FLAGS_CONFIG.rst index 628b62b..1dbd036 100644 --- a/Help/variable/CMAKE_LANG_FLAGS_CONFIG.rst +++ b/Help/variable/CMAKE_LANG_FLAGS_CONFIG.rst @@ -1,6 +1,4 @@ CMAKE__FLAGS_ --------------------------- -.. versionadded:: 3.11 - Flags for language ```` when building for the ```` configuration. -- cgit v0.12 From ccc83ce1623a90c9354a940370ed8c06d2fea30b Mon Sep 17 00:00:00 2001 From: Brad King Date: Thu, 3 Jun 2021 10:58:19 -0400 Subject: Help: Document order of flags from CMAKE__FLAGS and COMPILE_OPTIONS --- Help/prop_sf/COMPILE_FLAGS.rst | 7 +++++-- Help/prop_sf/COMPILE_OPTIONS.rst | 7 ++++--- Help/prop_tgt/COMPILE_OPTIONS.rst | 10 +++++++--- Help/variable/CMAKE_LANG_FLAGS.rst | 5 +++++ Help/variable/CMAKE_LANG_FLAGS_CONFIG.rst | 5 +++++ 5 files changed, 26 insertions(+), 8 deletions(-) diff --git a/Help/prop_sf/COMPILE_FLAGS.rst b/Help/prop_sf/COMPILE_FLAGS.rst index c211b89..eefe7bf 100644 --- a/Help/prop_sf/COMPILE_FLAGS.rst +++ b/Help/prop_sf/COMPILE_FLAGS.rst @@ -4,8 +4,11 @@ COMPILE_FLAGS Additional flags to be added when compiling this source file. The ``COMPILE_FLAGS`` property, managed as a string, sets additional compiler -flags used to build source files. Use :prop_sf:`COMPILE_DEFINITIONS` to pass -additional preprocessor definitions. +flags used that will be added to the list of compile flags when this source +file builds. The flags will be added after target-wide flags (except in +some cases not supported by the :generator:`Visual Studio 9 2008` generator). + +Use :prop_sf:`COMPILE_DEFINITIONS` to pass additional preprocessor definitions. Contents of ``COMPILE_FLAGS`` may use "generator expressions" with the syntax ``$<...>``. See the :manual:`cmake-generator-expressions(7)` diff --git a/Help/prop_sf/COMPILE_OPTIONS.rst b/Help/prop_sf/COMPILE_OPTIONS.rst index a694c3e..84c543a 100644 --- a/Help/prop_sf/COMPILE_OPTIONS.rst +++ b/Help/prop_sf/COMPILE_OPTIONS.rst @@ -5,9 +5,10 @@ COMPILE_OPTIONS List of additional options to pass to the compiler. -This property holds a :ref:`semicolon-separated list ` of options -and will be added to the list of compile flags when this -source file builds. +This property holds a :ref:`semicolon-separated list ` +of options and will be added to the list of compile flags when this source +file builds. The options will be added after target-wide options (except in +some cases not supported by the :generator:`Visual Studio 9 2008` generator). Contents of ``COMPILE_OPTIONS`` may use "generator expressions" with the syntax ``$<...>``. See the :manual:`cmake-generator-expressions(7)` manual diff --git a/Help/prop_tgt/COMPILE_OPTIONS.rst b/Help/prop_tgt/COMPILE_OPTIONS.rst index 4bc190a..0fd6aac 100644 --- a/Help/prop_tgt/COMPILE_OPTIONS.rst +++ b/Help/prop_tgt/COMPILE_OPTIONS.rst @@ -3,9 +3,13 @@ COMPILE_OPTIONS List of options to pass to the compiler. -This property holds a :ref:`semicolon-separated list ` of options -specified so far for its target. Use the :command:`target_compile_options` -command to append more options. +This property holds a :ref:`semicolon-separated list ` +of options specified so far for its target. Use the +:command:`target_compile_options` command to append more options. +The options will be added after after flags in the +:variable:`CMAKE__FLAGS` and :variable:`CMAKE__FLAGS_` +variables, but before those propagated from dependencies by the +:prop_tgt:`INTERFACE_COMPILE_OPTIONS` property. This property is initialized by the :prop_dir:`COMPILE_OPTIONS` directory property when a target is created, and is used by the generators to set diff --git a/Help/variable/CMAKE_LANG_FLAGS.rst b/Help/variable/CMAKE_LANG_FLAGS.rst index 11864f8..2784397 100644 --- a/Help/variable/CMAKE_LANG_FLAGS.rst +++ b/Help/variable/CMAKE_LANG_FLAGS.rst @@ -18,3 +18,8 @@ This is initialized for each language from environment variables: This value is a command-line string fragment. Therefore, multiple options should be separated by spaces, and options with spaces should be quoted. + +The flags in this variable will be passed to the compiler before those +in the per-configuration :variable:`CMAKE__FLAGS_` variant, +and before flags added by the :command:`add_compile_options` or +:command:`target_compile_options` commands. diff --git a/Help/variable/CMAKE_LANG_FLAGS_CONFIG.rst b/Help/variable/CMAKE_LANG_FLAGS_CONFIG.rst index 1dbd036..f0900fd 100644 --- a/Help/variable/CMAKE_LANG_FLAGS_CONFIG.rst +++ b/Help/variable/CMAKE_LANG_FLAGS_CONFIG.rst @@ -2,3 +2,8 @@ CMAKE__FLAGS_ --------------------------- Flags for language ```` when building for the ```` configuration. + +The flags in this variable will be passed to the compiler after those +in the :variable:`CMAKE__FLAGS` variable, but before flags added +by the :command:`add_compile_options` or :command:`target_compile_options` +commands. -- cgit v0.12 From 8f68bcad8fafddc82b73b69f21e122ece8603a8f Mon Sep 17 00:00:00 2001 From: Brad King Date: Thu, 3 Jun 2021 10:40:56 -0400 Subject: Tests: Add cases verifying flag ordering rules --- Tests/CMakeLists.txt | 5 ++++ Tests/CompileOptions/CMakeLists.txt | 28 ++++++++++++++++++++-- Tests/CompileOptions/main.cpp | 18 ++++++++++++++ Tests/RunCMake/CMakeLists.txt | 5 +++- .../target_compile_options/Order-build-stdout.txt | 3 +++ Tests/RunCMake/target_compile_options/Order.cmake | 19 +++++++++++++++ .../target_compile_options/RunCMakeTest.cmake | 13 ++++++++++ Tests/RunCMake/target_compile_options/order.c | 7 ++++++ 8 files changed, 95 insertions(+), 3 deletions(-) create mode 100644 Tests/RunCMake/target_compile_options/Order-build-stdout.txt create mode 100644 Tests/RunCMake/target_compile_options/Order.cmake create mode 100644 Tests/RunCMake/target_compile_options/order.c diff --git a/Tests/CMakeLists.txt b/Tests/CMakeLists.txt index 38b4301..331f637 100644 --- a/Tests/CMakeLists.txt +++ b/Tests/CMakeLists.txt @@ -489,6 +489,11 @@ if(BUILD_TESTING) if(CMAKE_Fortran_COMPILER) set(CompileOptions_BUILD_OPTIONS -DTEST_FORTRAN=1) endif() + if(_isMultiConfig) + set(CompileOptions_CTEST_OPTIONS --build-config $) + else() + set(CompileOptions_BUILD_OPTIONS -DCMAKE_BUILD_TYPE=$) + endif() ADD_TEST_MACRO(CompileOptions CompileOptions) ADD_TEST_MACRO(CompatibleInterface CompatibleInterface) ADD_TEST_MACRO(AliasTarget AliasTarget) diff --git a/Tests/CompileOptions/CMakeLists.txt b/Tests/CompileOptions/CMakeLists.txt index cd6cacd..96bafea 100644 --- a/Tests/CompileOptions/CMakeLists.txt +++ b/Tests/CompileOptions/CMakeLists.txt @@ -1,5 +1,11 @@ -cmake_minimum_required(VERSION 2.8.12) - +cmake_minimum_required(VERSION 3.0) +if(POLICY CMP0092) + cmake_policy(SET CMP0092 NEW) +endif() +get_property(_isMultiConfig GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG) +if(NOT _isMultiConfig AND NOT CMAKE_BUILD_TYPE) + set(CMAKE_BUILD_TYPE Debug CACHE STRING "Choose the type of build" FORCE) +endif() project(CompileOptions) add_library(testlib other.cpp) @@ -49,6 +55,24 @@ if(CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang|Borland|Embarcadero" AND NOT "${CMAK ) endif() +if(CMAKE_CXX_COMPILER_ID MATCHES "^(GNU|AppleClang|MSVC)$") + target_compile_definitions(CompileOptions PRIVATE "DO_FLAG_TESTS") + if(CMAKE_CXX_COMPILER_ID MATCHES "^(GNU|AppleClang)$") + string(APPEND CMAKE_CXX_FLAGS " -w") + endif() + string(APPEND CMAKE_CXX_FLAGS " -DFLAG_A=1 -DFLAG_B=1") + string(APPEND CMAKE_CXX_FLAGS_DEBUG " -DFLAG_A=2 -DFLAG_C=1") + string(APPEND CMAKE_CXX_FLAGS_RELEASE " -DFLAG_A=2 -DFLAG_C=1") + string(APPEND CMAKE_CXX_FLAGS_RELWITHDEBINFO " -DFLAG_A=2 -DFLAG_C=1") + string(APPEND CMAKE_CXX_FLAGS_MINSIZEREL " -DFLAG_A=2 -DFLAG_C=1") + set_property(TARGET CompileOptions APPEND PROPERTY COMPILE_OPTIONS "-DFLAG_B=2" "-DFLAG_C=2" "-DFLAG_D=1") + set_property(TARGET testlib APPEND PROPERTY INTERFACE_COMPILE_OPTIONS "-DFLAG_D=2") + if(NOT CMAKE_GENERATOR MATCHES "^Visual Studio 9") + set_property(TARGET testlib APPEND PROPERTY INTERFACE_COMPILE_OPTIONS "-DFLAG_E=1") + set_property(SOURCE main.cpp PROPERTY COMPILE_OPTIONS "-DFLAG_E=2") + endif() +endif() + target_link_libraries(CompileOptions testlib) if(CMAKE_CXX_COMPILER_ID MATCHES "GNU") diff --git a/Tests/CompileOptions/main.cpp b/Tests/CompileOptions/main.cpp index ebc1017..23ce197 100644 --- a/Tests/CompileOptions/main.cpp +++ b/Tests/CompileOptions/main.cpp @@ -37,6 +37,24 @@ # endif #endif +#ifdef DO_FLAG_TESTS +# if FLAG_A != 2 +# error "FLAG_A is not 2" +# endif +# if FLAG_B != 2 +# error "FLAG_B is not 2" +# endif +# if FLAG_C != 2 +# error "FLAG_C is not 2" +# endif +# if FLAG_D != 2 +# error "FLAG_D is not 2" +# endif +# if defined(FLAG_E) && FLAG_E != 2 +# error "FLAG_E is not 2" +# endif +#endif + #include int main() diff --git a/Tests/RunCMake/CMakeLists.txt b/Tests/RunCMake/CMakeLists.txt index d02d7a2..670abbc 100644 --- a/Tests/RunCMake/CMakeLists.txt +++ b/Tests/RunCMake/CMakeLists.txt @@ -595,7 +595,10 @@ set_property(TEST RunCMake.target_link_options APPEND add_RunCMake_test(target_compile_definitions) add_RunCMake_test(target_compile_features) -add_RunCMake_test(target_compile_options -DCMAKE_C_COMPILER_ID=${CMAKE_C_COMPILER_ID}) +add_RunCMake_test(target_compile_options + -DCMAKE_C_COMPILER_ID=${CMAKE_C_COMPILER_ID} + -DCMAKE_C_SIMULATE_ID=${CMAKE_C_SIMULATE_ID} + ) add_RunCMake_test(target_include_directories) add_RunCMake_test(target_sources) add_RunCMake_test(CheckCompilerFlag -DCMake_TEST_CUDA=${CMake_TEST_CUDA} diff --git a/Tests/RunCMake/target_compile_options/Order-build-stdout.txt b/Tests/RunCMake/target_compile_options/Order-build-stdout.txt new file mode 100644 index 0000000..c210ff2 --- /dev/null +++ b/Tests/RunCMake/target_compile_options/Order-build-stdout.txt @@ -0,0 +1,3 @@ +-w +-O +-O0 [^ +]*-O1 +-O2 +-O3 [^ +]*CMakeFiles[\/]order\.dir[\/](Custom[\/])?order\.c\.o diff --git a/Tests/RunCMake/target_compile_options/Order.cmake b/Tests/RunCMake/target_compile_options/Order.cmake new file mode 100644 index 0000000..3d59b16 --- /dev/null +++ b/Tests/RunCMake/target_compile_options/Order.cmake @@ -0,0 +1,19 @@ +get_property (isMultiConfig GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG) +if(isMultiConfig) + set(CMAKE_CONFIGURATION_TYPES "Custom" CACHE STRING "" FORCE) +else() + set(CMAKE_BUILD_TYPE "Custom" CACHE STRING "" FORCE) +endif() +enable_language(C) + +string(APPEND CMAKE_C_FLAGS " -w -O") +set(CMAKE_C_FLAGS_CUSTOM "-O0") + +add_executable(order order.c) +set_property(TARGET order APPEND PROPERTY COMPILE_OPTIONS -O1) + +add_library(iface INTERFACE) +set_property(TARGET iface APPEND PROPERTY INTERFACE_COMPILE_OPTIONS -O2) +target_link_libraries(order PRIVATE iface) + +set_property(SOURCE order.c PROPERTY COMPILE_OPTIONS -O3) diff --git a/Tests/RunCMake/target_compile_options/RunCMakeTest.cmake b/Tests/RunCMake/target_compile_options/RunCMakeTest.cmake index 9f51a9a..806ae79 100644 --- a/Tests/RunCMake/target_compile_options/RunCMakeTest.cmake +++ b/Tests/RunCMake/target_compile_options/RunCMakeTest.cmake @@ -19,3 +19,16 @@ if (CMAKE_C_COMPILER_ID MATCHES "GNU|Clang") run_cmake_target(CMP0101-BEFORE_keyword OLD CMP0101_OLD) run_cmake_target(CMP0101-BEFORE_keyword NEW CMP0101_NEW) endif() + +function(run_Order) + run_cmake_with_options(Order) + set(RunCMake_TEST_NO_CLEAN 1) + set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/Order-build) + set(RunCMake_TEST_OUTPUT_MERGE 1) + run_cmake_command(Order-build ${CMAKE_COMMAND} --build . --verbose --config Custom) +endfunction() +if(RunCMake_GENERATOR MATCHES "Ninja|Make" AND + CMAKE_C_COMPILER_ID MATCHES "^(GNU|Clang|AppleClang)$" AND + NOT CMAKE_C_SIMULATE_ID STREQUAL "MSVC") + run_Order() +endif() diff --git a/Tests/RunCMake/target_compile_options/order.c b/Tests/RunCMake/target_compile_options/order.c new file mode 100644 index 0000000..1bd81ea --- /dev/null +++ b/Tests/RunCMake/target_compile_options/order.c @@ -0,0 +1,7 @@ +#ifndef __OPTIMIZE__ +# error "Optimizations not enabled!" +#endif +int main(void) +{ + return 0; +} -- cgit v0.12