87 lines
3.4 KiB
CMake
87 lines
3.4 KiB
CMake
# Set a variable with CMake code which:
|
|
# Creates a symlink from src to dest (if possible) or alternatively
|
|
# copies if different.
|
|
include(CMakeParseArguments)
|
|
|
|
function(create_symlink DEST_FILE)
|
|
|
|
cmake_parse_arguments(S "" "FILE;TARGET" "" ${ARGN})
|
|
|
|
if(NOT S_TARGET AND NOT S_FILE)
|
|
message(FATAL_ERROR "create_symlink: Missing TARGET or FILE argument")
|
|
endif()
|
|
|
|
if(S_TARGET AND S_FILE)
|
|
message(FATAL_ERROR "create_symlink: Both source file ${S_FILE} and build target ${S_TARGET} arguments are present; can only have one.")
|
|
endif()
|
|
|
|
if(S_FILE)
|
|
# If we don't need to symlink something that's coming from a build target,
|
|
# we can go ahead and symlink/copy at configure time.
|
|
if(CMAKE_HOST_WIN32 AND NOT CYGWIN)
|
|
execute_process(
|
|
COMMAND "${CMAKE_COMMAND}" -E copy_if_different ${S_FILE} ${DEST_FILE}
|
|
WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}")
|
|
else()
|
|
execute_process(
|
|
COMMAND ${CMAKE_COMMAND} -E create_symlink ${S_FILE} ${DEST_FILE}
|
|
WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}")
|
|
endif()
|
|
endif()
|
|
|
|
if(S_TARGET)
|
|
# We need to use generator expressions, which can be a bit tricky, so for
|
|
# simplicity make the symlink a POST_BUILD step and use the TARGET
|
|
# signature of add_custom_command.
|
|
if(CMAKE_HOST_WIN32 AND NOT CYGWIN)
|
|
add_custom_command(TARGET ${S_TARGET} POST_BUILD
|
|
COMMAND "${CMAKE_COMMAND}" -E copy_if_different $<TARGET_LINKER_FILE_NAME:${S_TARGET}> $<TARGET_LINKER_FILE_DIR:${S_TARGET}>/${DEST_FILE})
|
|
else()
|
|
add_custom_command(TARGET ${S_TARGET} POST_BUILD
|
|
COMMAND "${CMAKE_COMMAND}" -E create_symlink $<TARGET_LINKER_FILE_NAME:${S_TARGET}> $<TARGET_LINKER_FILE_DIR:${S_TARGET}>/${DEST_FILE})
|
|
endif()
|
|
endif()
|
|
|
|
endfunction()
|
|
|
|
|
|
function(create_lib_symlink DEST_FILE)
|
|
|
|
cmake_parse_arguments(S "" "FILE;TARGET" "" ${ARGN})
|
|
|
|
if(NOT S_TARGET AND NOT S_FILE)
|
|
message(FATAL_ERROR "create_symlink: Missing TARGET or FILE argument")
|
|
endif()
|
|
|
|
if(S_TARGET AND S_FILE)
|
|
message(FATAL_ERROR "create_symlink: Both source file ${S_FILE} and build target ${S_TARGET} arguments are present; can only have one.")
|
|
endif()
|
|
|
|
if(S_FILE)
|
|
# If we don't need to symlink something that's coming from a build target,
|
|
# we can go ahead and symlink/copy at configure time.
|
|
if(CMAKE_HOST_WIN32 AND NOT CYGWIN)
|
|
execute_process(
|
|
COMMAND "${CMAKE_COMMAND}" -E copy_if_different ${S_FILE} ${DEST_FILE}
|
|
WORKING_DIRECTORY "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}")
|
|
else()
|
|
execute_process(
|
|
COMMAND ${CMAKE_COMMAND} -E create_symlink ${S_FILE} ${DEST_FILE}
|
|
WORKING_DIRECTORY "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}")
|
|
endif()
|
|
endif()
|
|
|
|
if(S_TARGET)
|
|
# We need to use generator expressions, which can be a bit tricky, so for
|
|
# simplicity make the symlink a POST_BUILD step and use the TARGET
|
|
# signature of add_custom_command.
|
|
if(CMAKE_HOST_WIN32 AND NOT CYGWIN)
|
|
add_custom_command(TARGET ${S_TARGET} POST_BUILD
|
|
COMMAND "${CMAKE_COMMAND}" -E copy_if_different ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/$<TARGET_LINKER_FILE_NAME:${S_TARGET}> $<TARGET_LINKER_FILE_DIR:${S_TARGET}>/${DEST_FILE})
|
|
else()
|
|
add_custom_command(TARGET ${S_TARGET} POST_BUILD
|
|
COMMAND "${CMAKE_COMMAND}" -E create_symlink ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/$<TARGET_LINKER_FILE_NAME:${S_TARGET}> $<TARGET_LINKER_FILE_DIR:${S_TARGET}>/${DEST_FILE})
|
|
endif()
|
|
endif()
|
|
|
|
endfunction() |