mirror of
https://github.com/espressif/esp-idf.git
synced 2026-08-16 05:35:08 +03:00
Sub-projects like ULP are built as external CMake projects via externalproject_add() and may use toolchains that are completely different from the IDF target toolchain. For example, the ULP RISC-V co-processor on an xtensa target (ESP32-S2/S3) uses riscv32-esp-elf-gcc while the main project uses xtensa-esp-elf-gcc. This causes problems in cmakev2: 1. __init_toolchain() in idf.cmake validates that CMAKE_TOOLCHAIN_FILE matches IDF_TARGET and then overrides it. For sub-projects with custom toolchains (passed via -DCMAKE_TOOLCHAIN_FILE from the parent), this validation fails because the toolchain doesn't follow the IDF naming convention (toolchain-<target>.cmake). 2. Several component project_include.cmake files use functions from the IDF toolchain response file machinery (idf_toolchain_add_flags, idf_toolchain_remove_flags, idf_toolchain_rerun_abi_detection) that are not available in sub-projects with custom toolchains, or perform validation that assumes the IDF target toolchain is in use. Introduce IDF_CUSTOM_TOOLCHAIN, a CMake variable passed via -D from the parent build to indicate that the toolchain was provided externally and should not be resolved or validated by the IDF build system. When IDF_CUSTOM_TOOLCHAIN is set: - __init_toolchain() records the pre-set CMAKE_TOOLCHAIN_FILE and skips IDF_TARGET-based resolution and validation. - Component project_include.cmake files that manipulate IDF toolchain flags (xtensa, esp_libc, esp_psram, soc) return early, as those operations are not applicable to custom toolchains. This is a generic mechanism usable by any sub-project that provides its own toolchain (ULP, or any future sub-project with a non-IDF toolchain). Signed-off-by: Frantisek Hrbata <frantisek.hrbata@espressif.com>
35 lines
1.2 KiB
CMake
35 lines
1.2 KiB
CMake
# Sub-projects with a custom toolchain (e.g. ULP) do not use the IDF
|
|
# toolchain response file machinery. Skip flag manipulation.
|
|
if(IDF_CUSTOM_TOOLCHAIN)
|
|
return()
|
|
endif()
|
|
|
|
if(CONFIG_IDF_TOOLCHAIN_GCC)
|
|
if(CONFIG_STDATOMIC_S32C1I_SPIRAM_WORKAROUND)
|
|
idf_toolchain_add_flags(COMPILE_OPTIONS "-mdisable-hardware-atomics")
|
|
else()
|
|
idf_toolchain_remove_flags(COMPILE_OPTIONS "-mdisable-hardware-atomics")
|
|
endif()
|
|
|
|
if(CONFIG_LIBC_PICOLIBC)
|
|
idf_toolchain_add_flags(COMPILE_OPTIONS "-specs=picolibc.specs")
|
|
if(LIBC_PICOLIBC_NEWLIB_COMPATIBILITY)
|
|
idf_toolchain_add_flags(COMPILE_OPTIONS "-D__STDC_WANT_LIB_EXT1__=0")
|
|
endif()
|
|
else()
|
|
idf_toolchain_remove_flags(COMPILE_OPTIONS "-specs=picolibc.specs")
|
|
endif()
|
|
|
|
if(CONFIG_LIBC_NEWLIB_NANO_FORMAT)
|
|
idf_toolchain_add_flags(LINK_OPTIONS "--specs=nano.specs")
|
|
else()
|
|
idf_toolchain_remove_flags(LINK_OPTIONS "--specs=nano.specs")
|
|
endif()
|
|
|
|
idf_toolchain_rerun_abi_detection()
|
|
else() # TODO IDF-14338
|
|
if(CONFIG_STDATOMIC_S32C1I_SPIRAM_WORKAROUND)
|
|
idf_build_set_property(COMPILE_OPTIONS "-mdisable-hardware-atomics" APPEND)
|
|
endif()
|
|
endif()
|