【问题标题】:Create a custom symbolic link to a library at install time with CMake在安装时使用 CMake 创建指向库的自定义符号链接
【发布时间】:2013-09-09 21:00:15
【问题描述】:

在带有 CMake 的 Linux 下,我正在构建一个共享库 libIex-2_0.so.10.0.1

ADD_LIBRARY (Iex SHARED
  [*.cpp]
)
SET_TARGET_PROPERTIES(Iex PROPERTIES OUTPUT_NAME "Iex-2_0")

10.0.1 版本是通过调用来设置的

SET_TARGET_PROPERTIES ( Iex
  PROPERTIES
  VERSION 10.0.1
  SOVERSION 10
)

在安装文件夹中,这些链接被创建

libIex-2_0.so -> libIex-2_0.so.10
libIex-2_0.so.10 -> libIex-2_0.so.10.0.1
libIex-2_0.so.10.0.1

但是,为了匹配以前使用另一个构建系统进行的构建,我需要添加一个旧的符号链接,去除 2_0 后缀:

libIex.so -> libIex-2_0.so.10.0.1

创建此类链接的正确 CMake 方法是什么?

【问题讨论】:

    标签: unix build cmake symlink


    【解决方案1】:

    一种方法是使用 CMake add_custom_commandadd_custom_target。在您的情况下,它将类似于以下内容:

     SET( legacy_link   ${CMAKE_INSTALL_PREFIX}/libIex.so)
     SET( legacy_target ${CMAKE_INSTALL_PREFIX}/libIex-2_0.so.10.0.1)
     ADD_CUSTOM_COMMAND( OUTPUT ${legacy_link}
                         COMMAND ln -s ${legacy_target} ${legacy_link}
                         DEPENDS install ${legacy_target} 
                         COMMENT "Generating legacy symbolic link")
    
     ADD_CUSTOM_TARGET( install_legacy DEPENDS ${legacy_link} )
    

    此时,您应该在生成的 Makefile 中有一个目标 install_legacy,并具有生成 libIex.so 的正确依赖项。

    【讨论】:

    • 虽然此答案中的代码看起来比 another one 中的代码更简单,但使用 add_custom_target 进行 install 并不是一个好主意,通常应该避免使用而不是适当的install() 命令流。
    【解决方案2】:

    另一种方法是运行一些install(CODE shell-script)。顺便说一句,它确实正确地附加到了一般的“make install”目标。通过对 working_directory 的更好控制,还可以轻松创建相关符号链接。

    我确实还要求make install DESTDIR=/buildroot 可以工作,为此需要在调用 shell 脚本之前保持 $DESTDIR 未扩展。除了一些可移植性的魔力外,它看起来像这样:

    get_target_property(libname MyLib OUTPUT_NAME)
    get_target_property(libversion MyLib VERSION)
    set(lib ${CMAKE_SHARED_LIBRARY_PREFIX})
    set(dll ${CMAKE_SHARED_LIBRARY_SUFFIX})
    install(CODE "execute_process(
        COMMAND bash -c \"set -e
        cd $DESTDIR/${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}
        echo -n .. Installing: `pwd`
        ln -sv ${lib}${libname}${dll}.${libversion} ${lib}${libname}${dll}.11
        echo -n .. Installing: `pwd`
        ln -sv ${lib}${libname}${dll}.${libversion} ${lib}${libname}${dll}.12
        \")")
    

    附:假设include ( GNUInstallDirs )在这里。

    【讨论】:

    • "shell-script" 是install(CODE) 命令流的误导性参数名称。它实际上是一个 CMake 脚本,或者更准确地说,是一个 CMake 代码(对于 CMake 脚本,有install(SCRIPT) 命令流)。
    猜你喜欢
    • 2012-08-05
    • 1970-01-01
    • 2014-07-14
    • 1970-01-01
    • 1970-01-01
    • 2021-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多