mirror of
https://github.com/Kitware/CMake.git
synced 2026-05-01 20:00:51 -05:00
LINK_OPTIONS: Add support of "LINKER:" prefix
This commit is contained in:
@@ -0,0 +1,2 @@
|
||||
|
||||
include ("${CMAKE_CURRENT_LIST_DIR}/LINKER_expansion-validation.cmake")
|
||||
@@ -0,0 +1,4 @@
|
||||
|
||||
set (LINKER_OPTION "LINKER:SHELL:-foo bar")
|
||||
|
||||
include ("LINKER_expansion-list.cmake")
|
||||
@@ -0,0 +1,2 @@
|
||||
|
||||
include ("${CMAKE_CURRENT_LIST_DIR}/LINKER_expansion-validation.cmake")
|
||||
@@ -0,0 +1,36 @@
|
||||
|
||||
enable_language(C)
|
||||
|
||||
add_executable(dump dump.c)
|
||||
|
||||
add_link_options("${LINKER_OPTION}")
|
||||
|
||||
# ensure no temp file will be used
|
||||
string(REPLACE "${CMAKE_START_TEMP_FILE}" "" CMAKE_C_CREATE_SHARED_LIBRARY "${CMAKE_C_CREATE_SHARED_LIBRARY}")
|
||||
string(REPLACE "${CMAKE_END_TEMP_FILE}" "" CMAKE_C_CREATE_SHARED_LIBRARY "${CMAKE_C_CREATE_SHARED_LIBRARY}")
|
||||
|
||||
add_library(example SHARED LinkOptionsLib.c)
|
||||
# use LAUNCH facility to dump linker command
|
||||
set_property(TARGET example PROPERTY RULE_LAUNCH_LINK "\"${CMAKE_CURRENT_BINARY_DIR}/dump${CMAKE_EXECUTABLE_SUFFIX}\"")
|
||||
|
||||
add_dependencies (example dump)
|
||||
|
||||
# generate reference for LINKER flag
|
||||
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)
|
||||
string (APPEND linker_flag "${linker_space}" "-foo${CMAKE_C_LINKER_WRAPPER_FLAG_SEP}bar")
|
||||
else()
|
||||
set (linker_flag "${linker_flag}${linker_space}-foo ${linker_flag}${linker_space}bar")
|
||||
endif()
|
||||
else()
|
||||
set(linker_flag "-foo bar")
|
||||
endif()
|
||||
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/LINKER.txt" "${linker_flag}")
|
||||
@@ -0,0 +1,15 @@
|
||||
|
||||
if (actual_stdout MATCHES "(LINKER|SHELL):")
|
||||
set (RunCMake_TEST_FAILED "LINKER: prefix was not expanded.")
|
||||
return()
|
||||
endif()
|
||||
|
||||
if (NOT EXISTS "${RunCMake_TEST_BINARY_DIR}/LINKER.txt")
|
||||
set (RunCMake_TEST_FAILED "${RunCMake_TEST_BINARY_DIR}/LINKER.txt: Reference file not found.")
|
||||
return()
|
||||
endif()
|
||||
file(READ "${RunCMake_TEST_BINARY_DIR}/LINKER.txt" linker_flag)
|
||||
|
||||
if (NOT actual_stdout MATCHES "${linker_flag}")
|
||||
set (RunCMake_TEST_FAILED "LINKER: was not expanded correctly.")
|
||||
endif()
|
||||
@@ -0,0 +1,4 @@
|
||||
|
||||
set (LINKER_OPTION "LINKER:-foo,bar")
|
||||
|
||||
include ("LINKER_expansion-list.cmake")
|
||||
@@ -26,3 +26,13 @@ if (NOT CMAKE_C_COMPILER_ID STREQUAL "Intel")
|
||||
unset(RunCMake_TEST_OPTIONS)
|
||||
unset(RunCMake_TEST_OUTPUT_MERGE)
|
||||
endif()
|
||||
|
||||
run_cmake(bad_SHELL_usage)
|
||||
|
||||
if(RunCMake_GENERATOR MATCHES "(Ninja|Makefile)")
|
||||
run_cmake(LINKER_expansion)
|
||||
run_cmake_target(LINKER_expansion build all)
|
||||
|
||||
run_cmake(LINKER_SHELL_expansion)
|
||||
run_cmake_target(LINKER_SHELL_expansion build all)
|
||||
endif()
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
1
|
||||
@@ -0,0 +1,4 @@
|
||||
CMake Error at bad_SHELL_usage.cmake:6 \(add_library\):
|
||||
'SHELL:' prefix is not supported as part of 'LINKER:' arguments.
|
||||
Call Stack \(most recent call first\):
|
||||
CMakeLists.txt:5 \(include\)
|
||||
@@ -0,0 +1,6 @@
|
||||
|
||||
enable_language(C)
|
||||
|
||||
add_link_options("LINKER:-foo,SHELL:-bar")
|
||||
|
||||
add_library(example SHARED LinkOptionsLib.c)
|
||||
@@ -0,0 +1,13 @@
|
||||
|
||||
#include "stdio.h"
|
||||
|
||||
int main(int argc, char* argv[])
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 1; i < argc; i++)
|
||||
printf("%s ", argv[i]);
|
||||
printf("\n");
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
|
||||
include ("${CMAKE_CURRENT_LIST_DIR}/LINKER_expansion-validation.cmake")
|
||||
@@ -0,0 +1,2 @@
|
||||
|
||||
include ("${CMAKE_CURRENT_LIST_DIR}/LINKER_expansion-validation.cmake")
|
||||
@@ -0,0 +1,15 @@
|
||||
|
||||
if (actual_stdout MATCHES "LINKER:")
|
||||
set (RunCMake_TEST_FAILED "LINKER: prefix was not expanded.")
|
||||
return()
|
||||
endif()
|
||||
|
||||
if (NOT EXISTS "${RunCMake_TEST_BINARY_DIR}/LINKER.txt")
|
||||
set (RunCMake_TEST_FAILED "${RunCMake_TEST_BINARY_DIR}/LINKER.txt: Reference file not found.")
|
||||
return()
|
||||
endif()
|
||||
file(READ "${RunCMake_TEST_BINARY_DIR}/LINKER.txt" linker_flag)
|
||||
|
||||
if (NOT actual_stdout MATCHES "${linker_flag}")
|
||||
set (RunCMake_TEST_FAILED "LINKER: was not expanded correctly.")
|
||||
endif()
|
||||
@@ -0,0 +1,49 @@
|
||||
|
||||
enable_language(C)
|
||||
|
||||
add_executable(dump dump.c)
|
||||
|
||||
# ensure no temp file will be used
|
||||
string(REPLACE "${CMAKE_START_TEMP_FILE}" "" CMAKE_C_CREATE_SHARED_LIBRARY "${CMAKE_C_CREATE_SHARED_LIBRARY}")
|
||||
string(REPLACE "${CMAKE_END_TEMP_FILE}" "" CMAKE_C_CREATE_SHARED_LIBRARY "${CMAKE_C_CREATE_SHARED_LIBRARY}")
|
||||
|
||||
|
||||
# Use LINKER alone
|
||||
add_library(linker SHARED LinkOptionsLib.c)
|
||||
target_link_options(linker PRIVATE "LINKER:-foo,bar")
|
||||
|
||||
# use LAUNCH facility to dump linker command
|
||||
set_property(TARGET linker PROPERTY RULE_LAUNCH_LINK "\"${CMAKE_CURRENT_BINARY_DIR}/dump${CMAKE_EXECUTABLE_SUFFIX}\"")
|
||||
|
||||
add_dependencies (linker dump)
|
||||
|
||||
|
||||
# Use LINKER with SHELL
|
||||
add_library(linker_shell SHARED LinkOptionsLib.c)
|
||||
target_link_options(linker_shell PRIVATE "LINKER:SHELL:-foo bar")
|
||||
|
||||
# use LAUNCH facility to dump linker command
|
||||
set_property(TARGET linker_shell PROPERTY RULE_LAUNCH_LINK "\"${CMAKE_CURRENT_BINARY_DIR}/dump${CMAKE_EXECUTABLE_SUFFIX}\"")
|
||||
|
||||
add_dependencies (linker_shell dump)
|
||||
|
||||
|
||||
# generate reference for LINKER flag
|
||||
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)
|
||||
string (APPEND linker_flag "${linker_space}" "-foo${CMAKE_C_LINKER_WRAPPER_FLAG_SEP}bar")
|
||||
else()
|
||||
set (linker_flag "${linker_flag}${linker_space}-foo ${linker_flag}${linker_space}bar")
|
||||
endif()
|
||||
else()
|
||||
set(linker_flag "-foo bar")
|
||||
endif()
|
||||
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/LINKER.txt" "${linker_flag}")
|
||||
@@ -29,34 +29,11 @@ if (NOT CMAKE_C_COMPILER_ID STREQUAL "Intel")
|
||||
unset(RunCMake_TEST_OUTPUT_MERGE)
|
||||
endif()
|
||||
|
||||
run_cmake(bad_SHELL_usage)
|
||||
|
||||
# include(RunCMake)
|
||||
if(RunCMake_GENERATOR MATCHES "(Ninja|Makefile)")
|
||||
run_cmake(LINKER_expansion)
|
||||
|
||||
# macro(run_cmake_build test)
|
||||
# run_cmake(${test})
|
||||
|
||||
# set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/${test}-build)
|
||||
# set(RunCMake_TEST_NO_CLEAN 1)
|
||||
# run_cmake_command(${test}-build ${CMAKE_COMMAND} --build . ${ARGN})
|
||||
|
||||
# unset(RunCMake_TEST_BINARY_DIR)
|
||||
# unset(RunCMake_TEST_NO_CLEAN)
|
||||
# endmacro()
|
||||
|
||||
# if (NOT CMAKE_C_COMPILER_ID STREQUAL "Intel")
|
||||
# # Intel compiler does not reject bad flags or objects!
|
||||
# set(RunCMake_TEST_OUTPUT_MERGE TRUE)
|
||||
|
||||
# run_cmake_build(LINK_OPTIONS)
|
||||
# run_cmake_build(INTERFACE_LINK_OPTIONS)
|
||||
|
||||
# if (NOT RunCMake_GENERATOR_IS_MULTI_CONFIG)
|
||||
# set(RunCMake_TEST_OPTIONS -DCMAKE_BUILD_TYPE=Release)
|
||||
# endif()
|
||||
# run_cmake_build(LINK_OPTIONS_shared --config Release)
|
||||
# run_cmake_build(LINK_OPTIONS_mod --config Release)
|
||||
# run_cmake_build(LINK_OPTIONS_exe --config Release)
|
||||
# unset(RunCMake_TEST_OPTIONS)
|
||||
|
||||
# unset(RunCMake_TEST_OUTPUT_MERGE)
|
||||
# endif()
|
||||
run_cmake_target(LINKER_expansion LINKER linker)
|
||||
run_cmake_target(LINKER_expansion LINKER_SHELL linker_shell)
|
||||
endif()
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
1
|
||||
@@ -0,0 +1,4 @@
|
||||
CMake Error at bad_SHELL_usage.cmake:4 \(add_library\):
|
||||
'SHELL:' prefix is not supported as part of 'LINKER:' arguments.
|
||||
Call Stack \(most recent call first\):
|
||||
CMakeLists.txt:5 \(include\)
|
||||
@@ -0,0 +1,5 @@
|
||||
|
||||
enable_language(C)
|
||||
|
||||
add_library(example SHARED LinkOptionsLib.c)
|
||||
target_link_options(example PRIVATE "LINKER:-foo,SHELL:-bar")
|
||||
@@ -0,0 +1,13 @@
|
||||
|
||||
#include "stdio.h"
|
||||
|
||||
int main(int argc, char* argv[])
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 1; i < argc; i++)
|
||||
printf("%s ", argv[i]);
|
||||
printf("\n");
|
||||
|
||||
return 0;
|
||||
}
|
||||
Reference in New Issue
Block a user