Cmake:如何在构建所有项目文件后运行add_custom_command()

时间:2017-05-27 01:36:57

标签: build cmake

使用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
) 

我缺少什么,如果有的话?

1 个答案:

答案 0 :(得分:3)

在构建完全完成之后,无法执行添加命令"

  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..."
    )
    
  2. 这将添加在<kernel-target>之后执行的命令,并且将构建其所有依赖项。请注意,在这种情况下缺少 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 文件,该命令将不会再次执行。

    2. add_custom_command

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