如何将变量传递给cpack?

Posted

技术标签:

【中文标题】如何将变量传递给cpack?【英文标题】:How to pass variable to cpack? 【发布时间】:2016-02-26 08:44:25 【问题描述】:

我有一个 cmake 项目,其中一个安装目标是文件集合。此文件根据配置(发布、调试...)而变化。 我希望能够像这样安装文件:

install(DIRECTORY $<TARGET_FILE_DIR:tgt>
    DESTINATION bin
    COMPONENT files)

但是 cmake 不支持。生成器变量不适用于 DIRECTORY。所以我想知道是否有办法将目录保存在某处。缓存或文件,然后将其加载到 cpack 中。

所以我想问题是如何将变量从 cmake 传递给 cpack?

【问题讨论】:

根据installdocumentation,只有DESTINATION选项可以使用生成器表达式DIRECTORY选项不能使用 @Tsyvarev 是的,我知道。你有什么想法可以解决我的问题吗? 【参考方案1】:

这是一个相当晚的答案,但我碰巧遇到了这个问题,试图解决一个有点不同的问题,也可以概括为:“如何将变量传递给 CPack?”就我而言,我是从复制到我的工作区的 CPackDeb.cmake 的自定义版本进行此调用的:

find_program(OPKG_CMD NAMES opkg-build HINTS "$OPKG_HINT")
#                                             ^^^^^^^^^^^^
#                                 This is what I wanted to pass to CPack 

我在***CMakeLists.txt 包含的文件中设置OPKG_HINT,但它没有传递给cpack;上面的find_program() 调用看到OPKG_HINT 的空字符串。

结果证明解决方案很简单愚蠢:只需在变量名前面加上CPACK_

如果我在CMakeLists.txt 中这样做:

set(CPACK_OPKG_HINT "$_sysroot_top/aarch64-poky-linux/usr/bin")

然后我可以把它放在我的CPackDeb.cmake 文件中,它工作正常:

find_program(OPKG_CMD NAMES opkg-build HINTS "$CPACK_OPKG_HINT")

无论如何,这对于 OP 来说有点像X-Y problem,但是...如果您真的需要在 CMake 时间以一种可以访问的方式设置变量cpack,在变量名前加上 CPACK_ 似乎可以很好地解决问题...

【讨论】:

感谢您的回答.. 我很挣扎。这有效 您在 CMAKE/CPACK 的文档中对此有参考吗?或者这可能只是一个实现细节(我宁愿不依赖这些)? @ricab,我在文档中找不到任何内容,所以我在 CMake 话语论坛上询问了它:discourse.cmake.org/t/…。 Kitware 的 Brad King 回答说“它应该是稳定的行为”,所以......我想依靠这个是安全的。【参考方案2】:

如果您使用“单一配置生成器(例如 make 和 Ninja)”并使用 CMake 调用,则以下设置有效

cmake -DCMAKE_BUILD_TYPE=Release <source_dir>

https://cmake.org/cmake/help/v3.0/variable/CMAKE_BUILD_TYPE.html

如果您愿意,可以用其他方式定义 $dir 变量。

IF (CMAKE_BUILD_TYPE STREQUAL "Release")
    SET(dir release_dir)
ELSE()
    SET(dir debug_dir)
ENDIF()

INSTALL(DIRECTORY $dir DESTINATION bin COMPONENT files)

【讨论】:

【参考方案3】:

到目前为止,这似乎是最好的答案(来自 cmake 邮件列表中的某个人)

install(DIRECTORY path/to/Debug/dir
  DESTINATION bin
  CONFIGURATIONS Debug
  COMPONENT files
)

install(DIRECTORY path/to/Release/dir
  DESTINATION bin
  CONFIGURATIONS Release
  COMPONENT files
)

【讨论】:

【参考方案4】:

CMake 3.5 支持 DIRECTORY 参数的生成器表达式。见installing directories。

【讨论】:

以上是关于如何将变量传递给cpack?的主要内容,如果未能解决你的问题,请参考以下文章

如何将变量传递给评估函数?

如何将变量从变量传递给指针结构对象?

如何将变量传递给 UIAlertView 委托?

承诺,如何将变量传递给 .then 函数

如何将绑定变量传递给 ObservableObject?

如何将包含斜杠的变量传递给 sed