众所周知,Linux内核是通过make命令进行配置和编译的,那么Makefile肯定是少不了的。如此复杂庞大的内核源代码的配置编译,仅靠一个或几个Makefile是绝对不可能的,而需要为Linux内核定制的同样复杂庞大的Makefile系统。虽然她是一个复杂的系统,但大多数内核开发者只需要知道如何使用它就可以了,而无需了解其中的细节。她对大多数内核开发者来说基本上是透明的,隐藏了大部分的实现细节,有效地减轻了开发者的负担,使他们能够专注于内核的开发,而不是把时间和精力花在编译过程上。1.1Linux内核中的Makefile1.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交互。实际的编译是在controlled子目录中的Makefile中控制的。比如“obj-y+=gpio/”,最终编译gpio目录下的哪些文件,完全取决于gpio目录下的Makefile。“obj-$(CONFIG_PCI)+=pci/”的意思是一样的。
