我有一个 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)。
我想在调用 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)