资源描述
Linux内核的Makefile
1 2
3 本文档描述了Linux内核的Makefile。
===表的内容
6 7 === 1概述
=== 2,谁做什么
9 === 3的kbuild文件
10 --- 3.1 11 --- 3.2 目标定义
内置对象的目标- OBJ-Y
12 --- 3.3可加载模块的目标- obj的13米
--- 3.4对象导出符号
14 --- 3.5库文件的目标- LIB-Y
15 --- 3.6目录中的16 --- 3.7编译标志
下
17 --- 3.8命令行依赖
18 --- 3.9依赖关系跟踪
19 --- 3.10特殊规则
20 --- 3.11 $(CC)支持功能
21 - - 3.12 $(LD)的支持功能
=== 4主机程序支持
24 --- 4.1简单的主机程序
25 --- 4.2复合主机程序
26 --- 4.3定义共享库
27 --- 4.4使用C + +为22 23主机方案
28 --- 4.5控制编译器选项为主机程序
29 --- 4.6当宿主程序实际是建
30 --- 4.7使用hostprogs-$“(CONFIG_FOO)
31 32 === 5的Kbuild清洁的基础设施
33 34 === 6架构的Makefile
35 --- 6.1变量设置调整构建的架构
36 --- 6.2先决条件archheaders:
37 --- 6.3先决条件到archprepare:
38 --- 6.4列出目录访问时降
39 - - 6.5体系结构特有的引导映像
40 --- 6.6建筑非kbuild的目标
41 --- 6.7命令可用于建设的引导映像
42 --- 6.8自定义kbuild的命令
43 --- 6.9预处理连接器脚本
44 --- 6.10的通用头文件
45 46 === 7的kbuild语法的出口头
47 --- 7.1头-Y
48 --- 7.2 objhdr-Y
49 --- 7.3目的地- Y
50 --- 7.4的通用-Y
51 52 = == 8的Kbuild变量
53 === 9 Makefile中的语言
54 === 10积分
55 === 56 57 11 TODO
=== 1概述
58 59的Makefile有五个部分:
60 61 Makefile中最顶层的Makefile。
62 。配置最顶层的Makefile中读取内核配置文件。
63 弓/ $(ARCH)/ Makefile中拱的Makefile。
64 脚本/ Makefile文件。共同的规则等,为所有kbuild的的Makefile。
65 kbuild的Makefiles中大约有500个,这些
66 67。配置文件,来从内核
配置过程
68 69 70最顶层的Makefile是负责建设两个主要产品:vmlinux的
71(居民内核映像)和模块(任何模块文件)。
72建立这些目标通过递归下降到73内核源代码树。
74访问的子目录列表的子目录
取决于内核的
75配置。最顶层的Makefile文本上有一个拱形的名称拱/ $(ARCH)/ Makefile中的Makefile
76。拱的Makefile提供
77架构相关的信息,最顶层的Makefile
78 79每个子目录下有一个的kbuild Makefile文件执行的命令
80从上面传下来的。kbuild的Makefile将使用的
81。配置文件构建各种文件列出了使用kbuild的建立
82任何内置或模块化的目标。
83 84脚本/ Makefile文件。* /包含了所有的定义规则等
85用于kbuild的makefile文件的基础上构建内核。
91 92 86 87 88 === 2
89 90人有四种不同的关系,与内核的Makefile。
*用户*是编译内核的人。这些人的命令,如
93 “make menuconfig命令”或“使”。他们通常不读或编辑
94任何内核的Makefile中(或任何其他的源文件)。
95 96 *普通开发人员97设备驱动程序,文件系统和网络协议的功能,如工作的人
。这些人要
保持98 kbuild的Makefile中的子系统,它们是
99上工作。为了有效地做到这一点,他们需要一些整体
的内核的Makefile的知识,再加上102 103 101公共接口kbuild的详细了解
。
拱门开发工作的整个架构,SPARC和IA64 等104人
。拱门开发人员需要了解拱的Makefile
105以及kbuild的Makefiles的。
kbuild的开发内核构建系统本身工作的人。
108这些人都需要了解内核的Makefile中的各个方面。
109 110 106 107文件的目的是向正常发展和拱开发商。
111 112 113 === 3 kbuild的文件
在内核中是114 115的Makefile kbuild的生成文件,使用
116的kbuild基础设施。本章介绍kbuild的makefile文件117所使用的语法
。
118的首选kbuild的文件名 是'的Makefile',但'的Kbuild“
119,如果一个'Makefile'和'的Kbuild“文件存在,那么” kbuild的“
120文件将被使用。
121 122第3.1节“目标定义”是一个快速的介绍,进一步章节提供
123更多细节,用真实的例子。
124 125 --- 3.1目标定义
126 127 目标定义的主要组成部分(心kbuild的Makefile文件)。
128 行定义了文件,将建成129 选项,任何特殊的编译
和任何子目录递归可输入
130 131 最简单的kbuild Makefile文件包含一个热线:
132 133 例:
134 OBJ-Y + =文件foo.o
135 136 告诉kbuild的目的之一是在该目录中,命名为
137 foo.o. 文件foo.o将建成从foo.c或foo.S.
138的139 如果foo.o中应建立为一个模块,变量obj-M。
140 因此经常使用下面的模式:
141 142 例:
143 的obj-$(CONFIG_FOO)+ = foo.o中的
144 145 美元(CONFIG_FOO)的计算结果为y(内置)或M(模块)。
146, 如果CONFIG_FOO既不是y也没有米,那么该文件将不会被编译
147 也不是联系在一起的。
148 149 --- 150 151 3.2内置对象目标- OBJ-Y
的kbuild Makefile中指定的目标文件vmlinux的
152 $(OBJ-Y)的列表。这些列表依赖于内核的
153 配置,
编译所有的154 155的kbuild $(OBJ-Y)的文件。然后,它调用
157 内置in.o后来被链接到vmlinux的父的Makefile。
158 159 文件的顺序(156 “$(LD)-r”的这些文件合并到一个built-in.o文件。
的obj-y)是显着的。重复
160 允许列表的第一个实例将被链接到
161 内置in.o和成功的实例将被忽略。
162 163 链接的顺序是显着的,因为某些功能
将被称为164(module_init()/ __ initcall的)在在165 它们出现的顺序启动
。所以记住的链接166 为了改变
,例如改变您的SCSI 167 控制器检测到的顺序
,从而168 169 例:
drivers/isdn/i4l/Makefile 170#
171 #Makefile中的内核的磁盘都被重新编号。
ISDN子系统和设备驱动程序。
172 #每一个配置选项使文件列表。
173 的obj-$(CONFIG_ISDN_I4L)+ = isdn.o的
174 的obj-$(CONFIG_ISDN_PPP_BSDCOMP)+ = isdn_bsdcomp.o的
175 176 --- 3.3可加载模块的目标- OBJ-M
177 180 181 178 $(OBJ-M)指定对象的内置的文件,这些文件可装载
179个 内核模块
一个模块可以构建一个源文件或多个源
182 文件。在一个源文件的情况下, 只是增加了183 kbuild的makefile文件
的文件$(OBJ-M)的
184 185 例:
186 #drivers/isdn/i4l/Makefile
187 的obj-$(CONFIG_ISDN_PPP_BSDCOMP)+ = isdn_bsdcomp.o
188 189 注:在这个例子中(CONFIG_ISDN_PPP_BSDCOMP)的计算结果为“M”
190 191, 如果一个内核模块是建立从多个源文件,你指定
192 要构建一个模块在上述同样的方式,但
193 kbuild的需求知道你要建立你的194 模块的对象文件
,所以你必须告诉它通过设置一个$(<MODULE_NAME>-Y)
196 197 195 变量。
例:
198 #drivers/isdn/i4l/Makefile
199 OBJ (CONFIG_ISDN_I4L)+ = isdn.o
200 ISDN-Y:= isdn_net_lib.o isdn_v110.o isdn_common.o
201 202 在这个例子中,模块的名字将出现在isdn.o. kbuild的
203 编译对象在$(ISDN-Y)的上市,然后再运行
204 “$(LD)-r”的名单上的这些文件的,产生isdn.o.
205 206 kbuild的认识(<MODULE_NAME> - y)的复合对象,
207 你可以使用CONFIG_符号的价值,可以选择 作为一个复合对象的一部分,包括一个
208的目标文件。
209 210 例:
211 #fs/ext2/Makefile
212 的obj-$(CONFIG_EXT2_FS)+ = ext2.o
213 EXT2-Y:= balloc.o dir.o file.o的ialloc.o inode.o ioctl.o \
214 namei.o super.o symlink.o
215 的ext2-$(CONFIG_EXT2_FS_XATTR)+ = xattr.o 在这个例子中xattr_user.o \
217 218 216 xattr_trusted.o
,xattr.o,xattr_user.o和xattr_trusted.o,只有
219 的一部分,复合对象ext2.o的,如果$(CONFIG_EXT2_FS_XATTR)
220 计算结果为“y”。
221 222 注意:当然,当你构建到内核中的对象,
223 上面的语法也将正常工作。所以,如果你有CONFIG_EXT2_FS,Y,
224 kbuild的建立一个ext2.o的文件,你的个人
225 ,然后连接到内置in.o,正如你所期望的。
226 227 --- 3.4物体导出符号
228 229 无特殊符号需要在Makefile中的
230 模块的导出符号。
231 232 --- 3.5库文件的目标- LIB-Y
233 234 上市与obj-*用于模块或235 组合在一个内置的对象
lib.a. 238 -in.o特定的目录。
236 也有可能列出对象,将
一个库中包含237,
用lib-Y列出的所有对象结合在一个单一的
239 该目录库。
240 中列出的对象在OBJ-Y和另外列出的
241 的lib-Y将不会被包含在库中,因为他们将
242 无论如何是可访问的。
243 为了保持一致性,在lib-M中列出的对象将被纳入党人
244 245 注的kbuild makefile文件列出的文件被内置在
246 库的一部分。因此,在同一目录
247 可以同时包含一个内置的in.o和党人文件。
248 249 例:
250 #251 LIB-Y arch/x86/lib/Makefile
:252 = delay.o:
253 这将创建一个库党人根据delay.o。 目录255到254的kbuild
真正认识到,有一个lib.a正在兴建,
应在libs-Y上市。
256 另请参见“6.4列出目录访问时降”。
通常只限于257 258使用的lib-Y到lib /和arch / * / lib目录下。
259 260 --- 3.6下的目录中的
261 262 的Makefile只负责建设自己的263 目录中的对象
。子目录中的文件应该被照顾的
264 在这些子目录中的Makefile。生成系统将自动
265 子目录中的递归调用make,只要你让它知道
他们
266 267 268 要做到这一点,使用的obj-y和obj-M
269 EXT2生活在一个单独的目录中,和Makefile目前在FS /
270 告诉kbuild的下降,使用下面的赋值。
271 272 例:
273 #fs / Makefile文件中
274 的obj-$(CONFIG_EXT2_FS)+ = EXT2 /
275 276, 如果CONFIG_EXT2_FS设置为'Y'(内置)或“M”(模块化)
277 相应的obj-变量设置,kbuild的将下降
278 ext2的目录中。
279 的Kbuild只使用这些信息来决定,它需要访问
280 的目录,它是Makefile中281 指定的模块是什么,什么是内置的。
282 283 这是很好的做法,使用CONFIG_变量指定目录时,
284 名,子目录
。这使得kbuild的目录,如果完全跳过
285 对应的的CONFIG_选项既不是“Y'也不是'M'。
286 287 --- 3.7编译标志
288 289 CCFLAGS asflags-Y,Y和LDFLAGS-Y
290 这三个标志申请的kbuild makefile来
291 分配。它们被用于所有正常的CC,和 以前命名的LD
292 调用发生在一个递归的构建。
293注:具有相同行为的标志:的
294 EXTRA_CFLAGS,EXTRA_AFLAGS和EXTRA_LDFLAGS。
295 他们仍然支持,但是它们的使用已过时。
296 297 CCFLAGS-Y指定的选项进行编译$(CC)
298 299 例:
300 #驱动器/ ACPI / Makefile文件
301 CCFLAGS-Y =-O的
302 CCFLAGS美元(CONFIG_ACPI_DEBUG)+ =-DACPI_DEBUG_OUTPUT
303 304 这个变量是必要的,因为顶层Makefile拥有
305 变量$(KBUILD_CFLAGS),并用它的306 整个树的编译选项
。
307 308 asflags-Y指定用于装配$(AS)。
309 310 例:
311 #建筑/ SPARC / 312 asflags-Y =-ANSI
313 314 LDFLAGS-Y 核心/ Makefile中
指定的选项$(LD)链接。
315 316 例:
317 #建筑/ CRIS的/ boot /压缩/ Makefile中
318 LDFLAGS-Y + =-T $ (srctree)/ $(SRC)/ decompress_ $(ARCH-Y)。 子目录CCFLAGS-Y LDS
319 320,子目录,asflagsŸ
321 以上列出的这两个标志类似CCFLAGS-Y和asflags的-Y。
322 “不同的是 ,它们的存在和所有子目录的子目录的的变种有效果的kbuild的
323文件
324 使用子目录选项指定*前325添加到命令行
指定的选项使用的非子目录的变种。
326 327 示例:
328 子目录CCFLAGS-Y =-Werror
329 330 CFLAGS_ $ @,AFLAGS_ $ @
331 332 CFLAGS_ $ @和AFLAGS_ $ @只适用于当前333 的kbuild Makefile文件中的命令
。
334 335 元(CFLAGS_ $ @)指定每个文件选项$(CC)。$ @
336 部分有指定的文件,它是一个文本值。
337 338 例:
339 #驱动器/ SCSI / Makefile文件
340 CFLAGS_aha152x.o =-DAHA152X_STAT DAUTOCONF
341 CFLAGS_gdth.o =#DDEBUG_GDTH = 2 D__SERIAL__ D__COM2__ \
342 -DGDTH_STATISTICS的
343 344 这两个行指定的编译选项aha152x.o和gdth.o.
345 346 美元(AFLAGS_ $ @)是一个类似功能的源文件汇编
347 种语言。
348 349 例:
350 #拱/ ARM /内核/ Makefile文件
351 AFLAGS_head.o:= DTEXT_OFFSET = $(TEXT_OFFSET)
352 AFLAGS_crunch bits.o:=华,MCPU = EP9312
353 AFLAGS_iwmmxt.o:华-MCPU = iwmmxt
354 355 356 --- 3.9依赖跟踪
357 358 kbuild的轨迹依赖于以下:
359 1)所有必备文件(两个*。c和* H)
360 2)CONFIG_选项中使用的所有必备文件
361 3)使用命令行编译目标
362 363, 因此,如果您更改选项$(CC)所有受影响的文件将
364 重新编译。
--- 3.10特殊规则
365 366 367 368 特殊规则时所使用的kbuild基础设施
369 不提供必要的支持。一个典型的例子是
370 头文件在编译过程中产生的。
371 另一个例子是特定于体系结构的Makefile
372 需要特殊的规则来准备启动图像 被写入正常的规则等
373 374的特殊规则。
375 kbuild的不执行目录中的Makefile是
位于376,因此所有的特殊规则应提供一个相对
377 路的必备文件和目标文件。
378 379 两个变量定义特殊规则时,使用:
380 381 $(SRC)
382 $(SRC)是一个相对路径,它指向 的Makefile所在的目录
383。请务必使用$(SRC),
384 指位于src目录树中的文件。
385 386 $(obj)以
387 $(OBJ)是一个相对路径,它指向 的目标是保存到目录
388。请务必使用$(obj)的
389 指的是生成的文件。
390 391 例:
392 #驱动器/ SCSI / Makefile文件
393 $(OBJ)/ 53c8xx_d.h:$(SRC)/ 53c7,8xx.scr $(SRC)/ script_asm PL
394 $(CPP)DCHIP = 810 - <$ <| ... $(SRC)/ script_asm.pl
395 396 ,这是一个特殊的规则,按照正常的语法
397 所要求的做。
398 的目标文件依赖于两个前提性的文件。参考文献
399 到目标文件的前缀$(OBJ), $(SRC)(引用参考文献
400至先决条件,因为它们不是
401 生成的文件)。
402 403 $ 404(kecho)的
呼应信息,用户在规则中往往是一个很好的做法
405 但是当执行“-S”一个不希望看到任何输出
406 除了警告/错误。
407 为了支持这一kbuild的定义(kecho),这将回声出
408 以下$(kecho的文本)到stdout,除非“使”。
409 410 例:
411 #建筑/ Blackfin处理器的/ boot / Makefile文件
412 $(OBJ)/ vmImage:$(OBJ)/ vmlinux.gz
413 美元(呼叫if_changed的uImage)
414 @ $(kecho)的内核:$ @是准备
415 416 417 --- 3.11 $(CC)支持功能
建有几个不同版本的420 $(CC),每个内核可以
支持一组独特的418 419 421 kbuild的功能和选项。
提供基本的支持检查 的有效选项$(CC)
422 $(CC)通常是gcc编译器,但其他的替代品
。424 425 423可
选项
426 选项用于检查$(CC) -使用时,,编译
427 汇编文件(S) -支持给定的选项。可选的
428 第二个选项可以指定,如果第一个选项不支持。
429 430 例:
431 #建筑/ SH / Makefile文件
432 CFLAGS-Y + = $(调用的选项,华$(逗号)ISA = $ (ISA-Y))
433 434 在上面的例子中,CFLAGS-Y将被分配的选项
$ 435 -华(逗号)ISA = $(ISA-Y)$(CC)是否支持它。
436 第二个参数是可选的,如果将使用
437, 如果第一个参数不支持。
438 439 CC-ldoption的
440 使用的CC-ldoption是检查$(CC)时,用于连接目标文件
441 支持给定的选项。可选的第二个选项可能是
442 规定,如果第一个选项不支持。
443 444 例:
445 #arch/x86/kernel/Makefile
446 vsyscall标志+ = $(呼叫的CC-ldoption,WL $(逗号) -哈希 第二个参数是可选的式SYSV)
450 447 448 在上面的例子中,vsyscall标志将被分配449 -WL $(逗号) -哈希式SYSV 的选项,
如果$(CC)支持。
,如果提供
451 如果第一个参数不支持。
INSTR
454 -INSTR检查,如果一个特定的指令,汇编
455 ,然后输出选项1或选项2
456 C转义支持的测试指令
457 452 453 注:INSTR-的选项使用KBUILD_AFLAGS为$(AS)股权
458 459 CC- 460 CC-选项选项
是用来检查$(CC)支持一个给定的选项,而不是
461 支持使用可选的第二个选项。
462 463 例:
464 #arch/x86/Makefile
465: CFLAGS-Y + = $(称为CC-选项,游行的Pentium MMX,3月= i586系统)
466 467 在上面的例子中,CFLAGS-Y选项将被分配
468 -3 =奔腾MMX如果$(CC),否则三月i586系统。469 CC选项的第二个参数是可选的,如果省略,
470 CFLAGS-Y将被分配第一个选项是没有价值的,如果不支持
支持。
471 注:CC-的选项使用KBUILD_CFLAGS为$(CC) CC-选项-炔
股权
472 473 474 CC--YN选项是用来检查是否gcc支持一个给定的选项
475 ,并返回'y'的支持,否则“ N'。
476 477 例:
478 #弓/ PPC / Makefile文件
479 biarch的:= $(称为CC-选项-YN-M32)
480 AFLAGS美元(biarch)+ =-A32
481 的cflags-$(biarch)+ = M32
482 483 在上面的例子中,(biarch)设置为y如果$(CC)支持-M32
484 选项。当(biarch)等于'Y',扩大变量$(AFLAGS-Y)
485 $(CFLAGS-Y)的将被分配的值-A32-M32,
486 487 注:CC-OPTION-YN使用 。
KBUILD_CFLAGS $(CC)选项
488 489 CC-选项对齐
490 gcc版本> = 3.0改变的类型选项用于指定
491 对齐功能,循环等。$(CC-选项对齐),当使用
492 作为前缀到“对齐”选项“,选择正确的前缀:
493 GCC <3.00
494 CC-选项对齐=中伤
495 GCC> = 3.00
496 CC-选项对齐= falign
497 498 例:
499 KBUILD_CFLAGS + = $(CC-选项对齐)函数= 4
500 501, 另外,在上述的例子中,选项-falign函数= 4的是,用于
502 %> = 3.00。为海湾合作委员会<3.00,邪恶的功能= 4。
使用KBUILD_CFLAGS 503注:CC-选项调整为$(CC)股权
504 505 CC-禁用警告
506 毫升禁用预警检查,如果GCC支持给予警告并返回
507
Linux Kernel Makefiles
This document describes the Linux kernel Makefiles.
=== Table of Contents
=== 1 Overview
=== 2 Who does what
=== 3 The kbuild files
--- 3.1 Goal definitions
--- 3.2 Built-in object goals - obj-y
--- 3.3 Loadable module goals - obj-m
--- 3.4 Objects which export symbols
--- 3.5 Library file goals - lib-y
--- 3.6 Descending down in directories
--- 3.7 Compilation flags
--- 3.8 Command line dependency
--- 3.9 Dependency tracking
--- 3.10 Special Rules
--- 3.11 $(CC) support functions
=== 4 Host Program support
--- 4.1 Simple Host Program
--- 4.2 Composite Host Programs
--- 4.3 Defining shared libraries
--- 4.4 Using C++ for host programs
--- 4.5 Controlling compiler options for host programs
--- 4.6 When host programs are actually built
--- 4.7 Using hostprogs-$(CONFIG_FOO)
=== 5 Kbuild clean infrastructure
=== 6 Architecture Makefiles
--- 6.1 Set variables to tweak the build to the architecture
--- 6.2 Add prerequisites to archprepare:
--- 6.3 List directories to visit when descending
--- 6.4 Architecture-specific boot images
--- 6.5 Building non-kbuild targets
--- 6.6 Commands useful for building a boot image
--- 6.7 Custom kbuild commands
--- 6.8 Preprocessing linker scripts
=== 7 Kbuild Variables
=== 8 Makefile language
=== 9 Credits
=== 10 TODO
=== 1 Overview
The Makefiles have five parts:
Makefile the top Makefile.
.config the kernel configuration file.
arch/$(ARCH)/Makefile the arch Makefile.
scripts/Makefile.* common rules etc. for all kbuild Makefiles.
kbuild Makefiles there are about 500 of these.
The top Makefile reads the .config file, which comes from the kernel configuration process.
The top Makefile is responsible for building two major products: vmlinux (the resident kernel image) and modules (any module files). It builds these goals by recursively descending into the subdirectories of the kernel source tree. The list of subdirectories which are visited depends upon the kernel configuration. The top Makefile textually includes an arch Makefile with the name arch/$(ARCH)/Makefile. The arch Makefile supplies architecture-specific information to the top Makefile.
Each subdirectory has a kbuild Makefile which carries out the commands passed down from above. The kbuild Makefile uses information from the .config file to construct various file lists used by kbuild to build any built-in or modular targets.
scripts/Makefile.* contains all the definitions/rules etc. that are used to build the kernel based on the kbuild makefiles.
=== 2 Who does what
People have four different relationships with the kernel Makefiles.
*Users* are people who build kernels. These people type commands such as "make menuconfig" or "make". They usually do not read or edit any kernel Makefiles (or any other source files).
*Normal developers* are people who work on features such as device drivers, file systems, and network protocols. These people need to maintain the kbuild Makefiles for the subsystem they are working on. In order to do this effectively, they need some overall knowledge about the kernel Makefiles, plus detailed knowledge about the public interface for kbuild.
*Arch developers* are people who work on an entire architecture, such as sparc or ia64. Arch developers need to know about the arch Makefile as well as kbuild Makefiles.
*Kbuild deve
展开阅读全文