Linux内核顶层Makefile前期工作分析二

一.  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的准备工作。

你可能感兴趣的:(系统移植篇,linux,arm开发)