使用CMake在安装时创建指向库的自定义符号链接

问题描述 投票:6回答:2

在使用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
2个回答
7
投票

一种方法可以使用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


1
投票

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

我还要求make install DESTDIR=/buildroot工作,为此需要保留$ DESTDIR未扩展,直到调用shell脚本。除了可移植性的魔力外,它看起来像这样:

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 )

© www.soinside.com 2019 - 2024. All rights reserved.