https://blog.csdn.net/clam_zxf/article/details/79467422 Linux驱动移植之makefile编译系统学习(一)
https://blog.csdn.net/haoel/article/details/2886 跟我一起写 Makefile
- linux
来源
而对于选择哪个defconfig是定义在device/qcom/msmXXX/AndroidBoard.mk里面
build/core/tasks/kernel.mk 定义生成内核的规则Tips:
config编译生成的中间文件放在out/target/product/xxxx/obj/KERNEL_OBJ/.config.
如果添加驱动后.c没有编译到,可以到这文件里面确认相关config是否有配置成功。
build/core/tasks/kernel.mk 定义生成内核的规则
而$(CONFIG_XXXXX)的开关是在kernel/arm/arm64/config/msmxxx_defconfig里面定义的
我们一个项目通常对应两个msmxxx_defconfig,一个是msmxxx_defconfig一个是msmxxx-perf_defconfig
msmxxx_defconfig里面有很多debug开关是打开的,msmxxx-perf_defconfig是user版本默认的配置的,所以提 交配置两个文件通常都需要提交。
build/core/tasks/kernel.mk
定义生成内核的规则
TARGET_AUTO_KDIR 自动设置的内核目录
TARGET_KERNEL_SOURCE 内核源码目录
默认 kernel// 一般在BoardConfig.mk里配置
KERNEL_SRC 内核源码目录
KERNEL_DEFCONFIG 编译内核用的配置文件
一般在BoardConfig.mk里配置
VARIANT_DEFCONFIG 变量配置
一般在BoardConfig.mk里配置
TARGET_KERNEL_SELINUX_CONFIG selinux配置
一般在BoardConfig.mk里配置
selinux配置
一般在BoardConfig.mk里配置
KERNEL_OUT#重点,生成的目标文件
KERNEL_OUT := $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ
示例: 目标文件的路径:out/target/product/i9100/obj/KERNEL_OBJ
我们生成的目标文件路径在:out/target/product/projectname/obj/KERNEL_OBJ;
在该目录下面有driver、framework等。
BOARD_USES_UBOOT 是否启用uboot
一般在BoardConfig.mk里配置
BOARD_USES_UNCOMPRESSED_BOOT 是否启用无压缩的boot
一般在BoardConfig.mk里配置
KERNEL_MODULES_INSTALL 内核模块的安装目录
KERNEL_MODULES_OUT 内核模块的的实际安装目录
KERNEL_MODULES_OUT :=
(
T
A
R
G
E
T
O
U
T
)
/
l
i
b
/
m
o
d
u
l
e
s
o
u
t
/
t
a
r
g
e
t
/
p
r
o
d
u
c
t
/
i
9100
/
s
y
s
t
e
m
/
l
i
b
/
m
o
d
u
l
e
s
T
A
R
G
E
T
K
E
R
N
E
L
M
O
D
U
L
E
S
i
f
e
q
(
(TARGET_OUT)/lib/modules out/target/product/i9100/system/lib/modules TARGET_KERNEL_MODULES ifeq (
(TARGETOUT)/lib/modulesout/target/product/i9100/system/lib/modulesTARGETKERNELMODULESifeq((TARGET_KERNEL_MODULES),)
TARGET_KERNEL_MODULES := no-external-modules
endif
Target:
(
K
E
R
N
E
L
O
U
T
)
创
建
(KERNEL_OUT) 创建
(KERNELOUT)创建(KERNEL_OUT)目录
即目录out/target/product/i9100/obj/KERNEL_OBJ
Target: $(KERNEL_CONFIG)
Target: $(KERNEL_CONFIG) 生成编译内核源代码用的配置文件
$(KERNEL_CONFIG): $(KERNEL_OUT)
$(MAKE) $(MAKE_FLAGS) -C
(
K
E
R
N
E
L
S
R
C
)
O
=
(KERNEL_SRC) O=
(KERNELSRC)O=(KERNEL_OUT) ARCH=$(TARGET_ARCH)
(
A
R
M
C
R
O
S
S
C
O
M
P
I
L
E
)
V
A
R
I
A
N
T
D
E
F
C
O
N
F
I
G
=
(ARM_CROSS_COMPILE) VARIANT_DEFCONFIG=
(ARMCROSSCOMPILE)VARIANTDEFCONFIG=(VARIANT_DEFCONFIG) SELINUX_DEFCONFIG=$(SELINUX_DEFCONFIG) $(KERNEL_DEFCONFIG)
Target: $(KERNEL_OUT)/piggy
Target: $(KERNEL_OUT)/piggy 生成piggy内核
$(KERNEL_OUT)/piggy : $(TARGET_PREBUILT_INT_KERNEL)
$(hide) gunzip -c
(
K
E
R
N
E
L
O
U
T
)
/
a
r
c
h
/
(KERNEL_OUT)/arch/
(KERNELOUT)/arch/(TARGET_ARCH)/boot/compressed/piggy.gzip > $(KERNEL_OUT)/piggy
Target: $(TARGET_PREBUILT_INT_KERNEL) 安装模块,并清除先前不用的模块所在目录