mirror of
https://github.com/espressif/esp-idf.git
synced 2026-10-01 18:50:34 +03:00
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:
@@ -807,12 +807,20 @@ endfunction()
|
||||
.. code-block:: cmake
|
||||
|
||||
idf_component_include(<name>
|
||||
[OPTIONAL]
|
||||
[INTERFACE <variable>])
|
||||
|
||||
*name[in]*
|
||||
|
||||
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]*
|
||||
|
||||
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
|
||||
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)
|
||||
set(options)
|
||||
set(options OPTIONAL)
|
||||
set(one_value INTERFACE)
|
||||
set(multi_value)
|
||||
cmake_parse_arguments(ARG "${options}" "${one_value}" "${multi_value}" ${ARGN})
|
||||
|
||||
__get_component_interface_or_die(COMPONENT "${name}"
|
||||
OUTPUT component_interface)
|
||||
if(ARG_OPTIONAL)
|
||||
__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
|
||||
# has already been called for it and the component has been processed. If
|
||||
|
||||
Reference in New Issue
Block a user