我想重命名CMakeLists.txt
中的某些可执行文件,但也需要从旧名称到新文件的符号链接以实现向后兼容。如何在支持符号链接的系统上实现这一目标?
对于不支持符号链接的系统,还有哪些替代方案?
由于
答案 0 :(得分:14)
您可以创建自定义目标并使用CMake创建符号链接
ADD_CUSTOM_TARGET(link_target ALL
COMMAND ${CMAKE_COMMAND} -E create_symlink ${target} ${link})
这仅适用于支持符号链接的系统,请参阅guide。
仅在UNIX上可用:
create_symlink old new - 创建新的符号链接 - >老
答案 1 :(得分:13)
另一种方法:
INSTALL(CODE "execute_process( \
COMMAND ${CMAKE_COMMAND} -E create_symlink \
${target} \
${link} \
)"
)
这样,符号链接将仅在 make install
期间完成。
答案 2 :(得分:12)
另一种更详细的方法,只能在安装时运行:
macro(install_symlink filepath sympath)
install(CODE "execute_process(COMMAND ${CMAKE_COMMAND} -E create_symlink ${filepath} ${sympath})")
install(CODE "message(\"-- Created symlink: ${sympath} -> ${filepath}\")")
endmacro(install_symlink)
像这样使用它(类似于ln -s):
install_symlink(filepath sympath)
答案 3 :(得分:0)
让我们说您需要在二进制目录中创建指向源目录中目标的链接。
从3.14版开始,您可以尝试file CREATE_LINK
从3.17开始,可以在Windows上访问${CMAKE_COMMAND} -E create_symlink
自早期cmake版本开始,您可以使用execute_process:
if(WIN32)
get_filename_component(real_path "${CMAKE_CURRENT_SOURCE_DIR}/target" REALPATH)
string(REPLACE "/" "\\" target_path "${real_path}")
execute_process(
COMMAND cmd /C mklink /J link_name "${target_path}"
WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}"
)
else()
execute_process(COMMAND "ln -s ${CMAKE_CURRENT_SOURCE_DIR}/input ${CMAKE_CURRENT_BINARY_DIR}/input")
endif()
答案 4 :(得分:0)
为了安装引用其他“ .so。#。#”文件的“ .so。#”文件,我对上述响应进行了几种尝试。我没有通过引入文件链接,而是通过将'.so。#。#'文件安装为'.so。#'文件而获得成功。
即代替
install(
FILES
.../libmpi.so.12.0
DESTINATION lib
)
install(CODE
"EXECUTE_PROCESS( ${CMAKE_COMMAND} -E create_symlink lib/libmpi.so.12.0 lib/libmpi.so.12)")
哪一个对我来说都不怎么工作。相反,我通过这样做获得了成功。
install(FILES
.../libmpi.so.12.0
RENAME libmpi.so.12
DESTINATION lib
)
不完全相同,但足够。不要解决问题,要解决问题。
答案 5 :(得分:0)
我已经将检查添加到@ulidtko的方法中,因此symlink不会在每次重建时无条件覆盖:
install(CODE "if (NOT EXISTS ${link})
execute_process(COMMAND ${CMAKE_COMMAND} -E create_symlink \
${target} \
${link})
endif()" )