From dc28a9b33fa65915f9e9a4d973c61768824f7b76 Mon Sep 17 00:00:00 2001 From: Fu Hanxi Date: Tue, 28 Jun 2022 12:00:11 +0800 Subject: [PATCH 1/4] build&config: lift property IDF_COMPONENT_MANAGER to root level --- tools/cmake/build.cmake | 30 ++++++++++++++++++++++++++ tools/cmake/component.cmake | 2 +- tools/cmake/project.cmake | 42 +++++++------------------------------ 3 files changed, 38 insertions(+), 36 deletions(-) diff --git a/tools/cmake/build.cmake b/tools/cmake/build.cmake index ce49c6ef54..7e2323179b 100644 --- a/tools/cmake/build.cmake +++ b/tools/cmake/build.cmake @@ -138,6 +138,7 @@ function(__build_init idf_path) idf_build_set_property(__PREFIX idf) idf_build_set_property(__CHECK_PYTHON 1) + idf_build_set_property(IDF_COMPONENT_MANAGER 0) __build_set_default_build_specifications() @@ -404,6 +405,35 @@ macro(idf_build_process target) idf_build_set_property(__COMPONENT_REQUIRES_COMMON ${target} APPEND) + idf_build_get_property(idf_component_manager IDF_COMPONENT_MANAGER) + if(idf_component_manager EQUAL "1") + set(managed_components_list_file ${CMAKE_BINARY_DIR}/managed_components_list.temp.cmake) + + # Call for package manager to prepare remote dependencies + execute_process(COMMAND ${PYTHON} + "-m" + "idf_component_manager.prepare_components" + "--project_dir=${CMAKE_CURRENT_LIST_DIR}" + "prepare_dependencies" + "--managed_components_list_file=${managed_components_list_file}" + RESULT_VARIABLE result + ERROR_VARIABLE error) + + if(NOT result EQUAL 0) + message(FATAL_ERROR "${error}") + endif() + + # Include managed components + include(${managed_components_list_file}) + file(REMOVE ${managed_components_list_file}) + else() + message(VERBOSE "IDF Component manager was explicitly disabled by setting IDF_COMPONENT_MANAGER=0") + if(EXISTS "${CMAKE_CURRENT_LIST_DIR}/idf_project.yml") + message(WARNING "\"idf_project.yml\" file is found in project directory, " + "but component manager is not enabled. Please set IDF_COMPONENT_MANAGER environment variable.") + endif() + endif() + # Perform early expansion of component CMakeLists.txt in CMake scripting mode. # It is here we retrieve the public and private requirements of each component. # It is also here we add the common component requirements to each component's diff --git a/tools/cmake/component.cmake b/tools/cmake/component.cmake index 47c2ecef0b..257adc4d5e 100644 --- a/tools/cmake/component.cmake +++ b/tools/cmake/component.cmake @@ -222,7 +222,7 @@ function(__component_get_requirements) endif() idf_build_get_property(idf_component_manager IDF_COMPONENT_MANAGER) - if(idf_component_manager AND idf_component_manager EQUAL "1") + if(idf_component_manager EQUAL 1) # Call for component manager once again to inject dependencies idf_build_get_property(python PYTHON) execute_process(COMMAND ${python} diff --git a/tools/cmake/project.cmake b/tools/cmake/project.cmake index af7a461098..8c47b1545a 100644 --- a/tools/cmake/project.cmake +++ b/tools/cmake/project.cmake @@ -37,6 +37,13 @@ endif() # value passed externally. __target_init() +# Enable the component manager for regular projects if not explicitly disabled. +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 0) + # # Get the project version from either a version file or the Git revision. This is passed # to the idf_build_process call. Dependencies are also set here for when the version file @@ -173,8 +180,6 @@ function(__project_init components_var test_components_var) endif() endfunction() - idf_build_set_property(IDF_COMPONENT_MANAGER "$ENV{IDF_COMPONENT_MANAGER}") - # Add component directories to the build, given the component filters, exclusions # extra directories, etc. passed from the root CMakeLists.txt. if(COMPONENT_DIRS) @@ -189,39 +194,6 @@ function(__project_init components_var test_components_var) set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS "${CMAKE_CURRENT_LIST_DIR}/idf_project.yml") set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS "${CMAKE_CURRENT_LIST_DIR}/dependencies.lock") - idf_build_get_property(idf_component_manager IDF_COMPONENT_MANAGER) - if(idf_component_manager) - if(idf_component_manager EQUAL "0") - message(VERBOSE "IDF Component manager was explicitly disabled by setting IDF_COMPONENT_MANAGER=0") - elseif(idf_component_manager EQUAL "1") - set(managed_components_list_file ${CMAKE_BINARY_DIR}/managed_components_list.temp.cmake) - - # Call for package manager to prepare remote dependencies - execute_process(COMMAND ${PYTHON} - "-m" - "idf_component_manager.prepare_components" - "--project_dir=${CMAKE_CURRENT_LIST_DIR}" - "prepare_dependencies" - "--managed_components_list_file=${managed_components_list_file}" - RESULT_VARIABLE result - ERROR_VARIABLE error) - - if(NOT result EQUAL 0) - message(FATAL_ERROR "${error}") - endif() - - # Include managed components - include(${managed_components_list_file}) - file(REMOVE ${managed_components_list_file}) - else() - message(WARNING "IDF_COMPONENT_MANAGER environment variable is set to unknown value " - "\"${idf_component_manager}\". If you want to use component manager set it to 1.") - endif() - elseif(EXISTS "${CMAKE_CURRENT_LIST_DIR}/idf_project.yml") - message(WARNING "\"idf_project.yml\" file is found in project directory, " - "but component manager is not enabled. Please set IDF_COMPONENT_MANAGER environment variable.") - endif() - # Look for components in the usual places: CMAKE_CURRENT_LIST_DIR/main, # CMAKE_CURRENT_LIST_DIR/components, and the extra component dirs if(EXISTS "${CMAKE_CURRENT_LIST_DIR}/main") From acded76b4e266c6ccd9a285cf89da28c8fa285ef Mon Sep 17 00:00:00 2001 From: Sergei Silnov Date: Fri, 8 Apr 2022 17:58:05 +0200 Subject: [PATCH 2/4] docs: Enable the component manager by default in CMake --- docs/en/api-guides/tools/idf-component-manager.rst | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/docs/en/api-guides/tools/idf-component-manager.rst b/docs/en/api-guides/tools/idf-component-manager.rst index 3700256194..fcd268c380 100644 --- a/docs/en/api-guides/tools/idf-component-manager.rst +++ b/docs/en/api-guides/tools/idf-component-manager.rst @@ -6,13 +6,6 @@ The IDF Component manager is a tool that downloads dependencies for any ESP-IDF A list of components can be found on ``_ -Activating the Component Manager -================================ - -If CMake is started using ``idf.py`` or `ESP-IDF VSCode Extension `_ then the component manager will be activated by default. - -If CMake is used directly or with some CMake-based IDE like CLion, it's necessary to set the ``IDF_COMPONENT_MANAGER`` environment variable to ``1`` to enable the component manager integration with the build system. - Using with a project ==================== @@ -70,3 +63,8 @@ Defining dependencies in the manifest # # with relative or absolute path # some_local_component: # path: ../../projects/component + +Disabling the Component Manager +=============================== + +The component manager can be explicitly disabled by setting ``IDF_COMPONENT_MANAGER`` environment variable to ``0``. From f76ce89c965a6a8e59ef2c7d96f44f499abf0865 Mon Sep 17 00:00:00 2001 From: Sergei Silnov Date: Wed, 25 May 2022 17:56:59 +0200 Subject: [PATCH 3/4] docs: Add IDF_COMPONENT_MANAGER build property --- docs/en/api-guides/build-system.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/api-guides/build-system.rst b/docs/en/api-guides/build-system.rst index ac05962165..214c651f40 100644 --- a/docs/en/api-guides/build-system.rst +++ b/docs/en/api-guides/build-system.rst @@ -1179,6 +1179,7 @@ These are properties that describe the build. Values of build properties can be - CXX_COMPILE_OPTIONS - compile options applied to all components' C++ source files - EXECUTABLE - project executable; set by call to ``idf_build_executable`` - EXECUTABLE_NAME - name of project executable without extension; set by call to ``idf_build_executable`` +- IDF_COMPONENT_MANAGER - the component manager is enabled by default, but if this property is set to ``0`` it was disabled by the IDF_COMPONENT_MANAGER environment variable - IDF_PATH - ESP-IDF path; set from IDF_PATH environment variable, if not, inferred from the location of ``idf.cmake`` - IDF_TARGET - target chip for the build; set from the required target argument for ``idf_build_process`` - IDF_VER - ESP-IDF version; set from either a version file or the Git revision of the IDF_PATH repository From 62408a687242d7bf56c5b7c95de8d594d3aaaa70 Mon Sep 17 00:00:00 2001 From: Fu Hanxi Date: Wed, 27 Jul 2022 15:07:53 +0800 Subject: [PATCH 4/4] ci: pip install idf-component-manager inside CI --- tools/ci/config/build.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tools/ci/config/build.yml b/tools/ci/config/build.yml index 140c2a48b5..8008c98e92 100644 --- a/tools/ci/config/build.yml +++ b/tools/ci/config/build.yml @@ -164,6 +164,8 @@ build_examples_make: - $BOT_LABEL_REGULAR_TEST - $BOT_LABEL_WEEKEND_TEST script: + # install idf-component-manager inside CI pipeline to avoid breaking python packages dependencies + - pip install "idf-component-manager~=1.1" # it's not possible to build 100% out-of-tree and have the "artifacts" # mechanism work, but this is the next best thing - mkdir -p ${BUILD_PATH}