一. Linux内核顶层Makefile前期工作
本文继续分析 Linux内核源码的 顶层 Makefile所做的准备工作。
本文续上一篇文章,地址如下:
Linux内核顶层Makefile前期工作分析一_凌肖战的博客-CSDN博客
二. 内核顶层Makefile前期工作
7. 模块编译
Linux
允许单独编译某个模块,使用命令“
make M=dir
”即可,旧语法“
make SUBDIRS=dir
”
也是支持的。顶层
Makefile
中的代码如下:
182 ifdef SUBDIRS
183 KBUILD_EXTMOD ?= $(SUBDIRS)
184 endif
185
186 ifeq ("$(origin M)", "command line")
187 KBUILD_EXTMOD := $(M)
188 endif
189
190 # If building an external module we do not care about the all: rule
191 # but instead _all depend on modules
192 PHONY += all
193 ifeq ($(KBUILD_EXTMOD),)
194 _all: all
195 else
196 _all: modules
197 endif
198
199 ifeq ($(KBUILD_SRC),)
200 # building in the source tree
201 srctree := .
202 else
203 ifeq ($(KBUILD_SRC)/,$(dir $(CURDIR)))
204 # building in a subdirectory of the source tree
205 srctree := ..
206 else
207 srctree := $(KBUILD_SRC)
208 endif
209 endif
210 objtree := .
211 src := $(srctree)
212 obj := $(objtree)
213
214 VPATH := $(srctree)$(if $(KBUILD_EXTMOD),:$(KBUILD_EXTMOD))
215
216 export srctree objtree VPATH
外部模块编译过程和
uboot
也一样,最终导出
srctree
、
objtree
和
VPATH
这三个变量的值,
其中
srctree=.
,也就是当前目录,
objtree
同样为“
.
”。
8. 设置目标架构和交叉编译器
同
uboot
一样,
Linux
编译的时候需要设置目标板架构
ARCH
和交叉编译器
CROSS_COMPILE
,
在顶层
Makefile
中代码如下:
252 ARCH ?= $(SUBARCH)
253 CROSS_COMPILE ?= $(CONFIG_CROSS_COMPILE:"%"=%)
为了方便,一般直接修改顶层
Makefile
中的
ARCH
和
CROSS_COMPILE
,直接将其设置
为对应的架构和编译器。例如,这里改为如下:
252 ARCH ?= arm
253 CROSS_COMPILE ?= arm-linux-gnueabihf-
9、调用 scripts/Kbuild.include 文件
同
uboot
一样,
Linux
顶层
Makefile
也会调用文件
scripts/Kbuild.include
,顶层
Makefile
相
应代码如下:
349 scripts/Kbuild.include: ;
350 include scripts/Kbuild.include
10、设置交叉编译工具变量
顶层
Makefile
中其他和交叉编译器有关的变量设置如下:
353 AS = $(CROSS_COMPILE)as
354 LD = $(CROSS_COMPILE)ld
355 CC = $(CROSS_COMPILE)gcc
356 CPP = $(CC) -E
357 AR = $(CROSS_COMPILE)ar
358 NM = $(CROSS_COMPILE)nm
359 STRIP = $(CROSS_COMPILE)strip
360 OBJCOPY = $(CROSS_COMPILE)objcopy
361 OBJDUMP = $(CROSS_COMPILE)objdump
LA
、
LD
、
CC
等这些都是交叉编译器所使用的工具。
11、头文件路径变量
顶层
Makefile
定义了两个变量保存头文件路径:
USERINCLUDE
和
LINUXINCLUDE
,相
关代码如下:
381 USERINCLUDE := \
382 -I$(srctree)/arch/$(hdr-arch)/include/uapi \
383 -Iarch/$(hdr-arch)/include/generated/uapi \
384 -I$(srctree)/include/uapi \
385 -Iinclude/generated/uapi \
386 -include $(srctree)/include/linux/kconfig.h
387
388 # Use LINUXINCLUDE when you must reference the include/ directory.
389 # Needed to be compatible with the O= option
390 LINUXINCLUDE := \
391 -I$(srctree)/arch/$(hdr-arch)/include \
392 -Iarch/$(hdr-arch)/include/generated/uapi \
393 -Iarch/$(hdr-arch)/include/generated \
394 $(if $(KBUILD_SRC), -I$(srctree)/include) \
395 -Iinclude \
396 $(USERINCLUDE)
第
381~386
行是
USERINCLUDE
是
UAPI
相关的头文件路径,第
390~396
行是
LINUXINCLUDE
是
Linux
内核源码的头文件路径。
12、导出变量
顶层
Makefile
会导出很多变量给子
Makefile
使用,导出的这些变量如下:
417 export VERSION PATCHLEVEL SUBLEVEL KERNELRELEASE KERNELVERSION
418 export ARCH SRCARCH CONFIG_SHELL HOSTCC HOSTCFLAGS CROSS_COMPILE AS
LD CC
419 export CPP AR NM STRIP OBJCOPY OBJDUMP
420 export MAKE AWK GENKSYMS INSTALLKERNEL PERL PYTHON UTS_MACHINE
421 export HOSTCXX HOSTCXXFLAGS LDFLAGS_MODULE CHECK CHECKFLAGS
422
423 export KBUILD_CPPFLAGS NOSTDINC_FLAGS LINUXINCLUDE OBJCOPYFLAGS
LDFLAGS
424 export KBUILD_CFLAGS CFLAGS_KERNEL CFLAGS_MODULE CFLAGS_GCOV
CFLAGS_KASAN
425 export KBUILD_AFLAGS AFLAGS_KERNEL AFLAGS_MODULE
426 export KBUILD_AFLAGS_MODULE KBUILD_CFLAGS_MODULE
KBUILD_LDFLAGS_MODULE
427 export KBUILD_AFLAGS_KERNEL KBUILD_CFLAGS_KERNEL
428 export KBUILD_ARFLAGS
下一篇继续了解 Linux内核源码的顶层Makefile的准备工作。