LINK_OPTIONS: Add support of "LINKER:" prefix

This commit is contained in:
Marc Chevrier
2018-04-30 18:56:25 +02:00
parent c1f5a44b28
commit 66ea1a3795
51 changed files with 423 additions and 42 deletions
@@ -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)
+13
View File
@@ -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")
+13
View File
@@ -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;
}