Makefiles: Position target-wide link flags consistently with other generators In particular, the `LINK_OPTIONS` target property was not placed on link lines consistently with other generators. Fixes: #27326
diff --git a/Source/cmMakefileLibraryTargetGenerator.cxx b/Source/cmMakefileLibraryTargetGenerator.cxx index 9493dc9..54074f9 100644 --- a/Source/cmMakefileLibraryTargetGenerator.cxx +++ b/Source/cmMakefileLibraryTargetGenerator.cxx
@@ -176,7 +176,6 @@ } std::string extraFlags; - this->GetTargetLinkFlags(extraFlags, linkLanguage); this->LocalGenerator->AppendTargetCreationLinkFlags( extraFlags, this->GeneratorTarget, linkLanguage); this->LocalGenerator->AddConfigVariableFlags( @@ -195,6 +194,8 @@ this->UseLWYU = this->LocalGenerator->AppendLWYUFlags( extraFlags, this->GeneratorTarget, linkLanguage); + this->GetTargetLinkFlags(extraFlags, linkLanguage); + this->WriteLibraryRules(linkRuleVar, extraFlags, relink); } @@ -214,7 +215,6 @@ cmStrCat("CMAKE_", linkLanguage, "_CREATE_SHARED_MODULE"); std::string extraFlags; - this->GetTargetLinkFlags(extraFlags, linkLanguage); this->LocalGenerator->AppendTargetCreationLinkFlags( extraFlags, this->GeneratorTarget, linkLanguage); this->LocalGenerator->AddConfigVariableFlags( @@ -233,6 +233,8 @@ this->UseLWYU = this->LocalGenerator->AppendLWYUFlags( extraFlags, this->GeneratorTarget, linkLanguage); + this->GetTargetLinkFlags(extraFlags, linkLanguage); + this->WriteLibraryRules(linkRuleVar, extraFlags, relink); } @@ -244,12 +246,12 @@ cmStrCat("CMAKE_", linkLanguage, "_CREATE_MACOSX_FRAMEWORK"); std::string extraFlags; - this->GetTargetLinkFlags(extraFlags, linkLanguage); this->LocalGenerator->AppendTargetCreationLinkFlags( extraFlags, this->GeneratorTarget, linkLanguage); this->LocalGenerator->AddConfigVariableFlags( extraFlags, "CMAKE_MACOSX_FRAMEWORK_LINKER_FLAGS", this->GeneratorTarget, cmBuildStep::Link, linkLanguage, this->GetConfigName()); + this->GetTargetLinkFlags(extraFlags, linkLanguage); this->WriteLibraryRules(linkRuleVar, extraFlags, relink); }
diff --git a/Tests/RunCMake/CMakeLists.txt b/Tests/RunCMake/CMakeLists.txt index e63bf42..35ce7e2 100644 --- a/Tests/RunCMake/CMakeLists.txt +++ b/Tests/RunCMake/CMakeLists.txt
@@ -1014,7 +1014,8 @@ -DCMAKE_C_COMPILER_ID=${CMAKE_C_COMPILER_ID} -DCMAKE_C_COMPILER_FRONTEND_VARIANT=${CMAKE_C_COMPILER_FRONTEND_VARIANT}) add_RunCMake_test(add_link_options -DCMAKE_C_COMPILER_ID=${CMAKE_C_COMPILER_ID}) -add_RunCMake_test(target_link_options -DCMAKE_C_COMPILER_ID=${CMAKE_C_COMPILER_ID} +add_RunCMake_test(target_link_options -DCMAKE_SYSTEM_NAME=${CMAKE_SYSTEM_NAME} + -DCMAKE_C_COMPILER_ID=${CMAKE_C_COMPILER_ID} -DCMake_TEST_CUDA=${CMake_TEST_CUDA}) set_property(TEST RunCMake.target_link_options APPEND PROPERTY LABELS "CUDA")
diff --git a/Tests/RunCMake/target_link_options/RunCMakeTest.cmake b/Tests/RunCMake/target_link_options/RunCMakeTest.cmake index 5562c9e..45ef4a3 100644 --- a/Tests/RunCMake/target_link_options/RunCMakeTest.cmake +++ b/Tests/RunCMake/target_link_options/RunCMakeTest.cmake
@@ -32,6 +32,18 @@ run_cmake_target(LINK_OPTIONS exe LinkOptions_exe --config Release) run_cmake_target(LINK_OPTIONS dollar-option LinkOptions_dollar_exe --config Release) + if(CMAKE_SYSTEM_NAME MATCHES "(Linux|Darwin)" AND + RunCMake_GENERATOR MATCHES "(Ninja|Makefiles)") + + run_cmake(position_LINK_OPTIONS) + + run_cmake_target(position_LINK_OPTIONS shared LinkOptions_shared ${VERBOSE}) + run_cmake_target(position_LINK_OPTIONS module LinkOptions_module ${VERBOSE}) + if(CMAKE_SYSTEM_NAME STREQUAL "Darwin") + run_cmake_target(position_LINK_OPTIONS framework LinkOptions_framework ${VERBOSE}) + endif() + endif() + run_cmake(genex_LINK_LANGUAGE) run_cmake_target(genex_LINK_LANGUAGE interface LinkOptions_shared_interface --config Release)
diff --git a/Tests/RunCMake/target_link_options/position_LINK_OPTIONS-framework-check.cmake b/Tests/RunCMake/target_link_options/position_LINK_OPTIONS-framework-check.cmake new file mode 100644 index 0000000..0f0de1c --- /dev/null +++ b/Tests/RunCMake/target_link_options/position_LINK_OPTIONS-framework-check.cmake
@@ -0,0 +1,4 @@ + +if (NOT actual_stdout MATCHES "BADFLAG_GLOBAL(\.[a-z]+)? +(-)?BADFLAG_PRIVATE") + set (RunCMake_TEST_FAILED "options order is not respected.") +endif()
diff --git a/Tests/RunCMake/target_link_options/position_LINK_OPTIONS-framework-result.txt b/Tests/RunCMake/target_link_options/position_LINK_OPTIONS-framework-result.txt new file mode 100644 index 0000000..8d98f9d --- /dev/null +++ b/Tests/RunCMake/target_link_options/position_LINK_OPTIONS-framework-result.txt
@@ -0,0 +1 @@ +.*
diff --git a/Tests/RunCMake/target_link_options/position_LINK_OPTIONS-module-check.cmake b/Tests/RunCMake/target_link_options/position_LINK_OPTIONS-module-check.cmake new file mode 100644 index 0000000..0f0de1c --- /dev/null +++ b/Tests/RunCMake/target_link_options/position_LINK_OPTIONS-module-check.cmake
@@ -0,0 +1,4 @@ + +if (NOT actual_stdout MATCHES "BADFLAG_GLOBAL(\.[a-z]+)? +(-)?BADFLAG_PRIVATE") + set (RunCMake_TEST_FAILED "options order is not respected.") +endif()
diff --git a/Tests/RunCMake/target_link_options/position_LINK_OPTIONS-module-result.txt b/Tests/RunCMake/target_link_options/position_LINK_OPTIONS-module-result.txt new file mode 100644 index 0000000..8d98f9d --- /dev/null +++ b/Tests/RunCMake/target_link_options/position_LINK_OPTIONS-module-result.txt
@@ -0,0 +1 @@ +.*
diff --git a/Tests/RunCMake/target_link_options/position_LINK_OPTIONS-shared-check.cmake b/Tests/RunCMake/target_link_options/position_LINK_OPTIONS-shared-check.cmake new file mode 100644 index 0000000..0f0de1c --- /dev/null +++ b/Tests/RunCMake/target_link_options/position_LINK_OPTIONS-shared-check.cmake
@@ -0,0 +1,4 @@ + +if (NOT actual_stdout MATCHES "BADFLAG_GLOBAL(\.[a-z]+)? +(-)?BADFLAG_PRIVATE") + set (RunCMake_TEST_FAILED "options order is not respected.") +endif()
diff --git a/Tests/RunCMake/target_link_options/position_LINK_OPTIONS-shared-result.txt b/Tests/RunCMake/target_link_options/position_LINK_OPTIONS-shared-result.txt new file mode 100644 index 0000000..8d98f9d --- /dev/null +++ b/Tests/RunCMake/target_link_options/position_LINK_OPTIONS-shared-result.txt
@@ -0,0 +1 @@ +.*
diff --git a/Tests/RunCMake/target_link_options/position_LINK_OPTIONS.cmake b/Tests/RunCMake/target_link_options/position_LINK_OPTIONS.cmake new file mode 100644 index 0000000..1a0c8d3 --- /dev/null +++ b/Tests/RunCMake/target_link_options/position_LINK_OPTIONS.cmake
@@ -0,0 +1,28 @@ + +enable_language(C) + +set(obj "${CMAKE_C_OUTPUT_EXTENSION}") +if(BORLAND) + set(pre -) +endif() + +set(CMAKE_VERBOSE_MAKEFILE TRUE) +set(CMAKE_C_USE_RESPONSE_FILE_FOR_LIBRARIES FALSE) + +# shared configuration +string(APPEND CMAKE_SHARED_LINKER_FLAGS " ${pre}BADFLAG_GLOBAL${obj}") +add_library(LinkOptions_shared SHARED LinkOptionsLib.c) +target_link_options(LinkOptions_shared PRIVATE ${pre}BADFLAG_PRIVATE${obj}) + +# module configuration +string(APPEND CMAKE_MODULE_LINKER_FLAGS " ${pre}BADFLAG_GLOBAL${obj}") +add_library(LinkOptions_module MODULE LinkOptionsLib.c) +target_link_options(LinkOptions_module PRIVATE ${pre}BADFLAG_PRIVATE${obj}) + +if (CMAKE_SYSTEM_NAME STREQUAL "Darwin") + # framework configuration + string(APPEND CMAKE_MACOSX_FRAMEWORK_LINKER_FLAGS " ${pre}BADFLAG_GLOBAL${obj}") + add_library(LinkOptions_framework SHARED LinkOptionsLib.c) + set_property(TARGET LinkOptions_framework PROPERTY FRAMEWORK TRUE) + target_link_options(LinkOptions_framework PRIVATE ${pre}BADFLAG_PRIVATE${obj}) +endif()