我会坚持你原来使用add_custom_command
. 但是,我建议您使用add_custom_command(TARGET ...)
表单而不是add_custom_command(OUTPUT ...)
.
该OUTPUT
版本旨在将输出文件用作同一 CMakeLists.txt 中不同 CMake 目标中的源文件。构建此目标时(就在开始时)调用自定义命令,因为目标需要该文件在该点存在。
在您的情况下,没有目标取决于您的文件 - 它是构建过程的产物。
如果使用add_custom_command(TARGET ...)
,则可以保证每次重建目标时都会执行该命令。如果原始目标(在这种情况下)被更新,使用add_custom_target
要求您记住构建它。test
它还不必要地添加到您的目标列表中——对于一个小项目来说可能不是问题,但对于更大的项目来说可能是这样。
这是我设置命令的方式:
SET(COPY_TO_PATH custom1)
ADD_CUSTOM_COMMAND(TARGET test POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy
$<TARGET_FILE:test>
${COPY_TO_PATH}
COMMENT "Copying 'test' library to '${COPY_TO_PATH}'")
test
这会将命令添加为's的构建后事件。正如您正确识别的那样,硬编码库名称并不好。因此 CMake 提供了“生成器表达式”来处理这个问题。生成器表达式$<TARGET_FILE:test>
解析为由 创建的库的完整路径test
,无论平台或编译器如何。请注意,生成器表达式只能在COMMAND
参数中使用;例如,您不能在COMMENT
零件中使用它们。
实际的命令是调用 CMake 本身 ( ${CMAKE_COMMAND}
) 及其-E
命令行选项。这提供了一种跨平台的方式来实现复制,因为cp
它不是 Windows 命令。要查看所有-E
选项,请运行cmake -E help
.