如何使CMake'FILE'命令依赖于TARGET或OUTPUT?

时间:2019-06-30 20:52:57

标签: cmake

我在CMake构建中有一些add_custom_command()东西,可以在构建一个elf文件目标后做一些事情:将其转换为srec,用0xFF填充各个区域并创建一个二进制图像,生成CRC并获取图片的大小。 add_custom_command()可以具有DEPENDS,这使得它仅在重新生成elf文件时才运行,这很棒。

我还想做的是使用FILE()创建一个新文件,其中包含二进制文件名,crc和大小(也许采用简单的JSON格式),但是文档暗示我无法执行此文件活动之后我上面提到的事情发生了。

# This command creates the FF-filled binary file.  It uses objcopy to create the srec
# file to operate on.
add_custom_command(
    OUTPUT ThreadingApp.bin filled.srec
    MAIN_DEPENDENCY ThreadingApp.elf
    COMMAND ${CMAKE_OBJCOPY} ARGS -O srec ThreadingApp.elf ThreadingApp.srec
    COMMAND srec_cat.exe ThreadingApp.srec -offset - -minimum-addr ThreadingApp.srec
            −fill 0xFF -over ThreadingApp.srec -o filled.srec
    COMMAND srec_cat.exe filled.srec -o ThreadingApp.bin -binary
    )

# This command creates the CRC
add_custom_command(
    OUTPUT crc.out size.out
    MAIN_DEPENDENCY filled.srec
    COMMAND srec_cat.exe filled.srec -crc32-b-e 0x08100000 -crop 0x08100000 0x08100004 -o - -hex-dump > crc.out
    COMMAND srec_info.exe filled.srec > size.out
    )

file(
    WRITE ThreadingApp.json

    )

看着“ FILE”的提要,我看不到如何在自定义命令已经运行之后才能做到这一点。关于如何在CMake中实现这一目标的任何建议?我的替代方法是编写一个单独的Python脚本,以在add_custom_command中执行以创建json文件。

Reading
  file(READ <filename> <out-var> [...])
  file(STRINGS <filename> <out-var> [...])
  file(<HASH> <filename> <out-var>)
  file(TIMESTAMP <filename> <out-var> [...])

Writing
  file({WRITE | APPEND} <filename> <content>...)
  file({TOUCH | TOUCH_NOCREATE} [<file>...])
  file(GENERATE OUTPUT <output-file> [...])

Filesystem
  file({GLOB | GLOB_RECURSE} <out-var> [...] [<globbing-expr>...])
  file(RENAME <oldname> <newname>)
  file({REMOVE | REMOVE_RECURSE } [<files>...])
  file(MAKE_DIRECTORY [<dir>...])
  file({COPY | INSTALL} <file>... DESTINATION <dir> [...])
  file(SIZE <filename> <out-var>)
  file(READ_SYMLINK <linkname> <out-var>)
  file(CREATE_LINK <original> <linkname> [...])

Path Conversion
  file(RELATIVE_PATH <out-var> <directory> <file>)
  file({TO_CMAKE_PATH | TO_NATIVE_PATH} <path> <out-var>)

Transfer
  file(DOWNLOAD <url> <file> [...])
  file(UPLOAD <file> <url> [...])

Locking
  file(LOCK <path> [...])

1 个答案:

答案 0 :(得分:1)

add_custom_command不同(在 build 阶段执行了COMMAND,FILE()配置立即执行 >处理CMakeLists.txt的阶段。

但是,您可以将FILE()调用放入单独的CMake脚本中,并使用add_custom_command运行此脚本。使用这种方法,将在项目的 build 阶段执行带有FILE()的脚本,您可以使用OUTPUT或TARGET选项:

# File: my_script.cmake
file(...)

# File: CMakeLists.txt:
add_custom_command(OUTPUT | TARGET ...
    COMMAND ${CMAKE_COMMAND} -P "${CMAKE_CURRENT_SOURCE_DIR}/my_script.cmake"
    )