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

S_B*_*alb 4 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
) 
Run Code Online (Sandbox Code Playgroud)

我想念的是什么?

Tsy*_*rev 5

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

  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..."
    )
    
    Run Code Online (Sandbox Code Playgroud)

这将添加要在之后执行的命令,<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>)
    
    Run Code Online (Sandbox Code Playgroud)

    在这种情况下,将在构建所有相关目标之后执行命令。但是,该命令将仅在第一次构建时执行:一旦创建OUTPUT文件,该命令将不再执行。


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