Merge branch 'feat/idf_component_include_optional_v6.1' into 'release/v6.1'

feat(cmakev2/component): add OPTIONAL flag to idf_component_include (v6.1)

See merge request espressif/esp-idf!49570
This commit is contained in:
Roland Dobai
2026-08-27 08:17:12 +02:00
+37 -3
View File
@@ -807,12 +807,20 @@ endfunction()
.. code-block:: cmake .. code-block:: cmake
idf_component_include(<name> idf_component_include(<name>
[OPTIONAL]
[INTERFACE <variable>]) [INTERFACE <variable>])
*name[in]* *name[in]*
Component name. Component name.
*OPTIONAL[opt]*
If specified, the call is a silent no-op when the component is not
known to the build, instead of aborting. When combined with
``INTERFACE``, the output variable is set to the empty string on
miss, so callers can use ``if(${variable})`` as a truth check.
*INTERFACE[out,opt]* *INTERFACE[out,opt]*
Optional variable where the name of the target interface for the Optional variable where the name of the target interface for the
@@ -830,15 +838,41 @@ endfunction()
When the ``INTERFACE`` variable is provided, the name of the included When the ``INTERFACE`` variable is provided, the name of the included
component interface target will be stored in it. component interface target will be stored in it.
By default, the function aborts the build if ``<name>`` is not known to
the build system. Pass ``OPTIONAL`` to make the call non-fatal -- useful
for integrations with components that may or may not be in the build,
such as managed dependencies that only some board configurations pull
in.
.. code-block:: cmake
# Wire up an optional integration only when the component is present.
idf_component_include(button OPTIONAL INTERFACE button_iface)
if(button_iface)
target_sources(${COMPONENT_TARGET} PRIVATE button_glue.c)
target_link_libraries(${COMPONENT_TARGET} PRIVATE ${button_iface})
endif()
#]] #]]
function(idf_component_include name) function(idf_component_include name)
set(options) set(options OPTIONAL)
set(one_value INTERFACE) set(one_value INTERFACE)
set(multi_value) set(multi_value)
cmake_parse_arguments(ARG "${options}" "${one_value}" "${multi_value}" ${ARGN}) cmake_parse_arguments(ARG "${options}" "${one_value}" "${multi_value}" ${ARGN})
__get_component_interface_or_die(COMPONENT "${name}" if(ARG_OPTIONAL)
OUTPUT component_interface) __get_component_interface(COMPONENT "${name}"
OUTPUT component_interface)
if("${component_interface}" STREQUAL "NOTFOUND")
if(DEFINED ARG_INTERFACE)
set(${ARG_INTERFACE} "" PARENT_SCOPE)
endif()
return()
endif()
else()
__get_component_interface_or_die(COMPONENT "${name}"
OUTPUT component_interface)
endif()
# Check if the component is already included, meaning the add_subdirectory # Check if the component is already included, meaning the add_subdirectory
# has already been called for it and the component has been processed. If # has already been called for it and the component has been processed. If