|
linux2.6内核Makefile详解
--- 3.7 编辑标志 EXTRA_CFLAGS, EXTRA_AFLAGS, EXTRA_LDFLAGS, EXTRA_ARFLAGS 所有的 EXTRA_ 变量只在所定义的Kbuild Makefile中起作用。EXTRA_ 变量可 以在Kbuild Makefile中所有命令中使用。 $(EXTRA_CFLAGS) 是用 $(CC) 编译C源文件时的选项。 例子: # drivers/sound/emu10kl/Makefile EXTRA_CFLAGS += -I$(obj) ifdef DEBUG EXTRA_CFLAGS += -DEMU10KL_DEBUG endif 该变量是必须的,因为顶层Makefile拥有变量 $(CFLAGS) 并用来作为整个源 代码树的编译选项。 $(EXTRA_AFLAGS) 也是一个针对每个目录的选项,只不过它是用来编译汇编 源代码的。 例子: #arch/x86_64/kernel/Makefile EXTRA_AFLAGS := -traditional $(EXTRA_LDFLAGS) 和 $(EXTRA_ARFLAGS)分别与 $(LD)和 $(AR)类似,只不 过,他们是针对每个目录的。 例子: #arch/m68k/fpsp040/Makefile EXTRA_LDFLAGS := -x CFLAGS_$@, AFLSGA_$@ CFLAGS_$@ 和 AFLAGS_$@ 只能在当前Kbuild Makefile中的命令中使用。 $(CFLAGS_$@) 是 $(CC) 针对每个文件的选项。$@ 表明了具体操作的文件。 例子: # drivers/scsi/Makefile CFLAGS_aha152x.o = -DAHA152X_STAT -DAUTOCONF CFLAGS_gdth.o = # -DDEBUG_GDTH=2 -D__SERIAL__ -D__COM2__ \ -DGDTH_STATISTICS CFLAGS_seagate.o = -DARBITRATE -DPARITY -DSEAGATE_USE_ASM 以上三行分别设置了aha152x.o,gdth.o 和 seagate.o的编辑选项。 $(AFLAGS_$@) 也类似,只不是是针对汇编语言的。 例子: # arch/arm/kernel/Makefile AFLAGS_head-armv.o := -DTEXTADDR=$(TEXTADDR) -traditional AFLAGS_head-armo.o := -DTEXTADDR=$(TEXTADDR) -traditional--- 3.9 跟踪依赖 Kbuild 跟踪在以下方面依赖: 1) 所有要参与编译的文件(所有的.c 和.h文件) 2) 在参与编译文件中所要使用的 CONFIG_ 选项 3) 用于编译目标的命令行 因此,如果你改变了 $(CC) 的选项,所有受影响的文件都要重新编译。--- 3.10 特殊规则 特殊规则就是那Kbuild架构不能提供所要求的支持时,所使用的规则。一个 典型的例子就是在构建过程中生成的头文件。 另一个例子就是那些需要采用特殊规则来准备启动镜像。 特殊规则的写法与普通Make规则一样。 Kbuild并不在Makefile所在的目录执行,所以所有的特殊规则都要提供参与 编译的文件和目标文件的相对路径。 在定义特殊规则时,要使用以下两个变量: $(src) $(src) 表明Makefile所在目录的相对路径。经常在定位源代码树中的文件时 ,使用该变量。 $(obj) $(obj) 表明目标文件所要存储目录的相对路径。经常在定位所生成的文件时 ,使用该变量。 例子: #drivers/scsi/Makefile $(obj)/53c8xx_d.h: $(src)/53c7,8xx.scr $(src)/script_asm.pl $(CPP) -DCHIP=810 - < $< | ... $(src)/script_asm.pl 这就是一个特殊规则,遵守着make所要求的普通语法。 目标文件依赖于两个源文件。用$(obj)来定位目标文件,用$(src)来定位源文 件(因为它们不是我们生成的文件)。--- 3.11 $(CC) 支持的函数 内核可能由多个不同版本的$(CC)编译,而每个版本都支持一不同的功能集与 选项集。Kbuild提供了检查 $(CC) 可用选项的基本功能。$(CC)一般情况下是 gcc编译器,但也可以使用其它编译器来代替gcc。 as-option as-option,当编译汇编文件(*.S)时,用来检查 $(CC) 是否支持特定选项。如 果第一个选项不支持的话,可选的第二个选项可以用来指定。 例子: #arch/sh/Makefile cflags-y += $(call as-option,-Wa$(comma)-isa=$(isa-y),) 在上面的例子里,如果 $(CC) 支持选项 -Wa$(comma)-isa=$(isa-y), cflags-y就会被赋予该值。 第二个参数是可选的,当第一个参数不支持时,就会使用该值。 ld-option ld-option,当联接目标文件时,用来检查 $(CC) 是否支持特定选项。如果第 一个选项不支持的话,可选的第二个选项可以用来指定。 例子: #arch/i386/kernel/Makefile vsyscall-flags += $(call ld-option, -Wl$(comma)--hash-style=sysv) 在上面的例子中,如果 $(CC)支持选项 -Wl$(comma)--hash-style=sysv, ld-option就会被赋予该值。 第二个参数是可选的,当第一个参数不支持时,就会使用该值。 cc-option cc-option,用来检查 $(CC) 是否支持特定选项,并且不支持使用可选的第二 项。 例子: #arch/i386/Makefile cflags-y += $(call cc-option,-march=pentium-mmx,-march=i586) 在上面的例子中,如果 $(CC)支持选项 -march=pentium-mmx,cc-option就 会被赋予该值,否则就赋 -march-i586。 cc-option的第二个参数是可选的。如果忽略的话,当第一个选项不支持时, cflags-y 不会被赋值。 cc-option-yn cc-option-yn,用来检查 gcc 是否支持特定选项,返回'y'支持,否则为'n'。 例子: #arch/ppc/Makefile biarch := $(call cc-option-yn, -m32) aflags-$(biarch) += -a32 cflags-$(biarch) += -m32 在上面的例子里,当 $(CC) 支持 -m32选项时,$(biarch)设置为y。当 $(biarch) 为y时,扩展的 $(aflags-y) 和 $(cflags-y)变量就会被赋值为 -a32 和 -m32。 cc-option-align gcc版本大于3.0时,改变了函数,循环等用来声明内存对齐的选项。当用到 对齐选项时,$(cc-option-align) 用来选择正确的前缀: gcc < 3.00 cc-option-align = -malign gcc >= 3.00 cc-option-align = -falign 例子: CFLAGS += $(cc-option-align)-functions=4 在上面的例子中,选项 -falign-funcions=4 被用在gcc >= 3.00的时候。对 于小于3.00时, 使用 -malign-funcions=4 。 cc-version cc-version以数学形式返回 $(CC) 编译器的版本号。 其格式是:,二者都是数学。比如,gcc 3.41 会返回 0341。 当某版本的 $(CC) 在某方面有缺陷时,cc-version就会很有用。比如,选项 -mregparm=3 虽然会被gcc接受,但其实现是有问题的。 例子: #arch/i386/Makefile cflags-y += $(shell \ if [ $(call cc-version) -ge 0300 ] ; then \ echo "-meregparm=3"; fi ;) 在上面的例子中,-mregparm=3只会在gcc的版本号大于等于3.0的时候使用。 cc-ifversion cc-ifversion测试 $(CC) 的版本号,如果版本表达式为真,就赋值为最后的 参数。 例子: #fs/reiserfs/Makefile EXTRA_CFLAGS := $(call cc-ifversion, -lt, 0402, -O1) 在这个例子中,如果 $(CC) 的版本小于4.2,EXTRA_CFLAGS就被赋值 -O1。 cc-ifversion 可使用所有的shell 操作符:-eq,-ne,-lt,-le,-gt,和-ge。 第三个参数可以像上面例子一样是个文本,但也可以是个扩展的变量或宏。/*这段翻译的不好*/=== 4 本机程序支持Kbuild 支持编译那些将在编译阶段使用的可执行文件。为了使用该可执行文件,要将编译分成二个阶段。第一阶段是告诉Kbuild存在哪些可执行文件。这是通过变量 hostprogs-y来完成的。第二阶段是添加一个对可执行文件的显性依赖。有两种方法:增加依赖关系到一个规则中,或是利用变量 $(always)。以下是详细叙述. |
|