我在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> [...])
cmake -P <...>
)就是其中之一,而且在各种平台上都非常便携。我不明白为什么你反对这种方法。此外,CMake还有一个命令行模式,可以执行简单的操作而无需编写脚本。 - Tsyvarev