符号链接CMake

时间:2016-03-03 06:53:43

标签: cmake

我想重命名CMakeLists.txt中的某些可执行文件,但也需要从旧名称到新文件的符号链接以实现向后兼容。如何在支持符号链接的系统上实现这一目标?

对于不支持符号链接的系统,还有哪些替代方案?

由于

6 个答案:

答案 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()" )