From 702f6354ec928483ff3dcd20d2d02ca69546be6c Mon Sep 17 00:00:00 2001 From: Marius Vikhammer Date: Thu, 11 Jun 2026 11:51:37 +0800 Subject: [PATCH] fix(cmakev2): include config-selected default components --- components/esp_gdbstub/project_include.cmake | 8 +++++ components/espcoredump/project_include.cmake | 11 ++++++ tools/cmakev2/idf.cmake | 6 ++++ tools/cmakev2/project.cmake | 27 +++++++++++++++ .../buildv2/test_default_components.py | 34 +++++++++++++++++++ 5 files changed, 86 insertions(+) create mode 100644 components/esp_gdbstub/project_include.cmake create mode 100644 components/espcoredump/project_include.cmake create mode 100644 tools/test_build_system/buildv2/test_default_components.py diff --git a/components/esp_gdbstub/project_include.cmake b/components/esp_gdbstub/project_include.cmake new file mode 100644 index 00000000000..7b1ee4cf05f --- /dev/null +++ b/components/esp_gdbstub/project_include.cmake @@ -0,0 +1,8 @@ +idf_build_get_property(target IDF_TARGET) +idf_build_get_property(non_os_build NON_OS_BUILD) + +if(IDF_BUILD_V2 AND NOT non_os_build AND NOT "${target}" STREQUAL "linux") + if(CONFIG_ESP_SYSTEM_GDBSTUB_RUNTIME OR CONFIG_ESP_SYSTEM_PANIC_GDBSTUB) + idf_project_add_default_build_component(esp_gdbstub) + endif() +endif() diff --git a/components/espcoredump/project_include.cmake b/components/espcoredump/project_include.cmake new file mode 100644 index 00000000000..efa1b6cc35e --- /dev/null +++ b/components/espcoredump/project_include.cmake @@ -0,0 +1,11 @@ +idf_build_get_property(target IDF_TARGET) +idf_build_get_property(non_os_build NON_OS_BUILD) + +if(IDF_BUILD_V2 AND CONFIG_ESP_COREDUMP_ENABLE + AND NOT non_os_build + AND NOT "${target}" STREQUAL "linux") + # This ensures that the component is added to the build when coredump is enabled, + # even if no other component depends on it. + # This allows users to simply enable it in menuconfig without needing to modify their component dependencies. + idf_project_add_default_build_component(espcoredump) +endif() diff --git a/tools/cmakev2/idf.cmake b/tools/cmakev2/idf.cmake index 4472dec7e25..8a8f8edd3c9 100644 --- a/tools/cmakev2/idf.cmake +++ b/tools/cmakev2/idf.cmake @@ -582,6 +582,12 @@ endfunction() component is already included, the idf_component_include function simply returns, as there is nothing further to do except add a new alias target if requested. + + PROJECT_DEFAULT_EXTRA_COMPONENTS + Internal list of additional components to include in the executable + created by idf_project_default. Components should use + idf_project_add_default_build_component rather than modifying this + property directly. #]] add_library(idf_build_properties INTERFACE) diff --git a/tools/cmakev2/project.cmake b/tools/cmakev2/project.cmake index 03e3fbcb351..4dae28d4255 100644 --- a/tools/cmakev2/project.cmake +++ b/tools/cmakev2/project.cmake @@ -730,6 +730,28 @@ function(idf_build_generate_flasher_args) INPUT "${build_dir}/flasher_args.json.in") endfunction() +#[[api +.. cmakev2:function:: idf_project_add_default_build_component + + .. code-block:: cmake + + idf_project_add_default_build_component(...) + + *component[in]* + + Component name to include in the executable created by + :cmakev2:ref:`idf_project_default`. + + Add components to the default project executable. This is intended for + components that need to be built based on sdkconfig alone, for example to + provide linker-section registrations, without making another component + depend on them. This is e.g. the case with coredump which is simply enabled + based on CONFIG_ESP_COREDUMP_ENABLE option, but no other components depend it. +#]] +function(idf_project_add_default_build_component) + idf_build_set_property(PROJECT_DEFAULT_EXTRA_COMPONENTS "${ARGN}" APPEND) +endfunction() + #[[ .. cmakev2:macro:: __project_default @@ -751,6 +773,11 @@ function(__project_default) set(root_components ${shim_components}) else() set(root_components main) + idf_build_get_property(extra_default_components PROJECT_DEFAULT_EXTRA_COMPONENTS) + if(extra_default_components) + list(APPEND root_components ${extra_default_components}) + list(REMOVE_DUPLICATES root_components) + endif() endif() idf_build_executable("${executable}" diff --git a/tools/test_build_system/buildv2/test_default_components.py b/tools/test_build_system/buildv2/test_default_components.py new file mode 100644 index 00000000000..5853df7233b --- /dev/null +++ b/tools/test_build_system/buildv2/test_default_components.py @@ -0,0 +1,34 @@ +# SPDX-FileCopyrightText: 2026 Espressif Systems (Shanghai) CO LTD +# SPDX-License-Identifier: Apache-2.0 +import json +import logging +from pathlib import Path + +import pytest +from test_build_system_helpers import IdfPyFunc + + +@pytest.mark.usefixtures('test_app_copy') +def test_config_selected_default_components(idf_py: IdfPyFunc) -> None: + """Components with a project_include.cmake that calls idf_project_add_default_build_component() + must be pulled into the default build when their Kconfig feature is enabled, even though nothing + in the project explicitly depends on them. + + Enable coredump and gdbstub via sdkconfig.defaults, build, and assert both components end up in + build_components. + """ + logging.info('Testing config-selected default components (coredump, gdbstub)') + + # Coredump to UART (no dedicated coredump partition needed) and runtime gdbstub. + Path('sdkconfig.defaults').write_text('CONFIG_ESP_COREDUMP_ENABLE_TO_UART=y\nCONFIG_ESP_SYSTEM_GDBSTUB_RUNTIME=y\n') + + idf_py('build') + + proj_desc = json.loads(Path('build/project_description.json').read_text()) + build_components = proj_desc.get('build_components', []) + + for comp in ('espcoredump', 'esp_gdbstub'): + assert comp in build_components, ( + f'{comp} should be added as a default build component when its feature is enabled, ' + f'got build_components: {build_components}' + )