У меня есть программное обеспечение, которое установлено под /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?!
install
в качестве общей цели. Для выполнения дополнительных действий на этапе установки используйте потоки командinstall(CODE)
илиinstall(SCRIPT)
. - person Tsyvarev   schedule 02.06.2020install(SCRIPT)
выполняется после остальныхinstall
команд? - person Tom Mekken   schedule 02.06.2020install()
команд в файлеCMakeLists.txt
. См. этот вопрос для получения дополнительной информации: by-c" title="можно ли добавить команды после установки в make-файл верхнего уровня, сгенерированный c">stackoverflow.com/questions/9998679/ - person Tsyvarev   schedule 02.06.2020install(SCRIPT)
- person Tom Mekken   schedule 02.06.2020