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
This commit is contained in:
Marc Chevrier
2025-10-25 16:25:37 +02:00
committed by Brad King
parent 50ea94ad97
commit 8fa4a4bf67
10 changed files with 62 additions and 4 deletions

View File

@@ -176,7 +176,6 @@ void cmMakefileLibraryTargetGenerator::WriteSharedLibraryRules(bool relink)
}
std::string extraFlags;
this->GetTargetLinkFlags(extraFlags, linkLanguage);
this->LocalGenerator->AppendTargetCreationLinkFlags(
extraFlags, this->GeneratorTarget, linkLanguage);
this->LocalGenerator->AddConfigVariableFlags(
@@ -195,6 +194,8 @@ void cmMakefileLibraryTargetGenerator::WriteSharedLibraryRules(bool relink)
this->UseLWYU = this->LocalGenerator->AppendLWYUFlags(
extraFlags, this->GeneratorTarget, linkLanguage);
this->GetTargetLinkFlags(extraFlags, linkLanguage);
this->WriteLibraryRules(linkRuleVar, extraFlags, relink);
}
@@ -214,7 +215,6 @@ void cmMakefileLibraryTargetGenerator::WriteModuleLibraryRules(bool relink)
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 @@ void cmMakefileLibraryTargetGenerator::WriteModuleLibraryRules(bool relink)
this->UseLWYU = this->LocalGenerator->AppendLWYUFlags(
extraFlags, this->GeneratorTarget, linkLanguage);
this->GetTargetLinkFlags(extraFlags, linkLanguage);
this->WriteLibraryRules(linkRuleVar, extraFlags, relink);
}
@@ -244,12 +246,12 @@ void cmMakefileLibraryTargetGenerator::WriteFrameworkRules(bool relink)
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);
}

View File

@@ -1014,7 +1014,8 @@ add_RunCMake_test(target_link_libraries-LINKER-prefix -DCMAKE_SYSTEM_NAME=${CMAK
-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")

View File

@@ -32,6 +32,18 @@ if (NOT CMAKE_C_COMPILER_ID STREQUAL "Intel")
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)

View File

@@ -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()

View File

@@ -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()

View File

@@ -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()

View File

@@ -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()