From bb272d1b0a979e03d7eda0660a87522a832b9202 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 ++++-- requirements.txt | 2 +- tools/cmake/build.cmake | 2 ++ tools/cmake/component.cmake | 7 +++++++ tools/cmake/project.cmake | 7 ++++++- 5 files changed, 20 insertions(+), 4 deletions(-) diff --git a/docs/en/api-guides/build-system.rst b/docs/en/api-guides/build-system.rst index 6b0d9be63d..e7c98bb0fd 100644 --- a/docs/en/api-guides/build-system.rst +++ b/docs/en/api-guides/build-system.rst @@ -1398,10 +1398,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`` .. _cmake-file-globbing: diff --git a/requirements.txt b/requirements.txt index a87c0b56d7..c03ab07af3 100644 --- a/requirements.txt +++ b/requirements.txt @@ -17,7 +17,7 @@ cryptography>=2.1.4 pyparsing>=2.0.3,<2.4.0 pyelftools>=0.22 -idf-component-manager~=1.0 +idf-component-manager~=1.2 gdbgui==0.13.2.0; python_version < "3.11" # 0.13.2.1 supports Python 3.6+ only diff --git a/tools/cmake/build.cmake b/tools/cmake/build.cmake index b57be974f3..0711aafd39 100644 --- a/tools/cmake/build.cmake +++ b/tools/cmake/build.cmake @@ -447,10 +447,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 e9b57db0eb..115df72e86 100644 --- a/tools/cmake/component.cmake +++ b/tools/cmake/component.cmake @@ -222,10 +222,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 ae08d07456..a9a4ecc264 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 @@ -408,7 +410,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()