Создайте пользовательскую символическую ссылку на библиотеку во время установки с CMake
Под Linux с CMake я создаю общую библиотеку 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 способ создать такую ссылку?
2 ответа
Одним из способов сделать это может быть использование 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} )
На данный момент у вас должна быть цель install_legacy
в вашем сгенерированном Makefile с правильной зависимостью для генерации libIex.so
,
Другой способ - запустить install(CODE shell-script)
, Кстати, он правильно подключается к общей цели "make install". Благодаря лучшему управлению рабочим_каталогом также можно легко создавать относительные символические ссылки.
Я также потребовал, чтобы 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
\")")
PS при условии include ( GNUInstallDirs )
Вот.