From 89518ee86af0be7ce89b00ca006adcbf5afd79a9 Mon Sep 17 00:00:00 2001 From: Sergei Silnov Date: Fri, 13 May 2022 19:21:30 +0200 Subject: [PATCH] build & config: Check requirements of managed components of main and add interface versioning --- docs/en/api-guides/build-system.rst | 6 ++++-- tools/cmake/build.cmake | 2 ++ tools/cmake/component.cmake | 7 +++++++ tools/cmake/project.cmake | 7 ++++++- 4 files changed, 19 insertions(+), 3 deletions(-) diff --git a/docs/en/api-guides/build-system.rst b/docs/en/api-guides/build-system.rst index 9d5cc38b3c..582cab8190 100644 --- a/docs/en/api-guides/build-system.rst +++ b/docs/en/api-guides/build-system.rst @@ -1280,10 +1280,12 @@ These are properties that describe a component. Values of component properties c - KCONFIG - component Kconfig file; set by ``idf_build_component`` - KCONFIG_PROJBUILD - component Kconfig.projbuild; set by ``idf_build_component`` - LDFRAGMENTS - list of component linker fragment files; set from ``idf_component_register`` LDFRAGMENTS argument +- MANAGED_PRIV_REQUIRES - list of private component dependencies added by the IDF component manager from dependencies in ``idf_component.yml`` manifest file +- MANAGED_REQUIRES - list of public component dependencies added by the IDF component manager from dependencies in ``idf_component.yml`` manifest file - PRIV_INCLUDE_DIRS - list of component private include directories; set from ``idf_component_register`` PRIV_INCLUDE_DIRS on components of type LIBRARY -- PRIV_REQUIRES - list of private component dependentices; set from ``idf_component_register`` PRIV_REQUIRES argument +- PRIV_REQUIRES - list of private component dependentices; set from value of ``idf_component_register`` PRIV_REQUIRES argument and dependencies in ``idf_component.yml`` manifest file - REQUIRED_IDF_TARGETS - list of targets the component supports; set from ``idf_component_register`` EMBED_TXTFILES argument -- REQUIRES - list of public component dependencies; set from ``idf_component_register`` REQUIRES argument +- REQUIRES - list of public component dependencies; set from value of ``idf_component_register`` REQUIRES argument and dependencies in ``idf_component.yml`` manifest file - SRCS - list of component source files; set from SRCS or SRC_DIRS/EXCLUDE_SRCS argument of ``idf_component_register`` - WHOLE_ARCHIVE - if this property is set to ``TRUE`` (or any boolean "true" CMake value: 1, ``ON``, ``YES``, ``Y``), the component library is surrounded by ``-Wl,--whole-archive``, ``-Wl,--no-whole-archive`` when linked. This can be used to force the linker to include every object file into the executable, even if the object file doesn't resolve any references from the rest of the application. This is commonly used when a component contains plugins or modules which rely on link-time registration. This property is ``FALSE`` by default. It can be set to ``TRUE`` from the component CMakeLists.txt file. diff --git a/tools/cmake/build.cmake b/tools/cmake/build.cmake index 185f4a1f7c..050e8aec73 100644 --- a/tools/cmake/build.cmake +++ b/tools/cmake/build.cmake @@ -460,10 +460,12 @@ macro(idf_build_process target) # Call for the component manager to prepare remote dependencies idf_build_get_property(python PYTHON) + idf_build_get_property(component_manager_interface_version __COMPONENT_MANAGER_INTERFACE_VERSION) execute_process(COMMAND ${python} "-m" "idf_component_manager.prepare_components" "--project_dir=${project_dir}" + "--interface_version=${component_manager_interface_version}" "prepare_dependencies" "--local_components_list_file=${local_components_list_file}" "--managed_components_list_file=${managed_components_list_file}" diff --git a/tools/cmake/component.cmake b/tools/cmake/component.cmake index 62e82c7ca8..cea0084bf7 100644 --- a/tools/cmake/component.cmake +++ b/tools/cmake/component.cmake @@ -227,10 +227,17 @@ function(__component_get_requirements) idf_build_get_property(idf_component_manager IDF_COMPONENT_MANAGER) if(idf_component_manager EQUAL 1) idf_build_get_property(python PYTHON) + idf_build_get_property(component_manager_interface_version __COMPONENT_MANAGER_INTERFACE_VERSION) + + # Call for the component manager once again to inject dependencies + # It modifies the requirements file generated by component_get_requirements.cmake script by adding dependencies + # defined in component manager manifests to REQUIRES and PRIV_REQUIRES fields. + # These requirements are also set as MANAGED_REQUIRES and MANAGED_PRIV_REQUIRES component properties. execute_process(COMMAND ${python} "-m" "idf_component_manager.prepare_components" "--project_dir=${project_dir}" + "--interface_version=${component_manager_interface_version}" "inject_requirements" "--idf_path=${idf_path}" "--build_dir=${build_dir}" diff --git a/tools/cmake/project.cmake b/tools/cmake/project.cmake index efb20b83f9..a1cc187669 100644 --- a/tools/cmake/project.cmake +++ b/tools/cmake/project.cmake @@ -43,6 +43,8 @@ endif() if(NOT "$ENV{IDF_COMPONENT_MANAGER}" EQUAL "0") idf_build_set_property(IDF_COMPONENT_MANAGER 1) endif() +# Set component manager interface version +idf_build_set_property(__COMPONENT_MANAGER_INTERFACE_VERSION 1) # # Get the project version from either a version file or the Git revision. This is passed @@ -445,7 +447,10 @@ macro(project project_name) __component_get_target(main_target idf::main) __component_get_property(reqs ${main_target} REQUIRES) __component_get_property(priv_reqs ${main_target} PRIV_REQUIRES) - if(NOT reqs AND NOT priv_reqs) #if user has not set any requirements + __component_get_property(managed_reqs ${main_target} MANAGED_REQUIRES) + __component_get_property(managed_priv_reqs ${main_target} MANAGED_PRIV_REQUIRES) + #if user has not set any requirements, except ones added with the component manager + if((NOT reqs OR reqs STREQUAL managed_reqs) AND (NOT priv_reqs OR priv_reqs STREQUAL managed_priv_reqs)) if(test_components) list(REMOVE_ITEM build_components ${test_components}) endif()