mirror of
https://github.com/espressif/esp-idf.git
synced 2026-04-28 03:23:14 +00:00
cbd2482e00
Integrate the ldgen into cmakev2. With this change, it becomes possible to actually link the project executables. In cmakev2, the handling of linker scripts is deferred to idf_build_library, unlike in cmakev1, where linker scripts were added and generated during the target_linker_script call. In cmakev2, the target_linker_script only adds the linker scripts and templates, along with the output filenames for the linker scripts generated from the templates, to the component property. When idf_build_library is called and all the requested components are included, it uses the __get_target_dependencies function to obtain all transitively linked targets to the library interface target. These targets are mapped to the components, and the LIBRARY_COMPONENTS_LINKED library property is set. It contains all components linked to the library interface target. The components from LIBRARY_COMPONENTS_LINKED are used to collect linker fragments and linker scripts utilized in the library. Additionally, all targets transitively linked to the library are used to identify archive files used in the library. This includes component archives and archives added with the add_prebuilt_library function. The archives and ldfragments related to the components linked to the library are used when ldgen generates the linker scripts from templates. The linker scripts, both static and generated by ldgen, are added to the library interface link options and INTERFACE_LINK_DEPENDS property. For generated linker scripts, a custom target is created and added as a dependency for the library interface to ensure they are generated before the link. The difference compared to cmakev1 is that the generated linker scripts, currently only sections.ld, are not global in the project but are generated per library. This means there might be multiple versions of sections.ld depending on the components included in the library. For example, a component like esp_system may be linked to multiple library interface targets, each with a different set of components. This results in different sets of fragment files and library archives and different versions of the sections.ld linker script. This should ensure proper dependencies between targets. In other words, if a component changes its linker fragment, only executables linked to libraries using this component should be re-linked. As a consequence of this approach, the generated linker scripts for different libraries need to have different names or be stored in different directories to avoid overwriting the linker script for one library with the linker script for another library using the same component. This is handled with a suffix, which is based on the library interface target name and appended to the generated linker script. So, for example, there is no sections.ld, but instead sections.ld_fatfs_lib or sections.ld_hello_world_lib. As a next step, we can add a DEFAULT option to idf_build_library and avoid adding the suffix for the default library. Signed-off-by: Frantisek Hrbata <frantisek.hrbata@espressif.com>