Linux内核顶层Makefile的make过程说明二

一.  Linux内核源码的make编译

上一篇文章分析了 Linux内核源码的 make后生成的 vmlinux 所依赖的几个目标。依赖目标包括:

scripts/link-vmlinux.sh
 $(head-y) 、 $(init-y) 、 $(core-y) 、 $(libs-y) 、 $(drivers-y) 和 $(net-y)

本文重点来看一下 $(head-y) 、 $(init-y) 、 $(core-y) 、 $(libs-y) 、 $(drivers-y)$(net-y) 这六个变量的值。

本文续上一篇文章,地址如下:

Linux内核顶层Makefile的make过程说明一_凌肖战的博客-CSDN博客

二.  Linux内核源码的make过程

下面重点分析一下 $(head-y) 、$(init-y)、$(core-y) 、$(libs-y) 、$(drivers-y) $(net-y) 这六个变量的值。

1.  head-y

head-y 定义在文件 arch/arm/Makefile 中,内容如下:

135 head-y := arch/arm/kernel/head$(MMUEXT).o
当不使能 MMU 的话, MMUEXT=-nommu ,如果使能 MMU 的话为空,因为我们一般都是用到MMU。因此 , head-y 最终的 值为:
head-y = arch/arm/kernel/head.o

2.  init-ydrivers-y net-y

在顶层 Makefile 中有如下代码:

558 init-y := init/
559 drivers-y := drivers/ sound/ firmware/
560 net-y := net/
......
896 init-y := $(patsubst %/, %/built-in.o, $(init-y))
898 drivers-y := $(patsubst %/, %/built-in.o, $(drivers-y))
899 net-y := $(patsubst %/, %/built-in.o, $(net-y))
以上可知:init-y、libs-y、drivers-y 和 net-y 最终的值为:
init-y = init/built-in.o
drivers-y = drivers/built-in.o sound/built-in.o firmware/built-in.o
net-y = net/built-in.o

3.  libs-y

libs-y 基本和 init-y 一样,在顶层 Makefile 中存在如下代码:

561 libs-y := lib/
......
900 libs-y1 := $(patsubst %/, %/lib.a, $(libs-y))
901 libs-y2 := $(patsubst %/, %/built-in.o, $(libs-y))
902 libs-y := $(libs-y1) $(libs-y2)
上面的顶层 Makefile 代码可以看出, libs-y 应该等于 lib.a built-in.o ,这个只是一部分!
因为 arch/arm/Makefile 中会向 libs-y 中追加一些值,代码如下:
286 libs-y := arch/arm/lib/ $(libs-y)

arch/arm/Makefile libs-y 的值改为了: arch/arm/lib $(libs-y) ,展开以后为:
libs-y = arch/arm/lib lib/

结合 顶层Makefilearch/arm/Makefile 两个文件的设置,libs-y 最终应该为:

libs-y = arch/arm/lib/lib.a lib/lib.a arch/arm/lib/built-in.o lib/built-in.o

4.  core-y

core-y init-y 也一样,在顶层 Makefile 中有如下代码:
532 core-y := usr/
......
887 core-y += kernel/ mm/ fs/ ipc/ security/ crypto/ block/

但是在 arch/arm/Makefile 中会对 core-y 进行追加,代码如下:

三.  Linux 的 make过程总结

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