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

Ric*_*ehe 3 cmake

add_custom_command()在构建 elf 文件目标后,我在 CMake 构建中有一些东西可以做一些事情:将其转换为 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

    )
Run Code Online (Sandbox Code Playgroud)

查看“文件”的概要,我不知道如何仅在我的自定义命令已经运行后才能实现这一点。关于如何在 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> [...])
Run Code Online (Sandbox Code Playgroud)

Tsy*_*rev 6

与 to 不同add_custom_command,哪个 COMMAND 在构建阶段FILE()执行,在配置阶段处理时立即执行。CMakeLists.txt

但是,您可以将FILE()调用放入单独的 CMake 脚本中,并使用add_custom_command. 使用这种方法,脚本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"
    )
Run Code Online (Sandbox Code Playgroud)

除了演示的 CMake脚本模式( cmake -P)之外,还有命令行模式( cmake -E),它可以执行基本操作无需编写脚本

# File: CMakeLists.txt:
add_custom_command(OUTPUT | TARGET ...
    COMMAND ${CMAKE_COMMAND} -E echo "<content-of-the-file>" > "</path/to/file>"
    )
Run Code Online (Sandbox Code Playgroud)

另请参阅有关重定向输出的问题add_custom_command如何将 CMake 自定义命令的输出重定向到文件?.

  • CMake 不是构建工具。*配置阶段*完成后,CMake 为**实际**构建工具(Makefile、Visual Studio 等)创建文件。因此在*构建阶段* CMake 语言不被直接支持。 (2认同)