fix(cmakev2): include config-selected default components

This commit is contained in:
Marius Vikhammer
2026-08-21 10:24:17 +08:00
parent f90cd7dd78
commit 702f6354ec
5 changed files with 86 additions and 0 deletions
+6
View File
@@ -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)
+27
View File
@@ -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>...)
*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}"
@@ -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}'
)