我们经常会遇到多个项目使用同一工程的情况,对于android源码,动辄就几十G,采用建立多个工程显然不可取。只能考虑添加板级来解决改问题。
板级的关键在于通过lunch选项,选择不同的板级,最终选择编译不同的文件。
上面提到“选择编译”,选择就涉及到.config里面的配置选项,编译就涉及到Makefile。
关于.config,menuconfig, def_config, Kconfig的相关问题,可以参考如下链接:
https://blog.csdn.net/zhouxiangbai/article/details/54693476
我的工程希望实现的目标是,通过lunch 选择3个不同项目进行编译。lunch选择不同项目对kernel的影响是选择了不同的def_config,我会在def_config中设置我想要默认为y的CONFIG选项。
关于我的工程设置:
在我们执行make menuconfig命令时,会读取各级Kconfig的内容,arch/arm/Kconfig 负责生成最顶层的menuconfig界面的内容。所以我在arch/arm/Kconfig 加入了如下内容:
# add for 3 different project
menu "Test Project Select"
config TEST_OEM_BOARD_PROJECT
bool "Support for test OEM Board project"
default n
help
This is for test oem board project select or not.
config TEST_TOY_BEAR_PROJECT
bool "Support for test Toy Bear project"
default n
help
This is for test toy bear project select or not.
config TEST_CUP_PROJECT
bool "Support for test Cup project"
default n
help
This is for test Cup project select or not.
endmenu
以上选项的默认值设为n,就是默认不选择,为的是通过在不同的def_config文件中决定它是否选择。比如,在def_config中设置了CONFIG_TEST_TOY_BEAR_PROJECT为y,则CONFIG_TEST_TOY_BEAR_PROJECT=y会被各级Makefile识别到,从而根据这个选项来条件编译不同的文件。
在三个工程中,我希望编译不同的dts文件。则只需要在arch/arm/boot/dts/qcom/Makefile文件中加入如下内容:
ifeq ($(CONFIG_TEST_OEM_BOARD_PROJECT),y)
dtb-$(CONFIG_ARCH_MSM8909) += msm8909-pm8916-mtp.dtb \
msm8909-mtp.dtb
else
ifeq ($(CONFIG_TEST_CUP_PROJECT),y)
dtb-$(CONFIG_ARCH_MSM8909) += msm8909-pm8916-mtp-test-cup.dtb \
msm8909-mtp-test-cup.dtb
else
ifeq ($(CONFIG_TEST_TOY_BEAR_PROJECT),y)
dtb-$(CONFIG_ARCH_MSM8909) += msm8909-pm8916-mtp-test-toy-bear.dtb \
msm8909-mtp-test-toy-bear.dtb
endif
endif
endif
这样就实现了lunch不同项目,选择不同def_config,最终选择编译不同的文件。
假如在其他文件夹下还有其他需要选择编译的文件,也只需要修改相应的Kconfig,并在def_config中添加默认值即可。比如:在TEST_CUP_PROJECT和TEST_TOY_BEAR_PROJECT中需要分别编译leds_test_cup.c和leds_test_toy_bear.c文件。则,我们需要在drivers/leds/Kconfig文件加入如下行:
#jiang add for Jeejio cup leds driver
config LEDS_JEEJIO_CUP
bool "Support for Jeejio Cup Leds"
default n
help
This is for jeejio Cup leds driver select.
#jiang add for Jeejio toy bear leds driver
config LEDS_JEEJIO_TOY_BEAR
bool "Support for Jeejio Toy Bear Leds"
default n
help
This is for jeejio toy bear leds driver select.
同时在def_config中添加:
CONFIG_LEDS_JEEJIO_CUP=y
或
CONFIG_LEDS_JEEJIO_TOY_BEAR=y