本文主要是介绍Linux Makefile.txt 分析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
linux 2.6.x Makefile
linux-2.6.x makefile
linux-2.6.20.6/Documentation/kbuild/makefiles.txt
一、 概述
linux的makefile有五个部分:
Makefile:顶层Makefile
.config:内核配置文件
arch/$(ARCH)/Makefile:体系结构相关的Makefile
scripts/Makefile.*:通用的规则等,用于所有的kbuild Makefiles
kbuild Makefiles:大约有500个这样的makefile
顶层Makefile读取在内核配置过程中生成的.config文件。负责构建两个主要的文件:vmlinux和各模块。它还包含了一个名为arch/$(ARCH)/Makefile的体系结构相关Makefile,这个Makefile给顶层Makefile提供了体系结构相关的信息。
每个子目录有一个kbuild Makefile,它执行上层传入的命令。kbuild Makefile使用.config文件中的信息构建各种文件列表,供kbuild构建任何built-in或modular目标时使用。
scripts/Makefile.*包含所有的定义和规则等,这些被用来和kbuild makeflie一起构建内核
二、 kbuild文件
kbuild Makefile中的语法。
kbuild文件首选的文件名是”Makefile”,也可以用”kbuild”。如果”Makefile”和”kbuild”同时存在,则使用”kbuild”文件。
1、 目标定义
目标定义是kbuild Makefile的主要部分。这些行定义了要被编译的文件、所有指定的编码选项及所有将要递归进入的子目录。
最简单的kbuild Makefile包括一行:
obj-y += foo.o
如果foo.o要被编译成模块,就用obj-m。因此,经常使用下面的模式:
obj-$(CONFIG_FOO) += foo.o
$(CONFIG_FOO)的值是y (for built-in)或者m(for module)。如果CONFIG_FOO既不是y也不是m,这个文件不会被编译或链接
2、 Built-in 对象目标 - obj-y
kbuild Makefile 在$(obj-y)列表中给vmlinux指定目标文件,这个列表依赖于内核配置。
kbuild 编译所有的$(obj-y)文件,然后调用”$(LD) –r”把这些文件合并成一个built-in.o文件,之后built-in.o被顶层Makefile链接成vmlinux。
$(obj-y)中文件的顺序很重要,在这个列表中,完全相同的文件可以同时存在:第一个被链接到built-in.o,以后的都被忽略了。
链接顺序也很重要,因为特定的函数(module_init() / __initcall)会在启动期间按照它们出现的顺序被调用。
3、 可加载模块目标 - obj-m
$(obj-m)指定被编译为可加载内核模块的文件。一个模块可以是一个或多个源文件编译生成。如果是一个源文件,kbuild makefile只是简单的把这个文件加入$(obj-m)。如果内核模块由多个源文件编译生成,内核要知道你想要编译哪些源文件,所以你必须设置变量$(-objs)来告诉内核。
eg.
#derivers/isdn/i4l/Makefile
obj-$(CONFIG_ISDN) += isdn.o
isdn-objs := isdn_net_lib.o isdn_v110.o isdn_common.o
在这个例子中,模块名是isdn.o。Kbuild会编译$(isdn-objs)中列出的对像,并运行”$(LD) –r”生成isdn.o。
Kbuild通过后缀-objs和-y识别用于编译生成目标的对像。它允许Makefile使用CONFIG_符号的值来决定一个对像是否是某个目标的一部分。
eg.
#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就是ext2.o的一部分。
4、 库文件目标 - lib-y
所有列在lib-y中的对像都被组合到一个单独的库中。既列在obj-y中又列在lib-y中的对像不会被包含到库中。因为不管怎样,它们都是可访问的。为了保持一致,列在lib-m中的对像会被包含到lib.a。
Example:
#arch/i386/lib/Makefile
lib-y := checksum.o delay.o
此处基于checksum.o和delay.o创建了库lib.a.
5、 向下进入目录
一个Makefile仅负责在它自己的目录中编译文件。子目录中的文件由子目录中的Makefile负责编译。如果你告诉了编译系统这些子目录,它会自动在子目录中递归调用make。
ext2放在了一个单独的目录中,在fs/目录下的Makefile用正面的赋值告诉kbuild向下进入目录
eg:
#fs/Makefile
obj-$(CONFIG_EXT2_FS) += ext2/
如果CONFIG_EXT2_FS的值是’y’(built-in)或’m’(modular),对应的obj-变量就会被设置,kbuild向下进入ext2目录。
kbuild只是通过这个信息决定要访问哪个目录,子目录中的Makefile指定什么是modules、什么是built-in。
6、编译flags
EXTRA_CFLAGS, EXTRA_AFLAGS, EXTRA_LDFLAGS, EXTRA_ARFLAGS
所有EXTRA_变量只用在它的定义所在的那个kbuild makefile,它们被用于kbuild makefile中所有命令的执行
$(EXTRA_CFLAGS)指定了用$(CC)编译c文件时的选项。
$(EXTRA_AFLAGS)是每个目录在编译汇编源文件时的选项。
$(EXTRA_LDFLAGS) 和 $(EXTRA_ARFLAGS)是用于$(LD)和$(AR)的选项。
Example:
#arch/m68k/fpsp040/Makefile
EXTRA_LDFLAGS := -x
CFLAGS_$@, AFLAGS_$@
CFLAGS_$@ 和AFLAGS_$@ 只在当前kbuild makefile的命令中使用。
$(CFLAGS_$@)为$(CC)指定了每个文件的选项。$@指定了使用它的文件。
linux-2.6.20.6/Documentation/kbuild/makefiles.txt
一、
linux的makefile有五个部分:
Makefile:顶层Makefile
.config:内核配置文件
arch/$(ARCH)/Makefile:体系结构相关的Makefile
scripts/Makefile.*:通用的规则等,用于所有的kbuild Makefiles
kbuild Makefiles:大约有500个这样的makefile
顶层Makefile读取在内核配置过程中生成的.config文件。负责构建两个主要的文件:vmlinux和各模块。它还包含了一个名为arch/$(ARCH)/Makefile的体系结构相关Makefile,这个Makefile给顶层Makefile提供了体系结构相关的信息。
每个子目录有一个kbuild Makefile,它执行上层传入的命令。kbuild Makefile使用.config文件中的信息构建各种文件列表,供kbuild构建任何built-in或modular目标时使用。
scripts/Makefile.*包含所有的定义和规则等,这些被用来和kbuild makeflie一起构建内核
二、
kbuild Makefile中的语法。
kbuild文件首选的文件名是”Makefile”,也可以用”kbuild”。如果”Makefile”和”kbuild”同时存在,则使用”kbuild”文件。
1、
目标定义是kbuild Makefile的主要部分。这些行定义了要被编译的文件、所有指定的编码选项及所有将要递归进入的子目录。
最简单的kbuild Makefile包括一行:
obj-y += foo.o
如果foo.o要被编译成模块,就用obj-m。因此,经常使用下面的模式:
obj-$(CONFIG_FOO) += foo.o
$(CONFIG_FOO)的值是y (for built-in)或者m(for module)。如果CONFIG_FOO既不是y也不是m,这个文件不会被编译或链接
2、
kbuild Makefile 在$(obj-y)列表中给vmlinux指定目标文件,这个列表依赖于内核配置。
kbuild 编译所有的$(obj-y)文件,然后调用”$(LD) –r”把这些文件合并成一个built-in.o文件,之后built-in.o被顶层Makefile链接成vmlinux。
$(obj-y)中文件的顺序很重要,在这个列表中,完全相同的文件可以同时存在:第一个被链接到built-in.o,以后的都被忽略了。
链接顺序也很重要,因为特定的函数(module_init() / __initcall)会在启动期间按照它们出现的顺序被调用。
3、
$(obj-m)指定被编译为可加载内核模块的文件。一个模块可以是一个或多个源文件编译生成。如果是一个源文件,kbuild makefile只是简单的把这个文件加入$(obj-m)。如果内核模块由多个源文件编译生成,内核要知道你想要编译哪些源文件,所以你必须设置变量$(-objs)来告诉内核。
eg.
在这个例子中,模块名是isdn.o。Kbuild会编译$(isdn-objs)中列出的对像,并运行”$(LD) –r”生成isdn.o。
Kbuild通过后缀-objs和-y识别用于编译生成目标的对像。它允许Makefile使用CONFIG_符号的值来决定一个对像是否是某个目标的一部分。
eg.
如果CONFIG_EXT2_FS_XATTR的值为’y’,则xattr.o就是ext2.o的一部分。
4、
所有列在lib-y中的对像都被组合到一个单独的库中。既列在obj-y中又列在lib-y中的对像不会被包含到库中。因为不管怎样,它们都是可访问的。为了保持一致,列在lib-m中的对像会被包含到lib.a。
此处基于checksum.o和delay.o创建了库lib.a.
5、
一个Makefile仅负责在它自己的目录中编译文件。子目录中的文件由子目录中的Makefile负责编译。如果你告诉了编译系统这些子目录,它会自动在子目录中递归调用make。
ext2放在了一个单独的目录中,在fs/目录下的Makefile用正面的赋值告诉kbuild向下进入目录
eg:
如果CONFIG_EXT2_FS的值是’y’(built-in)或’m’(modular),对应的obj-变量就会被设置,kbuild向下进入ext2目录。
kbuild只是通过这个信息决定要访问哪个目录,子目录中的Makefile指定什么是modules、什么是built-in。
6、编译flags
所有EXTRA_变量只用在它的定义所在的那个kbuild makefile,它们被用于kbuild makefile中所有命令的执行
$(EXTRA_CFLAGS)指定了用$(CC)编译c文件时的选项。
$(EXTRA_AFLAGS)是每个目录在编译汇编源文件时的选项。
$(EXTRA_LDFLAGS) 和 $(EXTRA_ARFLAGS)是用于$(LD)和$(AR)的选项。
CFLAGS_$@ 和AFLAGS_$@ 只在当前kbuild makefile的命令中使用。
$(CFLAGS_$@)为$(CC)指定了每个文件的选项。$@指定了使用它的文件。