【问题标题】:How to package a target with dependencies using CMake?如何使用 CMake 打包具有依赖项的目标?
【发布时间】: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 下工作。那么正确的方法是什么?

【问题讨论】:

    标签: cmake packaging


    【解决方案1】:

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

    作为一般观察,CMake 似乎并不认为单独包装单个组件是可行的选择。如果你愿意,那就靠你自己。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-25
      相关资源
      最近更新 更多