如何将变量传递给cpack?
How to pass variable to cpack?
我有一个 cmake 项目,其中一个安装目标是一组文件。此文件根据配置(发布、调试...)而更改。
我希望能够像这样安装文件:
install(DIRECTORY $<TARGET_FILE_DIR:tgt>
DESTINATION bin
COMPONENT files)
但是cmake不支持。生成器变量不适用于 DIRECTORY。所以我想知道是否有办法将目录保存在某处。缓存或文件,然后将其加载到 cpack 中。
所以我想问题是如何将变量从 cmake 传递到 cpack?
如果您使用 "single-configuration generators (such as make and 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)
CMake 3.5 支持 DIRECTORY
参数的生成器表达式。参见 installing directories。
到目前为止,这似乎是最好的答案(来自 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
)
这是一个相当晚的答案,但我偶然发现了这个问题,试图解决一个稍微不同的问题,该问题也可以概括为:"How do I pass a variable to 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 项目,其中一个安装目标是一组文件。此文件根据配置(发布、调试...)而更改。 我希望能够像这样安装文件:
install(DIRECTORY $<TARGET_FILE_DIR:tgt>
DESTINATION bin
COMPONENT files)
但是cmake不支持。生成器变量不适用于 DIRECTORY。所以我想知道是否有办法将目录保存在某处。缓存或文件,然后将其加载到 cpack 中。
所以我想问题是如何将变量从 cmake 传递到 cpack?
如果您使用 "single-configuration generators (such as make and 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)
CMake 3.5 支持 DIRECTORY
参数的生成器表达式。参见 installing directories。
到目前为止,这似乎是最好的答案(来自 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
)
这是一个相当晚的答案,但我偶然发现了这个问题,试图解决一个稍微不同的问题,该问题也可以概括为:"How do I pass a variable to 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_
似乎可以很好地解决问题...