6

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

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

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

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

4

4 回答 4

5

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

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

我正在设置OPKG_HINT一个包含在我的顶级文件中的文件CMakeLists.txt,但它没有被传递到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 来说是一个XY 问题,但是......如果你真的需要在 CMake 时间以可以访问的方式设置一个变量,那么cpack在变量名前面加上前缀CPACK_似乎可以解决问题很好...

于 2017-10-02T13:46:42.120 回答
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)
于 2016-02-29T14:50:43.863 回答
2

CMake 3.5 支持DIRECTORY参数的生成器表达式。请参阅安装目录

于 2016-02-29T21:41:45.260 回答
2

到目前为止,这似乎是最好的答案(来自 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
)
于 2016-03-01T00:05:20.413 回答