在使用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方法是什么?
一种方法可以使用CMake add_custom_command
和add_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
。
另一种方法是运行一些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 )
。