Создайте пользовательскую символическую ссылку на библиотеку во время установки с 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 ) Вот.

Другие вопросы по тегам