如何使用CMake打包具有依赖关系的目标?

时间:2015-05-15 23:34:14

标签: cmake packaging

我在一个大项目上工作:很多目标,半小时在四核i7笔记本电脑上构建。

我的目标是构建一个可执行目标,该目标仅依赖于项目中其他目标的一部分,并将其打包为Linux和Windows。我需要结果是"可重定位的"包。也就是说,它不会安装到任何标准位置,但需要在用户解压缩的任何地方运行。

我可以构建有问题的目标,它可以从构建树中运行良好。所以我知道所有的东西都在那里,我只需要打包它们。

听起来应该可以使用install()fixup_bundle()的组合,但在实践中,细节总是会妨碍。这是我到目前为止所尝试的内容。

Naive install-fixup

我尝试的第一件事是

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()没有更改RPATHverify_app()在我的捆绑位置外找到了引用。

摘要

我有一种感觉,我是在与CMake作者合作。意图,应该有另一种更好的解决方法。另外我不知道fixup_bundle()应该如何在Windows下运行。那么正确的方法是什么?

1 个答案:

答案 0 :(得分:0)

如果有人想知道---我最终在GetPrerequisites.cmake之上实现了我自己的安装脚本。

作为一般观察,CMake似乎并未考虑将单个组件单独包装作为可行选项。如果你想这样,你可以自己动手。