cmake 当add_custom_command的OUTPUT参数不支持基于目标的genex时,我如何获得目标文件副本的依赖项跟踪?

pdsfdshx  于 2023-02-12  发布在  其他
关注(0)|答案(1)|浏览(126)

这是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的参数可以使用一组受限的生成器表达式。不允许使用目标相关表达式。

有没有办法解决这个问题,使其工作?

2uluyalo

2uluyalo1#

我非常确定您不需要使用目标的输出文件名作为执行复制的自定义命令的OUTPUT。(在这里,它跟踪哪些内容发生了变化,如果DEPENDS中的任何内容发生了变化,它将再次执行操作(文件系统中的修改时间))。您可以只创建一个伪文件,每当目标发生变化并且复制完成后,您就可以对该文件执行touch(更新文件系统中的修改时间)。

set(targets target_foo target_bar target_baz)
foreach(target "${targets}")
  set(indicator "${CMAKE_BINARY_DIR}/to_zip/rezip_indicators/${target}")
  add_custom_command(
    OUTPUT "${rezip_indicator_file}"
    DEPENDS "${target}"
    COMMAND "${CMAKE_COMMAND}" -E copy $<TARGET_FILE:${target}>
      "${CMAKE_BINARY_DIR}/to_zip/$<TARGET_FILE_NAME:${target}>"
    COMMAND "${CMAKE_COMMAND}" -E touch "${rezip_indicator_file}"
  )
  list(APPEND NEEDS_REZIP_INDICATOR_FILES "${rezip_indicator_file}")
endforeach()

add_custom_command(
  OUTPUT "${CMAKE_BINARY_DIR}/myzip.zip"
  DEPENDS "${NEEDS_REZIP_INDICATOR_FILES}"
  COMMAND <zip everything up in ${CMAKE_BINARY_DIR}/to_zip>
)
add_custom_target(create-zip DEPENDS "${CMAKE_BINARY_DIR}/to_zip/myzip.zip")

或者类似的东西。
当目标文件发生变化时,指示器文件的时间戳会被自定义命令中的touch命令更新。当自定义命令运行时,目标文件和needs-rezip指示器文件会“同步”,这将是在目标文件被重建后运行buildsystem的时候。至少--我很确定事情是这样的。

相关问题