我在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> [...])
答案 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"
)