Add support of "LINKER:" prefix for Windows executable creation

The following variables now support the LINKER: prefix:
* CMAKE_<LANG>_CREATE_WIN32_EXE
* CMAKE_<LANG>_CREATE_CONSOLE_EXE
This commit is contained in:
Marc Chevrier
2024-10-28 18:18:43 +01:00
parent 8bcf9c7a3e
commit 61aee8c7bd
17 changed files with 96 additions and 48 deletions

View File

@@ -1604,17 +1604,19 @@ void cmLocalGenerator::GetTargetFlags(
}
}
std::string exeFlags;
if (target->IsWin32Executable(config)) {
exeFlags += this->Makefile->GetSafeDefinition(
cmStrCat("CMAKE_", linkLanguage, "_CREATE_WIN32_EXE"));
exeFlags += " ";
} else {
exeFlags += this->Makefile->GetSafeDefinition(
cmStrCat("CMAKE_", linkLanguage, "_CREATE_CONSOLE_EXE"));
exeFlags += " ";
{
auto exeType = cmStrCat(
"CMAKE_", linkLanguage, "_CREATE_",
(target->IsWin32Executable(config) ? "WIN32" : "CONSOLE"), "_EXE");
std::string exeFlags;
this->AppendFlags(exeFlags, this->Makefile->GetDefinition(exeType),
exeType, target, cmBuildStep::Link, linkLanguage);
if (!exeFlags.empty()) {
linkFlags.emplace_back(std::move(exeFlags));
}
}
std::string exeFlags;
if (target->IsExecutableWithExports()) {
exeFlags += this->Makefile->GetSafeDefinition(
cmStrCat("CMAKE_EXE_EXPORTS_", linkLanguage, "_FLAG"));

View File

@@ -375,17 +375,17 @@ void cmMakefileExecutableTargetGenerator::WriteExecutableRule(bool relink)
linkFlags, "CMAKE_EXE_LINKER_FLAGS", this->GeneratorTarget,
cmBuildStep::Link, linkLanguage, this->GetConfigName());
if (this->GeneratorTarget->IsWin32Executable(
this->Makefile->GetSafeDefinition("CMAKE_BUILD_TYPE"))) {
{
auto exeType =
cmStrCat("CMAKE_", linkLanguage, "_CREATE_",
(this->GeneratorTarget->IsWin32Executable(
this->Makefile->GetDefinition("CMAKE_BUILD_TYPE"))
? "WIN32"
: "CONSOLE"),
"_EXE");
this->LocalGenerator->AppendFlags(
linkFlags,
this->Makefile->GetSafeDefinition(
cmStrCat("CMAKE_", linkLanguage, "_CREATE_WIN32_EXE")));
} else {
this->LocalGenerator->AppendFlags(
linkFlags,
this->Makefile->GetSafeDefinition(
cmStrCat("CMAKE_", linkLanguage, "_CREATE_CONSOLE_EXE")));
linkFlags, this->Makefile->GetDefinition(exeType), exeType,
this->GeneratorTarget, cmBuildStep::Link, linkLanguage);
}
// Add symbol export flags if necessary.

View File

@@ -875,7 +875,8 @@ add_RunCMake_test(target_link_libraries-LINK_GROUP -DCMAKE_SYSTEM_NAME=${CMAKE_S
-DCMAKE_IMPORT_LIBRARY_PREFIX=${CMAKE_IMPORT_LIBRARY_PREFIX}
-DCMAKE_IMPORT_LIBRARY_SUFFIX=${CMAKE_IMPORT_LIBRARY_SUFFIX}
-DCMAKE_LINK_LIBRARY_FLAG=${CMAKE_LINK_LIBRARY_FLAG})
add_RunCMake_test(target_link_libraries-LINKER-prefix -DCMAKE_C_COMPILER_ID=${CMAKE_C_COMPILER_ID}
add_RunCMake_test(target_link_libraries-LINKER-prefix -DCMAKE_SYSTEM_NAME=${CMAKE_SYSTEM_NAME}
-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}

View File

@@ -87,13 +87,7 @@
"link": {
"language": "CXX",
"lto": null,
"commandFragments": [
{
"fragment" : ".*",
"role" : "flags",
"backtrace": null
}
]
"commandFragments": null
},
"archive": null,
"dependencies": [

View File

@@ -91,13 +91,7 @@
"link": {
"language": "CXX",
"lto": null,
"commandFragments": [
{
"fragment" : ".*",
"role" : "flags",
"backtrace": null
}
]
"commandFragments": null
},
"archive": null,
"dependencies": [

View File

@@ -87,13 +87,7 @@
"link": {
"language": "CXX",
"lto": null,
"commandFragments": [
{
"fragment" : ".*",
"role" : "flags",
"backtrace": null
}
]
"commandFragments": null
},
"archive": null,
"dependencies": [

View File

@@ -91,13 +91,7 @@
"link": {
"language": "CXX",
"lto": null,
"commandFragments": [
{
"fragment" : ".*",
"role" : "flags",
"backtrace": null
}
]
"commandFragments": null
},
"archive": null,
"dependencies": [

View File

@@ -0,0 +1,3 @@
set(reference_file "LINKER.txt")
include ("${CMAKE_CURRENT_LIST_DIR}/LINKER_expansion-validation.cmake")

View File

@@ -0,0 +1,3 @@
set(reference_file "LINKER.txt")
include ("${CMAKE_CURRENT_LIST_DIR}/LINKER_expansion-validation.cmake")

View File

@@ -0,0 +1,2 @@
include ("${CMAKE_CURRENT_LIST_DIR}/LINKER_expansion-CMP0181-OLD-validation.cmake")

View File

@@ -0,0 +1,2 @@
include ("${CMAKE_CURRENT_LIST_DIR}/LINKER_expansion-CMP0181-OLD-validation.cmake")

View File

@@ -0,0 +1,47 @@
enable_language(C)
cmake_policy(SET CMP0181 ${CMP0181})
# ensure command line is always displayed and do not use any response file
set(CMAKE_VERBOSE_MAKEFILE TRUE)
if (CMAKE_GENERATOR MATCHES "Borland|NMake")
string(REPLACE "${CMAKE_START_TEMP_FILE}" "" CMAKE_C_LINK_EXECUTABLE "${CMAKE_C_LINK_EXECUTABLE}")
string(REPLACE "${CMAKE_END_TEMP_FILE}" "" CMAKE_C_LINK_EXECUTABLE "${CMAKE_C_LINK_EXECUTABLE}")
endif()
set(CMAKE_C_CREATE_WIN32_EXE "${CMAKE_C_CREATE_WIN32_EXE} LINKER:-foo,bar")
add_executable (c_create_win32_exe WIN32 main.c)
set(CMAKE_C_CREATE_CONSOLE_EXE "${CMAKE_C_CREATE_CONSOLE_EXE} LINKER:-foo,bar")
add_executable(c_create_console_exe main.c)
# generate reference for LINKER flag
if (CMP0181 STREQUAL "NEW")
if (CMAKE_C_LINKER_WRAPPER_FLAG)
set(linker_flag ${CMAKE_C_LINKER_WRAPPER_FLAG})
list(GET linker_flag -1 linker_space)
if (linker_space STREQUAL " ")
list(REMOVE_AT linker_flag -1)
else()
set(linker_space)
endif()
list (JOIN linker_flag " " linker_flag)
if (CMAKE_C_LINKER_WRAPPER_FLAG_SEP)
set(linker_sep "${CMAKE_C_LINKER_WRAPPER_FLAG_SEP}")
string (APPEND linker_flag "${linker_space}" "-foo${linker_sep}bar")
else()
set(linker_prefix "${linker_flag}${linker_space}")
set (linker_flag "${linker_prefix}-foo ${linker_prefix}bar")
endif()
else()
set(linker_flag "-foo bar")
endif()
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/LINKER.txt" "${linker_flag}")
endif()

View File

@@ -46,6 +46,14 @@ if (RunCMake_GENERATOR MATCHES "Makefiles|Ninja|Xcode|Visual Studio"
run_cmake_target(LINKER_expansion3-CMP0181-${policy} C_SHARED_CREATE_LINK_FLAGS c_shared_create_link_flags --verbose)
run_cmake_target(LINKER_expansion3-CMP0181-${policy} C_MODULE_CREATE_LINK_FLAGS c_module_create_link_flags --verbose)
endif()
if (CMAKE_SYSTEM_NAME MATCHES "Windows")
set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/LINKER_expansion4-CMP0181-${policy}-build)
run_cmake_with_options(LINKER_expansion4 -DCMP0181=${policy})
run_cmake_target(LINKER_expansion4-CMP0181-${policy} C_CREATE_WIN32_EXE c_create_win32_exe --verbose)
run_cmake_target(LINKER_expansion4-CMP0181-${policy} C_CREATE_CONSOLE_EXE c_create_console_exe --verbose)
endif()
endif()
endforeach()
endif()