众所周知,Linux内核是运用make指令来装备并编译的,那必定少不了Makefile。如此杂乱、巨大的内核源码绝不或许运用一个或几个Makefile文件来完结装备编译,而是需求一套相同杂乱、巨大,且为Linux内核定制的Makefile体系。
虽然她是一个杂乱的体系,但对绝大部分内核开发者来说只需求知道怎么运用,而无需了解其间的细节。她对绝大部分内核开发者基本上是通明的,躲藏了大部分完结细节,有效地降低了开发者的担负,能使其能专心于内核开发,而不至于花费时刻和精力在编译进程上。
1.1 Linux内核中的Makefile文件
1.1.1 顶层Makefile
源码目录树顶层Makefile是整个内核源码办理的进口,对整个内核的源码编译起着决议性效果。编译内核时,顶层Makefile会按规矩递归历遍内核源码的一切子目录下的Makefile文件,完结各子目录下内核模块的编译。了解一下该Makefile,对内核编译等方面会有所协助。
1. 内核版别号
翻开顶层Makefile,最初的几行记录了内核源码的版别号,一般如下所示:
阐明代码版别为2.6.35.3,编译得到的内核在方针板运转后,输入uname -a指令能够得到印证:
2. 编译操控
(1)体系结构
Linux是一个支撑很多体系结构的操作体系,在编译进程中需指定体系结构,以与实践渠道对应。在顶层Makefile中,经过变量ARCH来指定:
假如没有在编译指令行中指定ARCH参数,体系将会进行本地编译,经过获取本机信息来主动指定:
假如进行ARM嵌入式Linux开发,则有必要指定ARCH为arm(留意大小写,须与arch/目录下的arm共同),如:
当然,也能够修正Makefile,将修正为ARCH ?= $(SUBARCH)修正为ARCH = arm,在指令行直接make即可。
(2)编译器
假如不是进行本地编译,则须指定穿插编译器,经过CROSS_COMPILE来指定。Makefile中与穿插编译器的指定如下:
CONFIG_CROSS_COMPILE是一个装备选项,可在内核装备时分指定。假如在装备内核时分没有指定CONFIG_CROSS_COMPILE,也没有在编译参数指定CROSS_COMPILE,则会选用本地编译器进行编译。
进行ARM嵌入式Linux开发,有必要指定穿插编译器,能够在内核装备经过CONFIG
_CROSS_COMPILE指定穿插编译器,也能够经过CROSS_COMPILE指定。假定运用的穿插编译器是arm-linux-gnueabihf-gcc,则指定CROSS_COMPILE为arm-linux-gnueabihf-:
或许在Makefile中,直接指定CROSS_COMPILE的值:
留意:CROSS_COMPILE指定的穿插编译器有必要事前装置并正确设置体系环境变量;假如没有设置环境变量,则需运用肯定地址,例如:
假如一起指定了ARCH和CROSS_COMPILE,则在编译的时分,只需简略的make就能够了。
1.1.2 子目录的Makefile
在内核源码的子目录中,简直每个子目录都有相应的Makefile文件,办理着对应目录下的代码。对该目录的文件或许子目录的编译操控,Makefile中有两种表明方法,一种是默许挑选编译,用obj-y表明,如:
另一种表明则与内核装备选项相关联,编译与否以及编译方法取决于内核装备,例如:
是否编译wdt.c文件,或许以何种方法编译,取决于内核装备后的变量CONFIG_WDT值:假如在装备中设置为[*],则静态编译到内核,假如装备为[M],则编译为wdt.ko模块,否则不编译。
阐明:受控方针是一个目录,obj-y并不直接决议受控目录的文件以及子目录的文件,仅仅是与受控目录Makefile交互,实践编译操控在受控子目录的Makefile中。例如“obj-y += gpio/”,终究gpio目录下哪些文件被编译,彻底取决于gpio目录下的Makefile。“obj-$(CONFIG_PCI) += pci/”的意义同理。