基于鸿蒙开源的code-1.0,学习
经常使用的是linux内核,直接看到鸿蒙的代码,没有找到详细的配置说明手册有点摸不清楚从哪入手。
编译环境搭建完成,尝试了编译成功后,决定按照自己的学习方法,先从kernel的编译配置入手,开始学习下鸿蒙的kernel。
在linux中kernel的配置一般使用了arch/arm/config中的配置文件进行配置。那么鸿蒙的kernel是从哪里找到的config呢?
进入鸿蒙的kernel/liteos_a,可以看到目录下有几个文件
Makefile
Kconfig
config.mk
build.sh
BUILD.gn
首先先看下makefile和kconfig
因为这两个文件linux内核中经常修改,一看名字比较亲切
粗略看了下Kconfig,和linux的一样,主要是对config的宏进行处理。生成代码中的CONIFG_XX对应的宏。
Makefile主要是编译相关
help:
$(HIDE)echo "-------------------------------------------------------"
$(HIDE)echo "1.====make help: get help infomation of make"
$(HIDE)echo "2.====make: make a debug version based the .config"
$(HIDE)echo "3.====make debug: make a debug version based the .config"
$(HIDE)echo "4.====make release: make a release version for all platform"
$(HIDE)echo "5.====make release PLATFORM=xxx: make a release version only for platform xxx"
$(HIDE)echo "6.====make rootfsdir: make a original rootfs dir"
$(HIDE)echo "7.====make rootfs FSTYPE=***: make a original rootfs img"
$(HIDE)echo "8.====make test: make the testsuits_app and put it into the rootfs dir"
$(HIDE)echo "9.====make test_apps FSTYPE=***: make a rootfs img with the testsuits_app in it"
$(HIDE)echo "xxx should be one of (hi3516cv300 hi3516ev200 hi3556av100/cortex-a53_aarch32 hi3559av100/cortex-a53_aarch64)"
$(HIDE)echo "*** should be one of (jffs2)"
$(HIDE)echo "-------------------------------------------------------"
debug:
$(HIDE)echo "=============== make a debug version ==============="
$(HIDE) $(MAKE) all
.gn文件,以前从来没有接触过,还好文件内容比较简单,对着内容加百度大概学习了一下
import("//build/lite/config/subsystem/lite_subsystem.gni")
**#导入了gni相关模板,文件是lite_subsystem.gni
#在这个文件中主要定义lite_subsystem模板,**
# Defines a subsystem
#
# The lite_subsystem template defines all the modules contained in a subsystem
#
# Parameters
#
# subsystem_components (required)
# [list of scopes] Defines all modules in the subsystem.
#
#
**例如:
template("lite_subsystem") {
#申明lite_subsystem模板,模板定义了一个类似于函数的自定义名称*
assert(defined(invoker.subsystem_components), "subsystem_components in required.")
#gn系统函数assert,判断是否定义魔术变量subsystem_components
#defined:返回是否定义了标识符。
#如果定义了给定参数,则返回true。
#assert如果条件为false,则生成将失败并出现错误。
#如果提供了可选的第二个参数,将打印该字符串
#显示错误消息。**
lite_subsystem_components = invoker.subsystem_components
**#将加载的subsystem_components变量赋值给lite_subsystem_components
#subsystem_components变量可以在项目配置中找到定义**
group(target_name) {
**#创建一个当前目标名称的节点,target_name是当前目标的名称,在这里是使用模板创建的的名称
#例如lite_subsystem("kernel"),则target_name就是kernel
#group就是创建一个节点,这个节点是引用一个或多个其他目标的虚拟依赖关系**
deps = []
**#定义一个空的私有链接依赖**
if(defined(invoker.deps)) {
deps += invoker.deps
**#如果已经有deps依赖,就将依赖加入引用
#deps就是保存需要引入的代码的路径,有点类似于include**
}
**# add subsystem packages**
foreach(pkg_label, lite_subsystem_components) {
**#foreach就是循环整个 lite_subsystem_components列表,pkg_label代表列表的第几个成员
#pkg_label会从指向第一个成员开始
#mylist = [ "a", "b", "c" ]
# foreach(i, mylist) {
# print(i)
# }
#
# Prints:
# a
# b
# c**
deps += [ pkg_label ]
**#将 lite_subsystem_components每个成员加入依赖**
}
}
}
declare_args() {
enable_ohos_kernel_liteos_a_ext_build = true
LOSCFG_TEST_APPS = false
}
**#将给定参数引入当前范围。
#如果未在命令行或工具链的参数中指定它们,则将使用declare_args块中给定的默认值。但是,这些默认值不会
#覆盖命令行值。**
lite_subsystem("kernel") {
**#创建一个kernel名的lite_subsystem,类似于创建一个lite_subsystem的函数,函数名是kernel
#这个模板的参数就是kernel{}中所写的,类似于函数传递的参数**
subsystem_components = []
if (enable_ohos_kernel_liteos_a_ext_build == false) {
subsystem_components += [
"//kernel/liteos_a/kernel",
"//kernel/liteos_a/net",
"//kernel/liteos_a/lib",
"//kernel/liteos_a/compat",
"//kernel/liteos_a/fs",
"//kernel/liteos_a/arch:platform_cpu",
]
if (LOSCFG_SHELL) {
subsystem_components += [ "//kernel/liteos_a/shell" ]
}
} else {
deps = [":make"]
}
}
action("make") {
**#执行make**
script = "//build/lite/build_ext_components.py"
**#脚本路径**
outputs = [ "$target_gen_dir/liteos_a_build_log.txt" ]
**#输出文件**
exec_path = rebase_path(rebase_path(".", root_build_dir))
outdir = rebase_path(get_path_info(".", "out_dir"))
command = "make clean OUTDIR=$outdir && make rootfs VERSION=\"${ohos_version}\" -j 16 OUTDIR=$outdir"
args = [
"--path=$exec_path",
"--prebuilts=sh build.sh ${board_name} ${ohos_build_compiler} ${ohos_build_type}",
**#调用了一个build.sh脚本**
"--command=${command}"
]
}
现在来看看这个build.sh
set -e
echo "sh param:$1,$2,$3"
#获取运行build.sh时后面跟着的三个参数
#$1 ${board_name}
#$2 ${ohos_build_compiler}
#$3 ${ohos_build_type}
source="tools/build/config/$1_release.config"
#加载config文件
destination=".config"
if [ "$2" = "clang" ]; then
if [ "$3" = "debug" ]; then
source="tools/build/config/debug/$1_$2.config"
else
source="tools/build/config/$1_$2_release.config"
fi
elif [ "$2" = "gcc" ]; then
if [ "$3" = "debug" ]; then
source="tools/build/config/$1_debug_shell.config"
else
source="tools/build/config/$1_release.config"
fi
fi
if [ -d "./out" ]; then
rm -rf ./out
fi
if [ -f "$destination" ]; then
rm -rf $destination
fi
cp $source $destination
#把对应项目的config 拷贝到kernel/.config
所以kernel的config文件在对应的tools/build/config/文件目录下。
进入目录tools/build/config/下,看到很多项目对应的config文件
打开文件,看到很多配置,不太清楚是做什么的
############### this is a makefile that you can config it ###############
-include $(LITEOSTOPDIR)/tools/build/mk/los_config.mk
TOP_LD_PATH = $(LITEOSTOPDIR)
SCRIPTS_PATH = $(LITEOS_SCRIPTPATH)
LITEOS_MK_PATH = $(MK_PATH)
LITEOS_SUBDIRS = $(LIB_SUBDIRS)
LIB_BIGODIR = $(LITEOS_LIB_BIGODIR)
##### liteos tables -u ldflags #####
-include $(LITEOS_MK_PATH)/liteos_tables_ldflags.mk
LITEOS_COPTS := $(LITEOS_COPTS_DEBUG) $(LITEOS_COPTS_BASE) \
$(LITEOS_COPTS_EXTRA) $(LITEOS_CORE_COPTS)
LITEOS_CXXOPTS := $(LITEOS_CXXOPTS_BASE)
LITEOS_INCLUDE := $(LITEOS_KERNEL_INCLUDE) $(LITEOS_EXTKERNEL_INCLUDE) \
$(LITEOS_COMPAT_INCLUDE) $(LITEOS_FS_INCLUDE) \
$(LITEOS_NET_INCLUDE) $(LITEOS_LIB_INCLUDE) \
$(LITEOS_DRIVERS_INCLUDE) $(LOSCFG_TOOLS_DEBUG_INCLUDE) \
$(LITEOS_PLATFORM_INCLUDE) $(LITEOS_DFX_INCLUDE) \
$(LITEOS_SECURITY_INCLUDE)
LITEOS_LIBDEP := $(LITEOS_BASELIB)
LITEOS_ASFLAGS := $(LITEOS_ASOPTS) $(LITEOS_INCLUDE)
LITEOS_CFLAGS := $(LITEOS_COPTS) $(LITEOS_CMACRO) \
$(LITEOS_CMACRO_TEST) $(LITEOS_IMAGE_MACRO) \
$(LITEOS_INCLUDE)
LITEOS_CXXFLAGS := $(LITEOS_CXXOPTS) $(LITEOS_CXXMACRO) \
$(LITEOS_CMACRO) $(LITEOS_CXXINCLUDE)
LITEOS_LDFLAGS := $(LITEOS_LD_OPTS) $(LITEOS_LD_PATH) \
$(LITEOS_LD_SCRIPT)
根据配置路径,找到kernel/tools/build/mk/los_config.mk
打开los_config.mk文件看,发现里面是根据config的配置,将需要的代码或者path或者路径加入配置的标志中。