Как выполнить cmake add_custom_command после целевой установки

У меня есть программное обеспечение, которое установлено под /opt/my_program/. Теперь я хочу написать плагин для него. my_program состоит из нескольких библиотек и двоичных файлов, которые может использовать каждый пользователь системы.

[user@pc:/opt/my_program]$ tree
├── bin
│   └── mp
└── lib
    ├── lib_foobar.so
    ├── mp_lib.so
    └── other_lib.so

Предоставленные /opt/my_program/lib/mp_lib.so ссылки против /opt/my_program/lib/lib_foobar.so. Теперь моему плагину требуется mp_lib.so для использования другой (ABI-совместимой) версии lib_foobar.so, которую я развертываю с моим плагином. Я не хочу изменять исходную библиотеку, потому что не каждому другому пользователю системы может понадобиться/иметь новую версию.

Моя идея заключалась в следующем:

  • Я создаю свой плагин, как обычно
  • Я устанавливаю его на CUSTOM_WORKSPACE
  • при установке my_plugin я теперь также копирую mp_lib.so в CUSTOM_WORKSPACE/mp_lib_custom.so и связываю свой плагин с CUSTOM_WORKSPACE/mp_lib_custom.so
  • затем я также копирую lib_foobar_new.so в CUSTOM_WORKSPACE

Это позволяет всем остальным пользователям использовать обычные my_program как есть, и только пользователи, использующие my_plugin, имеют собственное рабочее пространство со своими собственными mp_lib_custom.so и своими собственными lib_foobar_new.so:

CMakeLists.txt

...
set(CUSTOM_WORKSPACE "workspace")
set(MY_PROGRAM_DIR "/opt/my_program")
install(FILES ${CMAKE_BINARY_DIR}/my_plugin.so DESTINATION ${CUSTOM_WORKSPACE})
install(FILES ${CMAKE_SOURCE_DIR}/my_config.txt DESTINATION ${CUSTOM_WORKSPACE})
install(FILES ${CMAKE_SOURCE_DIR}/lib_foobar_new.so DESTINATION ${CUSTOM_WORKSPACE})
install(FILES ${MY_PROGRAM_DIR}/lib/mp_lib.so DESTINATION ${CUSTOM_WORKSPACE})
...

выход:

[user@pc:/tmp/workspace]$ tree
.
├── my_plugin.so
├── my_config.txt
├── lib_foobar_new.so
└── mp_lib_custom.so
  • my_plugin.so ссылается на ./mp_lib_custom.so
  • mp_lib_custom.so ссылается на lib_foobar_new.so
  • поэтому я скопировал mp_lib_custom.so из myprogram-установленного каталога, его RPATH больше не правильно

Проблема

Теперь мне нужно исправить RPATH mp_lib_custom.so с помощью пользовательской команды ПОСЛЕ вызова cmake install (потому что иначе копия еще не существовала бы).

Я пробовал это с:

add_custom_command(TARGET install POST_BUILD
  COMMAND "chrpath" "<ARGUMENTS>"
  COMMAND "echo" "file-was-patched")

Но как-то я что-то недопонимаю, или install не CMake-Target?!


person Tom Mekken    schedule 02.06.2020    source источник
comment
'... install' не является CMake-Target?! - Да, CMake не предоставляет install в качестве общей цели. Для выполнения дополнительных действий на этапе установки используйте потоки команд install(CODE) или install(SCRIPT).   -  person Tsyvarev    schedule 02.06.2020
comment
Хм, я этого и ожидал. И как мне убедиться, что install(SCRIPT) выполняется после остальных install команд?   -  person Tom Mekken    schedule 02.06.2020
comment
CMake учитывает порядок install() команд в файле CMakeLists.txt. См. этот вопрос для получения дополнительной информации: by-c" title="можно ли добавить команды после установки в make-файл верхнего уровня, сгенерированный c">stackoverflow.com/questions/9998679/   -  person Tsyvarev    schedule 02.06.2020
comment
Окей, большое спасибо. Я попробую install(SCRIPT)   -  person Tom Mekken    schedule 02.06.2020
comment
Да, ты прав. Мой вопрос кажется дубликатом. Извините, другого ответа не нашел. Спасибо, что указали на это :) Тогда это можно закрыть   -  person Tom Mekken    schedule 03.06.2020