# 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 $ $/${DEST_FILE}) else() add_custom_command(TARGET ${S_TARGET} POST_BUILD COMMAND "${CMAKE_COMMAND}" -E create_symlink $ $/${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}/$ $/${DEST_FILE}) else() add_custom_command(TARGET ${S_TARGET} POST_BUILD COMMAND "${CMAKE_COMMAND}" -E create_symlink ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/$ $/${DEST_FILE}) endif() endif() endfunction()