一、Makefiles的组成:
1) Makefile: the top Makefile.
2) .config: the kernel configuration file
3) Arch/*/Makefile:the arch Makefiles.
4) Subdirectory Makefiles:there are about 300 of these.
5) Rules.make: the common rules for all subdirectory Makefiles.
二、Makefile主要产生两块东西:vmlinux(the resident kernel image), modules(any module files)
三、变量
1)VERSION, PATCHLEVEL, SUBLEVEL, EXTRAVERSION
2
. 4 . 19 -rmk4
2)KERNELRELEASE (=$(VERSION).$(PATHCHLEVE).$(SUBLEVEL)$(EXTRAVERSION)
3)ARCH
$ARCH=arm
4)TOPDIR, HPATH
TOPDIR指kernel树的根目录,HPATH指$(TOPDIR)/include
5)SUBDIRS
指Makefile要进入子级的Makefile的目录,例如kernel, drivers, mm, fs, net, ipc, lib
6)HEAD, CORE_FILES, NETWORKS, DRIVERS, LIBS, LINKFLAGS
这些都是特殊的object或lib文件link到vmlinux的,$(HEAD)是首先link的,$(LINKFLAGS)是建vmlinux的flags,他们分别在Makefie和/arch/*/Makefile里被定义
7)CPP,CC, AS,LD, AR,NM, STRIP,OBJCOPY,OBJDUMP,CPPFLAGS,CFLAGS,CFLAGS_KERNEL, MODFLAGS, AFLAGS, LDFLAGS ,PERL, GENKSYMS
这些都是原文件建立目标文件所用到的变量
8)CROSS_COMPILE
指定交叉编译环境arm-linux-
9)HOSTCC,HOSTCFLAGS
指定主机环境$(HOSTCC)=gcc
10)ROOT_DEV, SVGA_MODE, RAMDISK
使用者可编辑有关root变量
11)MAKEBOOT
好象是有关clean, dep, zImage, Image, install的东东
12)INSTALL_PATH
指定image和system..map的存放目录
13)INSTALL_MOD_PATH, MODLIB
INSTAL_MOD_PATH安装模块前缀,MODLIB安装模块目录,一般定义为$(MODLIB) := $(INSTALL_MOD_PATH)/lib/modules/$(KERNELRELEASE)
14)CONFIG_SHELL
有关shell的变量
15)MODVERFILE
16)MAKE, MAKEFILES
四、结构
Makefile & arch Makefile四部分:
1、Arch/*/Makefile,扩展了top Makefile的SUBDIRS,CPP, CC, AS, AR, NM等等,有些arch Makefile为加入特殊的体系flags重定义编译命令。
2、Arch Makefile和top Makefile共同定义规定建立vmlinux文件变量,模块没有特殊结构要求,是完全独立的。
3、vmlinux可进行加工成各种不同文件,如zImage, install,lilo等等,根据不同体系可建立不同文件。
4、强制特殊结构目标(archclean等)
Subdirectory Makefile包括五部分:
1、 Comments(以#开头的注释)
2、 Goal definitions (是核心部分,定义了建立的文件,操作,递归的子目录)
3、 Adapter section(把老式Makefile 转换成新式Makefile)
4、 Rules.make section(就一行:include $(TOPDIR)/Rules.make)
5、 Special rules(包括所有不在Rules.make里的特殊规则)
五:Rules.make 变量
1)子目录变量:makefile只负责所在目录目标文件创建,创建系统需要知道存在makefile的子目录然后在make时递归调用。
ALL_SUB_DIRS, SUB_DIRS, MOD_IN_SUB_DIRS, MOD_SUB_DIRS
定义了子目录,ALL_SUB_DIRS不依赖kernel配置的所有下级目录清单,SUB_DIRS是被包含到vmlinux里的代码,依赖kernel配置的下级目录清单。
2)目标文件变量
O_TARGET, O_OBJS, OX_OBJS
OX_OBJS可以使用EXPORT_SYMBOL宏,而O_OBJS不能。他们都是被包含到vmlinux里的代码,首先生成OX_OBJS, O_OBJS,再link成O_TARGET。
3)库文件变量
L_TARGET, L_OBJS, LX_OBJS
与目标文件变量类似,不同在L_TARGET在未定义符号文件才能出现在vmlinux,一般用O_TARGET。
4)可载入模块变量
M_OBJS, MX_OBJS
5) 多部分模块变量
MI_OBJS, MIX_OBJS
X代表 export symbol ,I代表中间生成物,M代表模块
6) 编译标志变量
EXTRA_CFLAGS, EXTRA_AFLAGS, EXTRA_LADFLAGS, EXTRA_ARFLAGS
对当前目录子目录无效,分别代表CC,编译汇编语言,LD,AR的标志,$(CFLAGS_$@)指特定@文件符号。
7) 其他变量
IGNORE_FLAGS_OBJS USE_STANDARD_AS_RULE