Просмотр исходного кода

cmake: allow overriding kconfig, kconfig_projbuild on registration

Renz Bagaporo 5 лет назад
Родитель
Сommit
ebf07d353d

+ 5 - 1
docs/en/api-guides/build-system.rst

@@ -1268,7 +1268,9 @@ the first element/member instead.
                          [LDFRAGMENTS ldfragment1 ldfragment2 ...]
                          [REQUIRED_IDF_TARGETS target1 target2 ...]
                          [EMBED_FILES file1 file2 ...]
-                         [EMBED_TXTFILES file1 file2 ...])
+                         [EMBED_TXTFILES file1 file2 ...]
+                         [KCONFIG kconfig]
+                         [KCONFIG_PROJBUILD kconfig_projbuild])
 
 Register a component to the build system. Much like the ``project()`` CMake command, this should be called from the component's 
 CMakeLists.txt directly (not through a function or macro) and is recommended to be called before any other command. Here are some
@@ -1291,6 +1293,8 @@ The arguments for ``idf_component_register`` include:
   - PRIV_REQUIRES - private component requirements for the component; ignored on config-only components
   - LDFRAGMENTS - component linker fragment files
   - REQUIRED_IDF_TARGETS - specify the only target the component supports
+  - KCONFIG - override the default Kconfig file
+  - KCONFIG_PROJBUILD - override the default Kconfig.projbuild file
 
 The following are used for :ref:`embedding data into the component<cmake_embed_data>`, and is considered as source files
 when determining if a component is config-only. This means that even if the component does not specify source files, a static library is still

+ 3 - 1
tools/cmake/component.cmake

@@ -416,9 +416,11 @@ endfunction()
 # @param[in, optional] REQUIRED_IDF_TARGETS (multivalue) the list of IDF build targets that the component only supports
 # @param[in, optional] EMBED_FILES (multivalue) list of binary files to embed with the component
 # @param[in, optional] EMBED_TXTFILES (multivalue) list of text files to embed with the component
+# @param[in, optional] KCONFIG (single value) override the default Kconfig
+# @param[in, optional] KCONFIG_PROJBUILD (single value) override the default Kconfig
 function(idf_component_register)
     set(options)
-    set(single_value)
+    set(single_value KCONFIG KCONFIG_PROJBUILD)
     set(multi_value SRCS SRC_DIRS EXCLUDE_SRCS
                     INCLUDE_DIRS PRIV_INCLUDE_DIRS LDFRAGMENTS REQUIRES
                     PRIV_REQUIRES REQUIRED_IDF_TARGETS EMBED_FILES EMBED_TXTFILES)

+ 21 - 2
tools/cmake/scripts/component_get_requirements.cmake

@@ -23,13 +23,15 @@ endmacro()
 
 macro(idf_component_register)
     set(options)
-    set(single_value)
+    set(single_value KCONFIG KCONFIG_PROJBUILD)
     set(multi_value SRCS SRC_DIRS EXCLUDE_SRCS
                     INCLUDE_DIRS PRIV_INCLUDE_DIRS LDFRAGMENTS REQUIRES
                     PRIV_REQUIRES REQUIRED_IDF_TARGETS EMBED_FILES EMBED_TXTFILES)
     cmake_parse_arguments(_ "${options}" "${single_value}" "${multi_value}" "${ARGN}")
-    set(__component_requires "${__REQUIRES}")
     set(__component_priv_requires "${__PRIV_REQUIRES}")
+    set(__component_requires "${__REQUIRES}")
+    set(__component_kconfig "${__KCONFIG}")
+    set(__component_kconfig_projbuild "${__KCONFIG_PROJBUILD}")
     set(__component_registered 1)
     return()
 endmacro()
@@ -64,6 +66,8 @@ function(__component_get_requirements)
 
     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_registered ${__component_registered} PARENT_SCOPE)
 endfunction()
 
@@ -97,6 +101,21 @@ foreach(__component_target ${__component_targets})
 __component_set_property(${__component_target} PRIV_REQUIRES \"${__component_priv_requires}\")
 __component_set_property(${__component_target} __COMPONENT_REGISTERED ${__component_registered})"
     )
+
+    if(__component_kconfig)
+        get_filename_component(__component_kconfig "${__component_kconfig}" ABSOLUTE)
+        set(__contents 
+"${__contents}\n__component_set_property(${__component_target} KCONFIG \"${__component_kconfig}\""
+            )
+    endif()
+
+    if(__component_kconfig_projbuild)
+        get_filename_component(__component_kconfig "${__component_kconfig}" ABSOLUTE)
+        set(__contents 
+"${__contents}\n__component_set_property(${__component_target} KCONFIG_PROJBUILD \"${__component_kconfig_projbuild}\""
+            )
+    endif()
+
     set(__component_requires_contents "${__component_requires_contents}\n${__contents}")
 endforeach()