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)
与 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 自定义命令的输出重定向到文件?.
| 归档时间: |
|
| 查看次数: |
2192 次 |
| 最近记录: |