mirror of
https://github.com/espressif/esp-idf.git
synced 2026-10-02 11:10:54 +03:00
feat(build-system): Create build system hooks for post-ELF processing
This commit adds new CMake APIs for the build system, viz., idf_build_add_post_elf_dependency() and idf_build_get_post_elf_dependencies(). These APIs allow components to add post-ELF processing hooks before the binary file is generated. Closes https://github.com/espressif/esp-idf/issues/17251
This commit is contained in:
@@ -1343,6 +1343,51 @@ ESP-IDF 构建命令
|
||||
获取指定配置的值。就像构建属性一样,特定 *GENERATOR_EXPRESSION* 将检索该配置的生成器表达式字符串,而不是实际值,即可以与支持生成器表达式的 CMake 命令一起使用。然而,实际的配置值只有在调用 ``idf_build_process`` 后才能知道。
|
||||
|
||||
|
||||
.. code-block:: none
|
||||
|
||||
idf_build_add_post_elf_dependency(elf_filename dep_target)
|
||||
|
||||
注册一个在 ELF 链接完成之后(post-ELF)且在生成二进制镜像之前必须运行的依赖。适用于组件在执行 ``elf2image`` 之前需要对 ELF 进行就地处理的场景(例如,插入元数据、剥离段或生成额外的符号文件)。依赖目标 ``dep_target`` 必须是一个有效的 CMake 目标。如果您的规则读取或修改 ELF,请将 ELF 文件声明为自定义命令的 ``DEPENDS``。
|
||||
|
||||
.. important:: 避免构建循环
|
||||
|
||||
创建 post-ELF 步骤时,确保构建图保持无环:
|
||||
|
||||
- 不要将 ELF 本身作为自定义命令的输出。产生一个单独的输出(例如,``app.elf.post``、``app.elf.symbols`` 或简单的标记文件)。
|
||||
- 如果必须就地修改 ELF,还要产生一个额外的输出文件,并将其时间戳更新为比修改后的 ELF 更新(例如,使用 ``cmake -E touch``)。这确保输出文件比修改后的 ELF 具有更新的时间戳,因此 CMake 认为规则已满足,不会在后续构建中重新运行它。
|
||||
- 遵循这些规则可确保 post-ELF 钩子按预期顺序运行,而不会触发无限重建循环。
|
||||
|
||||
示例:
|
||||
|
||||
.. code-block:: cmake
|
||||
|
||||
# 创建一个自定义命令来在链接后处理 ELF 文件
|
||||
idf_build_get_property(elf_target EXECUTABLE GENERATOR_EXPRESSION)
|
||||
add_custom_command(
|
||||
OUTPUT "${CMAKE_BINARY_DIR}/${CMAKE_PROJECT_NAME}.stripped_marker"
|
||||
COMMAND ${CMAKE_OBJCOPY} --strip-debug
|
||||
"$<TARGET_FILE:$<GENEX_EVAL:${elf_target}>>"
|
||||
COMMAND ${CMAKE_COMMAND} -E touch
|
||||
"${CMAKE_BINARY_DIR}/${CMAKE_PROJECT_NAME}.stripped_marker"
|
||||
DEPENDS "$<TARGET_FILE:$<GENEX_EVAL:${elf_target}>>"
|
||||
)
|
||||
|
||||
# 将其包装在自定义目标中
|
||||
add_custom_target(strip_elf DEPENDS
|
||||
"${CMAKE_BINARY_DIR}/${CMAKE_PROJECT_NAME}.stripped_marker"
|
||||
)
|
||||
|
||||
# 注册它在 ELF 链接后但在 BIN 生成前运行
|
||||
idf_build_add_post_elf_dependency("${CMAKE_PROJECT_NAME}.elf" strip_elf)
|
||||
|
||||
|
||||
.. code-block:: none
|
||||
|
||||
idf_build_get_post_elf_dependencies(elf_filename out_var)
|
||||
|
||||
获取指定 ELF 文件名 ``elf_filename`` 已注册的 post-ELF 依赖列表,并将结果存入 ``out_var``。
|
||||
|
||||
|
||||
.. _cmake-build-properties:
|
||||
|
||||
ESP-IDF 构建属性
|
||||
|
||||
Reference in New Issue
Block a user