【问题标题】:Cmake: How to have add_custom_command() run after all project files are builtCmake:如何在构建所有项目文件后运行 add_custom_command()
【发布时间】:2017-05-27 01:36:56
【问题描述】:

使用 Cmake v3.8,我需要我的自定义命令仅在生成新构建的 .hex、.map 和 .elf 文件后运行。但是,在生成所有 *.hex、*.map 和 *.elf 文件后,该命令并未真正运行。这是我所拥有的:

    add_custom_command(
    POST_BUILD
    COMMAND python ${CMAKE_CURRENT_SOURCE_DIR}/performCrc32.py
    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
    OUTPUT  performCrc32.out
    COMMENT "Running CRC32 check..."
)
add_custom_target(
    performCrc32 ALL
    DEPENDS performCrc32.py
    performCrc32.out
) 

如果有的话,我错过了什么?

【问题讨论】:

  • 提供创建 .hex.map.elf 文件的代码。
  • 构建完成后会创建 .hex、.map 和 .elf 文件。我需要在构建完全完成后运行我的自定义命令。我认为添加限定符“POST_BUILD”会为我提供必要的时序要求,但事实并非如此。 performCrc32.py 在构建新的 .hex、.map 和 .elf 文件之前运行。 “execute_process()”在 Cmake 生成期间运行,因此它也没有为我提供我需要的东西。

标签: build cmake


【解决方案1】:

“在构建完全完成后”无法执行添加命令。

  1. 您可以添加要在构建特定目标后执行的命令:

    add_custom_command(TARGET <kernel-target> POST_BUILD
        COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/performCrc32.py
        WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
        COMMENT "Running CRC32 check..."
    )
    

这将添加要在&lt;kernel-target&gt; 之后执行的命令,并且将构建其所有依赖项。注意在这种情况下没有 OUTPUT 选项。

这是构建后检查的首选方式,因为每次目标实际(重新)构建时都会执行检查。

  1. 您可以将您的自定义命令绑定到您的自定义目标(像往常一样),并为目标添加依赖项

    add_custom_command(
        COMMAND python ${CMAKE_CURRENT_SOURCE_DIR}/performCrc32.py
        WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
        OUTPUT  performCrc32.out
        COMMENT "Running CRC32 check..."
    )
    add_custom_target(
        performCrc32 ALL
        DEPENDS performCrc32.py
        performCrc32.out
    ) 
    
    add_dependencies(performCrc32 <hex-targets...> <map-targets> <elf-target>)
    

    在这种情况下,命令将在所有依赖目标构建完成后执行。但是,该命令只会在第一次构建时执行:一旦创建 OUTPUT 文件,该命令将不会再次执行。


add_custom_command

POST_BUILD 选项仅适用于该命令的 TARGET 流,如上所述。我很好奇为什么当您使用 POST_BUILD 而没有 TARGET 时,CMake 不会为您的情况发出错误。

【讨论】:

  • 您描述的 Option 1) 似乎是一个可行的选择。 “”仅仅是.hex/.map/.elfs 的完整路径吗?这是我遇到的错误.... ** CMakeLists.txt:30 (add_custom_command) 处的 CMake 错误:No TARGET '/Users/sami/dev/Github_repo/CalaTWO-NRF52832/build/bin/Release/Target/ my_app.hex' 已在此目录中创建。** 但是,my_app.hex 确实存在。
  • &lt;kernel-target&gt; 是一个目标。在 CMake 中,target 不是 file.
  • 我不确定我是否理解您的最后评论。 ,对我来说,似乎是一个 .hex 文件或一个 .bin 文件等。你说“在 CMake 中目标不是文件”——因此 target 永远不是文件? target 不能简单地成为现有文件的路径吗?
  • Can't target simply be a path to existing files? 是的,它不能。您可能有一个名为app 的目标和一个名为app 的文件(在当前二进制目录中),但是每当您使用app 作为目标 时,CMake 永远不会检查文件 app. 在我的回答中,我假设您有 target &lt;kernel-target&gt;,它的创建方式类似于 add_custom_target(&lt;kernel-target&gt; DEPENDS &lt;elf-file&gt; ...)。在这种情况下,target 被认为是在构建 file &lt;elf-file&gt; 时构建的。这就是为什么我要求您提供创建这些文件的 CMake 代码 - 使用该代码,我的答案会更具体
猜你喜欢
  • 2011-02-25
  • 2013-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多