feat(tools): export information about all components in __COMPONENT_TARGETS

Add new "all_component_info" dictionary into the
project_description.json file. It contains information about all
registered components presented in the __COMPONENT_TARGETS list.
Since components in this list are not fully evaluated, because only the first
stage of cmakefiles processing is done, it does not contain the same information
as the "build_component_info" dictionary. The "type", "file" and "sources" variables
are missing.

Most of the properties are already attached to the component target, so
this only adds INCLUDE_DIRS property to the target during the first cmakefiles
processing stage.

The "all_component_info" dict is generated in a separate function, even
though the original function for "build_component_info" could be
adjusted. This introduces a little bit of boilerplate, but keeps it
logically separated and probably easier if we want to extend it in the
future.

Signed-off-by: Frantisek Hrbata <frantisek.hrbata@espressif.com>
This commit is contained in:
Frantisek Hrbata 2023-10-02 15:31:06 +02:00
parent 17aa60886c
commit 87afd5e829
3 changed files with 66 additions and 4 deletions

View File

@ -119,7 +119,7 @@ function(paths_with_spaces_to_list variable_name)
endif()
endfunction()
function(__component_info components output)
function(__build_component_info components output)
set(components_json "")
foreach(name ${components})
__component_get_target(target ${name})
@ -187,6 +187,62 @@ function(__component_info components output)
set(${output} "${components_json}" PARENT_SCOPE)
endfunction()
function(__all_component_info output)
set(components_json "")
idf_build_get_property(build_prefix __PREFIX)
idf_build_get_property(component_targets __COMPONENT_TARGETS)
foreach(target ${component_targets})
__component_get_property(name ${target} COMPONENT_NAME)
__component_get_property(alias ${target} COMPONENT_ALIAS)
__component_get_property(prefix ${target} __PREFIX)
__component_get_property(dir ${target} COMPONENT_DIR)
__component_get_property(type ${target} COMPONENT_TYPE)
__component_get_property(lib ${target} COMPONENT_LIB)
__component_get_property(reqs ${target} REQUIRES)
__component_get_property(include_dirs ${target} INCLUDE_DIRS)
__component_get_property(priv_reqs ${target} PRIV_REQUIRES)
__component_get_property(managed_reqs ${target} MANAGED_REQUIRES)
__component_get_property(managed_priv_reqs ${target} MANAGED_PRIV_REQUIRES)
if(prefix STREQUAL build_prefix)
set(name ${name})
else()
set(name ${alias})
endif()
make_json_list("${reqs}" reqs)
make_json_list("${priv_reqs}" priv_reqs)
make_json_list("${managed_reqs}" managed_reqs)
make_json_list("${managed_priv_reqs}" managed_priv_reqs)
make_json_list("${include_dirs}" include_dirs)
string(JOIN "\n" component_json
" \"${name}\": {"
" \"alias\": \"${alias}\","
" \"target\": \"${target}\","
" \"prefix\": \"${prefix}\","
" \"dir\": \"${dir}\","
" \"lib\": \"${lib}\","
" \"reqs\": ${reqs},"
" \"priv_reqs\": ${priv_reqs},"
" \"managed_reqs\": ${managed_reqs},"
" \"managed_priv_reqs\": ${managed_priv_reqs},"
" \"include_dirs\": ${include_dirs}"
" }"
)
string(CONFIGURE "${component_json}" component_json)
if(NOT "${components_json}" STREQUAL "")
string(APPEND components_json ",\n")
endif()
string(APPEND components_json "${component_json}")
endforeach()
string(PREPEND components_json "{\n")
string(APPEND components_json "\n }")
set(${output} "${components_json}" PARENT_SCOPE)
endfunction()
#
# Output the built components to the user. Generates files for invoking esp_idf_monitor
# that doubles as an overview of some of the more important build properties.
@ -251,7 +307,8 @@ function(__project_info test_components)
make_json_list("${build_component_paths};${test_component_paths}" build_component_paths_json)
make_json_list("${common_component_reqs}" common_component_reqs_json)
__component_info("${build_components};${test_components}" build_component_info_json)
__build_component_info("${build_components};${test_components}" build_component_info_json)
__all_component_info(all_component_info_json)
# The configure_file function doesn't process generator expressions, which are needed
# e.g. to get component target library(TARGET_LINKER_FILE), so the project_description

View File

@ -1,5 +1,5 @@
{
"version": "1",
"version": "1.1",
"project_name": "${PROJECT_NAME}",
"project_version": "${PROJECT_VER}",
"project_path": "${PROJECT_PATH}",
@ -28,5 +28,6 @@
"build_components" : ${build_components_json},
"build_component_paths" : ${build_component_paths_json},
"build_component_info" : ${build_component_info_json},
"all_component_info" : ${all_component_info_json},
"debug_prefix_map_gdbinit": "${debug_prefix_map_gdbinit}"
}

View File

@ -76,6 +76,7 @@ macro(idf_component_register)
set(__component_requires "${__REQUIRES}")
set(__component_kconfig "${__KCONFIG}")
set(__component_kconfig_projbuild "${__KCONFIG_PROJBUILD}")
set(__component_include_dirs "${__INCLUDE_DIRS}")
set(__component_registered 1)
return()
endmacro()
@ -107,11 +108,13 @@ function(__component_get_requirements)
spaces2list(__component_requires)
spaces2list(__component_priv_requires)
spaces2list(__component_include_dirs)
set(__component_requires "${__component_requires}" PARENT_SCOPE)
set(__component_priv_requires "${__component_priv_requires}" PARENT_SCOPE)
set(__component_kconfig "${__component_kconfig}" PARENT_SCOPE)
set(__component_kconfig_projbuild "${__component_kconfig_projbuild}" PARENT_SCOPE)
set(__component_include_dirs "${__component_include_dirs}" PARENT_SCOPE)
set(__component_registered ${__component_registered} PARENT_SCOPE)
endfunction()
@ -141,7 +144,8 @@ foreach(__component_target ${__component_targets})
set(__contents
"__component_set_property(${__component_target} REQUIRES \"${__component_requires}\")
__component_set_property(${__component_target} PRIV_REQUIRES \"${__component_priv_requires}\")
__component_set_property(${__component_target} __COMPONENT_REGISTERED ${__component_registered})"
__component_set_property(${__component_target} __COMPONENT_REGISTERED ${__component_registered})
__component_set_property(${__component_target} INCLUDE_DIRS \"${__component_include_dirs}\")"
)
if(__component_kconfig)