linux - 如何在目标“安装”后执行 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
- 因此,我从-installed 目录中复制
mp_lib_custom.so
出来,它不再正确myprogram
RPATH
问题
现在我需要在调用mp_lib_custom.so
之后使用自定义命令修补 的 RPATH cmake install
(因为否则副本将不存在)。
我试过了:
add_custom_command(TARGET install POST_BUILD
COMMAND "chrpath" "<ARGUMENTS>"
COMMAND "echo" "file-was-patched")
但不知何故,我似乎误解了一些东西,或者“安装”不是 CMake-Target?!
解决方案
推荐阅读
- avro - Spring Boot:如何在 spring-kafka 中惯用地配置 Schema Registry Serdes
- latex - 为什么一个人需要编译两次才能在pdf中有一个目录?
- csh - if 语句 CSH 中未修改变量
- php - Foreach 数组返回最后一个值
- dom - 如何在 StencilJS 组件中安全地操作 DOM?
- javascript - 如何使用切换按钮为滑动车制作动画
- azure - 如何使用 java 在 azure blob 存储中创建/删除共享访问策略?
- r - 通过R中的Shiny渲染后如何在新窗口中打开pdf文件
- arrays - 不能在 ARRAYFORMULA 中使用 SUM
- python - 在 Pandas 中重塑数据 - Python 3