*架构开发者*是那些工作对象是整个体系架构的人,比如sparc或者ia64。架构开发者需要知道架构Makefile,同时也需要了解kbuild Makefiles。
*Kbuild开发者*这类人的工作对象是整个内核系统本身。他们需要知道内核Makefiles的方方面面。
这个文档的适合读者是一般开发者和架构开发者。
=== 3 kbuild文件
内核中的大多数Makefiles是使用kbuild基本语法规则的kbuild Makefiles。这一章介绍kbuild makefiles的语法。
kbuild文件的首选名字是'Makefile',但是'Kbuild'也可以使用。如果'Makefile'和'Kbuild' 文件同时存在,那么'Kbuild'文件将会被使用。
3.1节“目标定义”只是一个快速入门,更多的内容请见后面的章节。
--- 3.1 目标定义
目标定义是kbuildMakefile文件的主要部分(核心),它们定义了将要被构建的文件,任何具体的编译选项,以及任何将要递归进入的子目录。
最简单的kbuild makefile只包含一行:
例子:
obj-y = foo.o
这一行告诉kbuild这个目录只有一个叫做foo.o的的目标。foo.o将从foo.c或者foo.S生成。
如果foo.o将被生成为一个模块,那么就使用obj-m变量。因此下面的模版经常会被使用:
例子:
obj-$(CONFIG_FOO) = foo.o
$(CONFIG_FOO)等于y(编译进内核)或者m(编译为模块)。如果$(CONFIG_FOO)既不是y也不是m,那么这个文件就不会被编译也不会被链接。
--- 3.2 编译进内核的目标对象 - obj-y
KbuildMakefile在$(obj-y)列表中指定了编译进vmlinux的对象文件。这个列表依靠内核配置文件生成。
Kbuild编译所有的$(obj-y)文件。然后调用"$(LD)-r"将这些编译生成的文件合成到一个built-in.o文件中。Built-in.o稍后会被父层Makfile链接到vmlinux中。
$(obj-y)列表中文件的顺序是有意义的。文件可以在$(obj-y)列表中重复,但是只有第一个出现的文件会被编译到built-in.o中,而接下来出现的重复文件会被忽略。
链接顺序也是有意义的。因为某些函数(比如(module_init() / __initcall))在系统启动的过程中将会按照它们出现的顺序调用。所以记住改变链接顺序将会造成一些不确定情况。比如改变你的SCSI控制器的的被检测顺序,那么你的磁盘就会被重新编号。
例子:
#drivers/isdn/i4l/Makefile
# Makefile for the kernel ISDN subsystemand device drivers.
# Each configuration option enables a listof files.
obj-$(CONFIG_ISDN) = isdn.o
obj-$(CONFIG_ISDN_PPP_BSDCOMP) =isdn_bsdcomp.o
--- 3.3 可加载模块目标 - obj-m
$(obj-m) 指定一个目标文件将会被编译为一个可加载的内核模块。
一个模块可以由一个或者多个源文件编译生成。对于模块由一个源文件生成的情况,kbuild makefile只需要简单地将源文件加入到$(obj-m)列表。
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-40628-2.html
票已买好
中国
聪明羊期待更优秀的你浮出水面