在 add_custom_target 调用期间创建 cmake 变量

问题描述 投票:0回答:1

我有一个 CI 管道,它会在所需的

.exe
旁边生成一个
dll
。为了实用性,我正在尝试将整个东西打包成 tar.gz 。

所以我尝试声明以下 cmake 代码:

file(
    GLOB 
DLL_FILES 
    ${PROJECT_BINARY_DIR}/*.exe
    ${PROJECT_BINARY_DIR}/*.dll)

add_custom_target(
    generate_tar
    WORKING_DIRECTORY "${PROJECT_BINARY_DIR}"
    COMMAND tar czf "output.tar.gz" ${DLL_FILES})

因此,在管道的末尾,我调用

generate_tar
失败并显示以下消息:
tar: no files or directories specified
,这是可以解释的,因为
file
命令在包含此 CMake 文件时运行,在开始时,我的项目还没有生成。

所以我想在调用

DDL_FILES
时创建这个
add_custom_target
变量,但我找不到如何正确执行此操作的提示(我很愿意使用 CMake)。

cmake tar cmake-custom-command
1个回答
0
投票

我想在调用 add_custom_target 时创建这个 DDL_FILES 变量

你不能——文件不存在。您必须在构建后获取文件。您可以执行 shell,它将执行 globbing 或

find
文件,或者编写一个将从 add_custom_target 或类似文件运行的 cmake 脚本。

add_custom_target(
    generate_tar
    WORKING_DIRECTORY "${PROJECT_BINARY_DIR}"
    COMMAND sh -c 'tar czf "output.tar.gz"  ${PROJECT_BINARY_DIR}/*.exe ${PROJECT_BINARY_DIR}/*.dll'
)

但是如果输入没有改变,为什么会生成output.tar.gz呢?正确的解决方案是枚举所有依赖项、您依赖的所有目标,并从这些目标创建 output.tar.gz。

add_custom_command(
    OUTPUT "${PROJECT_BINARY_DIR}"/output.tar.gz
    DEPENDS some_target some_library
    WORKING_DIRECTORY ${PROJECT_BINARY_DIR}
    COMMAND tar czf "output.tar.gz"
         $<TARGET_FILE:some_target>
         $<TARGET_FILE:some_library>
    VERBATIM
)
add_custom_target(generate_tar DEPENDS "${PROJECT_BINARY_DIR}"/output.tar.gz)
© www.soinside.com 2019 - 2024. All rights reserved.