内核映像的形成 —— KBuild体系(三)

2.1.3 编译标志


KBuild体系还有一个重要的概念,那就是编译标志。我们可以在一些Makefile中看到如下标志:
EXTRA_CFLAGS、 EXTRA_AFLAGS、 EXTRA_LDFLAGS、EXTRA_ARFLAGS

 

这些EXTRA_开头的大写字母变量都是编译标志,所有的 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的$(CC)拥有变量 $(CFLAGS) 用来作为整个源代码树的编译选项,所以在这里做这么一个设置就是将$(CFLAGS)替换成EXTRA_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

 

注意,Kbuild跟踪在以下方面依赖:
1) 所有要参与编译的文件(所有的.c 和.h文件)
2) 在参与编译文件中所要使用的 CONFIG_ 选项
3) 用于编译目标的命令行

因此,如果你改变了 $(CC) 的编译选项,所有受影响的文件都要重新编译。

你可能感兴趣的:(c,汇编,语言,makefile)