mirror of
https://github.com/Kitware/CMake.git
synced 2026-01-07 14:20:06 -06:00
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:
@@ -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"));
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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}
|
||||
|
||||
@@ -87,13 +87,7 @@
|
||||
"link": {
|
||||
"language": "CXX",
|
||||
"lto": null,
|
||||
"commandFragments": [
|
||||
{
|
||||
"fragment" : ".*",
|
||||
"role" : "flags",
|
||||
"backtrace": null
|
||||
}
|
||||
]
|
||||
"commandFragments": null
|
||||
},
|
||||
"archive": null,
|
||||
"dependencies": [
|
||||
|
||||
@@ -91,13 +91,7 @@
|
||||
"link": {
|
||||
"language": "CXX",
|
||||
"lto": null,
|
||||
"commandFragments": [
|
||||
{
|
||||
"fragment" : ".*",
|
||||
"role" : "flags",
|
||||
"backtrace": null
|
||||
}
|
||||
]
|
||||
"commandFragments": null
|
||||
},
|
||||
"archive": null,
|
||||
"dependencies": [
|
||||
|
||||
@@ -87,13 +87,7 @@
|
||||
"link": {
|
||||
"language": "CXX",
|
||||
"lto": null,
|
||||
"commandFragments": [
|
||||
{
|
||||
"fragment" : ".*",
|
||||
"role" : "flags",
|
||||
"backtrace": null
|
||||
}
|
||||
]
|
||||
"commandFragments": null
|
||||
},
|
||||
"archive": null,
|
||||
"dependencies": [
|
||||
|
||||
@@ -91,13 +91,7 @@
|
||||
"link": {
|
||||
"language": "CXX",
|
||||
"lto": null,
|
||||
"commandFragments": [
|
||||
{
|
||||
"fragment" : ".*",
|
||||
"role" : "flags",
|
||||
"backtrace": null
|
||||
}
|
||||
]
|
||||
"commandFragments": null
|
||||
},
|
||||
"archive": null,
|
||||
"dependencies": [
|
||||
|
||||
@@ -0,0 +1,3 @@
|
||||
|
||||
set(reference_file "LINKER.txt")
|
||||
include ("${CMAKE_CURRENT_LIST_DIR}/LINKER_expansion-validation.cmake")
|
||||
@@ -0,0 +1 @@
|
||||
.*
|
||||
@@ -0,0 +1,3 @@
|
||||
|
||||
set(reference_file "LINKER.txt")
|
||||
include ("${CMAKE_CURRENT_LIST_DIR}/LINKER_expansion-validation.cmake")
|
||||
@@ -0,0 +1 @@
|
||||
.*
|
||||
@@ -0,0 +1,2 @@
|
||||
|
||||
include ("${CMAKE_CURRENT_LIST_DIR}/LINKER_expansion-CMP0181-OLD-validation.cmake")
|
||||
@@ -0,0 +1 @@
|
||||
.*
|
||||
@@ -0,0 +1,2 @@
|
||||
|
||||
include ("${CMAKE_CURRENT_LIST_DIR}/LINKER_expansion-CMP0181-OLD-validation.cmake")
|
||||
@@ -0,0 +1 @@
|
||||
.*
|
||||
@@ -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()
|
||||
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user