Linux内核Makefile笔记

本文详细探讨了Linux内核Makefile的组成,包括顶层Makefile、体系结构相关的Makefile和scripts目录下的通用规则文件。重点讲解了Makefile.build如何构建内核目标文件,如.vmlinux的依赖和生成过程,以及编译过程。此外,还分析了目标文件的依赖关系和Makefile中的一些关键规则,如if_changed和FORCE的作用。
摘要由CSDN通过智能技术生成

Linux内核Makefile笔记
周亦行
2014年11月

参考文档
① linux源码Makefile的详细分析
② if_changed_rule/cc_o_c/any-prereq/arg-check
③ Makefile中的伪目标
④ Linux kernel 3.18.5
一、Makefile组成
(一)基本组成

  • 顶层 Makefile
    它是所有Makefile文件的核心,从总体上控制着内核的编译、连接
  • arch/$(ARCH)/Makefile
    对应体系结构的Makefile,它用来决定哪些体系结构相关的文件参与内核的生成,并提供一些规则来生成特定格式的内核映像
  • scripts/Makefile.*
    Makefile公用的通用规则、脚本等
  • 子目录kbuild Makefiles
    各级子目录的Makefile相对简单,被上一层Makefile.build调用来编译当前目录的文件。
  • 顶层.config
    配置文件,配置内核时生成。所有的Makefile文件(包括顶层目录和各级子目录)都是根据.config来决定使用哪些文件的
    (二)通用规则
  • Makefile.build
    被顶层Makefile所调用,与各级子目录的Makefile合起来构成一个完整的Makefile文件,定义built-in.o、.lib以及目标文件.o的生成规则。这个Makefile文件生成了子目录的.lib、built-in.o以及目标文件.o
  • Makefile.clean
    被顶层Makefile所调用,用来删除目标文件等
  • Makefile.lib
    被Makefile.build所调用,主要是对一些变量的处理,比如说在obj-y前边加上obj目录
  • Kbuild.include
    被Makefile.build所调用,定义了一些函数,如if_changed、if_changed_rule、echo-cmd
    (三)总结
  • Linux内核Makefile体系核心的Makefile文件就两个:顶层Makefile、scripts/Makefile.build。
  • 子目录中的Makefile、kbuild不是Makefile文件(完整的Makefile文件),只能算作是Makefile的包含文件。
  • 顶层Makefile文件负责将各个目录生成的*.built-in.o、lib.a等文件连接到一起。而scripts/Makefile.build
    包含子目录中的Makefile文件来生成这些*.built-in.o、lib.a、*.o等文件。

二、内核编译
以s3c6400编译uImage过程为例。一般来说内核的编译过程为

make ARCH=arm s3c6400_defconfig
make ARCH=arm menuconfig
make ARCH=arm -j2 CROSS_COMPILE=arm-linux-gnueabihf- uImage

三、目标文件
编译uImage,自然uImage就是目标文件。内核配置完成后,在顶层目录开始编译内核。但是,uImage却不是在顶层Makefile中定义,而是在arch/$(ARCH)/Makefile中定义。

顶层Makefile文件
534 include $(srctree)/arch/$(SRCARCH)/Makefile
SRCARCH := $(ARCH),即该变量等于架构名称,s3c6400为arm架构。 
arch/arm/Makefile文件
300 BOOT_TARGETS    = zImage Image xipImage bootpImage uImage
305 $(BOOT_TARGETS): vmlinux
306     $(Q)$(MAKE) $(build)=$(boot) MACHINE=$(MACHINE) $(boot)/$@

uImage依赖vmlinux。通过$(Q)$(MAKE) $(build)=$(boot) MACHINE=$(MACHINE) $(boot)/$@指令编译生成。

  • Q的定义:选择静态编译与否(是否打印编译信息)
    顶层Makefile文件:
75 ifeq ($(KBUILD_VERBOSE),1)
76   quiet =
77   Q =    
78 else 
79   quiet=quiet_    
80   Q = @   
81 endif
  • build:值为“-f scripts/Makefile.build
    obj=”实际上就是调用子Makefile–scripts/Makefile.build,然后传递参数目标文件夹。
顶层Makefile文件
352 include $(srctree)/scripts/Kbuild.include
通过include的方式添加Kbuild.include文件。
Kbuild.include文件
170 ###
171 # Shorthand for $(Q)$(MAKE) -f scripts/Makefile.build obj=
172 # Usage:
173 # $(Q)$(MAKE) $(build)=dir
174 build := -f $(srctree)/scripts/Makefile.build obj

四、依赖推导
(一)依赖Vmlinux

顶层Makefile文件
897 # Externally visible symbols (used by link-vmlinux.sh)
898 export KBUILD_VMLINUX_INIT := $(head-y) $(init-y)
899 export KBUILD_VMLINUX_MAIN := $(core-y) $(libs-y) $(drivers-y) $(net-y)
900 export KBUILD_LDS          := arch/$(SRCARCH)/kernel/vmlinux.lds
901 export LDFLAGS_vmlinux
902 # used by scripts/pacmage/Makefile
903 export KBUILD_ALLDIRS := $(sort $(filter-out arch/%,$(vmlinux-alldirs)) arch Documentation include samples scripts tools
  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值