这是How can I get a target's output-file's name during CMake's configuration phase (not the generation phase)?的后续
我想实现类似下面的东西:
add_custom_command(
OUTPUT ${CMAKE_BINARY_DIR}/to_zip/$<TARGET_FILE_NAME:Foo>
DEPENDS Foo
COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:Foo>
${CMAKE_BINARY_DIR}/to_zip/$<TARGET_FILE_NAME:Foo>)
list(APPEND ALL_FILES_IN_TO_ZIP
${CMAKE_BINARY_DIR}/to_zip/$<TARGET_FILE_NAME:Foo>)
add_custom_command(
OUTPUT ${CMAKE_BINARY_DIR}/myzip.zip
DEPENDS ${ALL_FILES_IN_TO_ZIP}
COMMAND <zip everything up in ${CMAKE_BINARY_DIR}/to_zip>)
add_custom_target(create-zip DEPENDS ${CMAKE_BINARY_DIR}/to_zip/myzip.zip)
基本上,当我调用create-zip
目标时,我想复制很多文件到${CMAKE_BINARY_DIR}/to_zip
,然后压缩其中的所有内容。上面代码的问题是,我不允许在add_custom_command中使用基于目标的OUTPUT
生成器表达式,因此上面的代码无法工作。
- 3.20版中的新增功能:*
OUTPUT
的参数可以使用一组受限的生成器表达式。不允许使用目标相关表达式。
有没有办法解决这个问题,使其工作?
1条答案
按热度按时间2uluyalo1#
我非常确定您不需要使用目标的输出文件名作为执行复制的自定义命令的
OUTPUT
。(在这里,它跟踪哪些内容发生了变化,如果DEPENDS
中的任何内容发生了变化,它将再次执行操作(文件系统中的修改时间))。您可以只创建一个伪文件,每当目标发生变化并且复制完成后,您就可以对该文件执行touch
(更新文件系统中的修改时间)。或者类似的东西。
当目标文件发生变化时,指示器文件的时间戳会被自定义命令中的touch命令更新。当自定义命令运行时,目标文件和needs-rezip指示器文件会“同步”,这将是在目标文件被重建后运行buildsystem的时候。至少--我很确定事情是这样的。