描述linux kernel 的makefile的组织结构,什么是linux kernel 和 makefile 不用说了。
1. 概述
kernel的makefile分为5个部分:
Makefile
|
最外面的Makefile
|
.config
|
kernel的配置文件
|
arch/$(ARCH)/Makefile
|
不同架构cpu的makefile
|
scripts/Makefile.*
|
规则文件
|
kbuild Makefiles
|
500多个makefile文件 |
来看看kbuild makefile文件的构造规则定义。kbuild文件是组织kernel选项的文件。你会看到kbuild 和makefile 在一般同时存在一个目录里的。
目标定义:一般都会用到此定义,此行的目的是要编译成foo.o 文件,而源文件是默认的foo.c或者是foo.s 。源文件在kbuild文件的同级目录里。
obj-y += foo.o
如果要将此编译成一个模块,则需要用ojb-m 。如果想通过kernel的配置传递此参数,则需要写下面的。
obj-$(CONFIG_FOO) += foo.o
(CONFIG_FOO) 就是你在kernel选项里配置的,如果你没有选中是built-in 还是 module,则此变量是y 或者 m的其他值,则不会编译此文件。
built-in 目标文件:当你obj-y 的时候,他们将会把所有的obj-y files 都编译进去一个大的 built-in.o 目标文件。此后,会根据最上层的Makefile 链接成一个kernel image。
#drivers/isdn/i4l/Makefile
# Makefile for the kernel ISDN subsystem and device drivers.
# Each configuration option enables a list of files.
obj-$(CONFIG_ISDN) += isdn.o
obj-$(CONFIG_ISDN_PPP_BSDCOMP) += isdn_bsdcomp.o
需要注意的是,您需要注意这些 目标文件的顺序。
因为一些函数例如(module_init() / __initcall) 是按照他们出现的顺序被调用的。
ojb-m 目标:这个是指要编译成模块。一个模块可以由一个源文件或者多个组成。
例如:
#drivers/isdn/i4l/Makefile
obj-$(CONFIG_ISDN) += isdn.o
isdn-objs := isdn_net_lib.o isdn_v110.o isdn_common.o
isdn-objs 就是将后面所有的目标文件会link到isdn.o 里。
同样isdn-y 也是一样的规则。如果可以让用户配置的则需要这么写。
#fs/ext2/Makefile
obj-$(CONFIG_EXT2_FS) += ext2.o
ext2-y := balloc.o bitmap.o
ext2-$(CONFIG_EXT2_FS_XATTR) += xattr.o
这种情况下,$(CONFIG_EXT2_FS_XATTR) 是y的时候,哪么xattr.o 才会被和其他的2个目标文件一起link到
ext2.o 里。
链接到一个库:
#arch/i386/lib/Makefile
lib-y := checksum.o delay.o
此行的含义标示 将会将此描述的目标文件最后连接到 built-in.o 和 一个 lib.a 文件。
进入下一级文件夹的操作:
一个Makefile 只是负责本目录里文件的编译目标文件的工作。
如果子文件夹的文件需要被照顾到,则需要让父目录的Makefile 给如进入下一级文件夹的入口,则编译的时候会
自动进入下一级目标。
例如:
#fs/Makefile
obj-$(CONFIG_EXT2_FS) += ext2/
阅读(791) | 评论(0) | 转发(0) |