[openharmony]liteos-a全局配置文件生成原理
添加模块并通过LOSCFG_xxx来控制编译
openharmony中liteos-a编译时,是依赖于kconfig生成的系统全局配置文件。所以如果想在liteos-a中增加一个新的模块、sensor驱动等,要增加一个LOSCFG_xxx全局控制时,
需要通过以下方法修改多个文件
.config文件
在liteos中存放全局配置文件的地方在vendor/hisilicon/hispark_taurus/kernel_configs/
目录下,根据build_type区分为debug的和release的
例如需要增加一个ACCL sensor,就可以在这里面的.config文件中增加LOSCFG_DRIVERS_HDF_SENSOR_ACCL=y
Kconfig文件
在模块的Kconfig文件中增加如下内容
config DRIVERS_HDF_SENSOR_ACCEL
bool "Enable HDF accel sensor driver"
default n
depends on DRIVERS_HDF_SENSOR
help
Answer Y to enable HDF accel sensor driver.
注意:不增加Kconfig的话,此配置是无效的
Makefile和BUILD.gn
然后在Mkaefile和BUILD.gn中使用此变量来控制对应模块代码的编译了,如下
Makefile
ifeq ($(LOSCFG_DRIVERS_HDF_SENSOR_ACCEL), y)
LOCAL_SRCS += $(FRAMEWORKS_SENSOR_ROOT)/accel/sensor_accel_driver.c \
$(FRAMEWORKS_SENSOR_ROOT)/chipset/accel/accel_bmi160.c
endif
BUILD.gn
if (defined(LOSCFG_DRIVERS_HDF_SENSOR_ACCEL)) {
sources += [ "$FRAMEWORKS_SENSOR_ROOT/accel/sensor_accel_driver.c" ]
}
原理
-
从编译结果看,全局配置文件会生成在
out/hispark_taurus/ipcamera_hispark_taurus/config.h
中 -
执行源码看config.h是怎么生成的,会搜索到在
kernel/liteos_a/BUILD.gn
里面有下面一段内容exec_script("//build/lite/run_shell_cmd.py", [ "env" + " CONFIG_=LOSCFG_" + " KCONFIG_CONFIG_HEADER='y=true'" + " KCONFIG_CONFIG=$liteos_config_file" + " DEVICE_PATH=$device_path" + " srctree=" + rebase_path(".") + " genconfig" + " --header-path $LITEOS_MENUCONFIG_H" + " --file-list kconfig_files.txt" + " --env-list kconfig_env.txt" + " --config-out config.gni" ], "", [ liteos_config_file ])
通过代码不难看出,是调用的
genconfig
命令,并传入一些env,以及--header-path
、--file-list
、--env-list
、--config-out
参数完成的。可以在编译环境中使用genconfig -h
来查看此命令的用法。
大概的含义就是:通过$liteos_config_file
(对应的就是vendor下面那个.config文件),经过kconfig配置,生成$LITEOS_MENUCONFIG_H
(就是out目录下的config.h)、kconfig_files.txt
、kconfig_env.txt
、config.gni
这四个文件,然后编译时就会使用config.h、config.gni来控制哪些模块参与编译 -
在查看
genconfig
命令实现时发现这是个python脚本,里面内容很简单,如下root@b94e1c14a573:/home/openharmony# which genconfig /usr/local/bin/genconfig root@b94e1c14a573:/home/openharmony# cat /usr/local/bin/genconfig #!/usr/bin/python3 # -*- coding: utf-8 -*- import re import sys from genconfig import main if __name__ == '__main__': sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) sys.exit(main()) root@b94e1c14a573:/home/openharmony#
里面最主要的还是
from genconfig import main
这句,最终调用的就是这个main
接口,成这里的这个genconfig
是python的包路径里面的一个python文件(kconfiglib包下的一个py脚本),如下root@b94e1c14a573:/home/openharmony# ll /usr/local/lib/python3.8/dist-packages/ total 524 drwxrwsr-x 1 root staff 4096 Oct 13 07:33 ./ drwxrwsr-x 1 root staff 4096 Jun 21 09:42 ../ -rw-r--r-- 1 root staff 607 Jun 21 09:45 alldefconfig.py -rw-r--r-- 1 root staff 1222 Jun 21 09:45 allmodconfig.py -rw-r--r-- 1 root staff 1218 Jun 21 09:45 allnoconfig.py -rw-r--r-- 1 root staff 1686 Jun 21 09:45 allyesconfig.py drwxr-sr-x 13 root staff 4096 Jun 21 09:45 Crypto/ -rw-r--r-- 1 root staff 1152 Jun 21 09:45 defconfig.py drwxr-sr-x 3 root staff 4096 Jun 21 09:45 ecdsa/ drwxr-sr-x 2 root staff 4096 Jun 21 09:45 ecdsa-0.17.0.dist-info/ -rw-r--r-- 1 root staff 5326 Oct 13 07:31 genconfig.py -rw-r--r-- 1 root staff 73636 Jun 21 09:45 guiconfig.py drwxr-sr-x 2 root staff 4096 Jun 21 09:45 kconfiglib-14.1.0.dist-info/ -rw-r--r-- 1 root staff 259748 Jun 21 09:45 kconfiglib.py -rw-r--r-- 1 root staff 2619 Jun 21 09:45 listnewconfig.py -rw-r--r-- 1 root staff 104222 Jun 21 09:45 menuconfig.py -rw-r--r-- 1 root staff 8080 Jun 21 09:45 oldconfig.py -rw-r--r-- 1 root staff 761 Jun 21 09:45 olddefconfig.py drwxr-sr-x 1 root staff 4096 Oct 13 07:31 __pycache__/ drwxr-sr-x 2 root staff 4096 Jun 21 09:45 pycryptodome-3.10.1.dist-info/ -rw-r--r-- 1 root staff 1333 Jun 21 09:45 savedefconfig.py -rw-r--r-- 1 root staff 2664 Jun 21 09:45 setconfig.py root@b94e1c14a573:/home/openharmony#