CMake:符号链接文件而不是在安装期间复制它们
CMake: Symlink files instead of copying them during install
在 make install
期间制作 CMake 复制文件很简单:
install(TARGETS foo DESTINATION lib)
install(DIRECTORY Include/ DESTINATION include)
但是是否可以编写 make symlink
来创建符号链接而不是复制文件?如果是,怎么做?
编写创建所需符号链接的 CMake 脚本:
symlink_include_dir.cmake.in:
execute_process(COMMAND cmake -E create_symlink
"@CMAKE_SOURCE_DIR@/include" # Old name
"@CMAKE_INSTALL_PREFIX@/include" # New name
)
在 CMakeLists.txt
中配置此脚本以针对实际源和安装路径进行调整,并从 install(SCRIPT)
:
调用它
CMakeLists.txt:
# This will copy original script with @variable@ replaced with variable's value.
configure_file("symlink_include_dir.cmake.in" "symlink_include_dir.cmake"
@ONLY)
# Tell CMake to use the script at install stage
install(SCRIPT "${CMAKE_CURRENT_BINARY_DIR}/symlink_include_dir.cmake")
好的,在阅读了建议的答案并进行了几次尝试后,我设法编写了代码:
add_custom_target(symlink
${CMAKE_COMMAND} -E create_symlink ${CMAKE_ARCHIVE_OUTPUT_DIRECTORY}/libfoo.a ${CMAKE_INSTALL_PREFIX}/lib/libfoo.a
COMMAND ${CMAKE_COMMAND} -E create_symlink ${CMAKE_SOURCE_DIR}/Include ${CMAKE_INSTALL_PREFIX}/include)
在 make install
期间制作 CMake 复制文件很简单:
install(TARGETS foo DESTINATION lib)
install(DIRECTORY Include/ DESTINATION include)
但是是否可以编写 make symlink
来创建符号链接而不是复制文件?如果是,怎么做?
编写创建所需符号链接的 CMake 脚本:
symlink_include_dir.cmake.in:
execute_process(COMMAND cmake -E create_symlink
"@CMAKE_SOURCE_DIR@/include" # Old name
"@CMAKE_INSTALL_PREFIX@/include" # New name
)
在 CMakeLists.txt
中配置此脚本以针对实际源和安装路径进行调整,并从 install(SCRIPT)
:
CMakeLists.txt:
# This will copy original script with @variable@ replaced with variable's value.
configure_file("symlink_include_dir.cmake.in" "symlink_include_dir.cmake"
@ONLY)
# Tell CMake to use the script at install stage
install(SCRIPT "${CMAKE_CURRENT_BINARY_DIR}/symlink_include_dir.cmake")
好的,在阅读了建议的答案并进行了几次尝试后,我设法编写了代码:
add_custom_target(symlink
${CMAKE_COMMAND} -E create_symlink ${CMAKE_ARCHIVE_OUTPUT_DIRECTORY}/libfoo.a ${CMAKE_INSTALL_PREFIX}/lib/libfoo.a
COMMAND ${CMAKE_COMMAND} -E create_symlink ${CMAKE_SOURCE_DIR}/Include ${CMAKE_INSTALL_PREFIX}/include)