我在一个大项目上工作:很多目标,半小时在四核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希望绝对构建树引用有用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下运行。那么正确的方法是什么?
答案 0 :(得分:0)
如果有人想知道---我最终在GetPrerequisites.cmake之上实现了我自己的安装脚本。
作为一般观察,CMake似乎并未考虑将单个组件单独包装作为可行选项。如果你想这样,你可以自己动手。