【发布时间】:2015-05-15 23:34:13
【问题描述】:
我在做一个大项目:很多目标,半小时在四核 i7 笔记本电脑上构建。
我的目标是构建一个仅依赖于项目中部分其他目标的可执行目标,并将其打包用于 Linux 和 Windows。我需要结果是一个“可重定位”的包。也就是说,它不会安装到任何标准位置,但需要在用户解压它的任何地方运行。
我可以构建有问题的目标,它在构建树中运行良好。所以我知道所有的碎片都在那里,我只需要打包它们。
听起来应该可以使用install() 和fixup_bundle() 的组合,但在实践中,细节总是会妨碍您。这是我到目前为止所尝试的。
天真的安装修复
我尝试的第一件事是
get_target_property(MYTARGET_LOCATION mytarget LOCATION)
get_filename_component(MYTARGET_NAME ${MYTARGET_LOCATION} NAME)
install(TARGET mytarget DESTINATION . COMPONENT mycomponent)
install(CODE "include(BundleUtilities)
fixup_bundle(\${CMAKE_INSTALL_PREFIX}/${MYTARGET_NAME} \"\" \"\")"
COMPONENT mycomponent)
这不起作用,因为install() 从我的可执行文件中剥离了RPATH,而fixup_bundle() 无法从我的项目中找到任何依赖项。
保留 RPATH
然后我尝试保留 RPATH,希望绝对构建树引用对 fixup_bundle() 有所帮助:
get_target_property(MYTARGET_LOCATION mytarget LOCATION)
get_filename_component(MYTARGET_NAME ${MYTARGET_LOCATION} NAME)
install(PROGRAMS ${MYTARGET_LOCATION} DESTINATION . COMPONENT mycomponent)
install(CODE "include(BundleUtilities)
fixup_bundle(\${CMAKE_INSTALL_PREFIX}/${MYTARGET_NAME} \"\" \"\")"
COMPONENT mycomponent)
这几乎成功了,fixup_bundle() 找到了所有依赖项并将它们复制到 CMAKE_INSTALL_PREFIX。但随后验证失败,因为fixup_bundle() 没有更改RPATH,并且verify_app() 在我的捆绑包位置之外找到了引用。
总结
我感觉我的工作违背了 CMake 作者的意图,应该有另一种更好的方法来解决这个问题。我也不知道fixup_bundle() 应该如何在 Windows 下工作。那么正确的方法是什么?
【问题讨论】: