5. 基本编译工具和编译选项
5.1编译选项
编译选项是另一个重要的控制手段。LINUX的编译选项第一级非常简单
cmd_as_o_S $(CC) $(a_flags) -c -o $@ $<
cmd_as_s_S $(CPP) $(a_flags) -o $@ $<
cmd_cc_i_c $(CPP) $(c_flags) -o $@ $<
cmd_cc_lst_c $(CC) $(c_flags) -g -c -o $*.o $< && $(CONFIG_SHELL) $(srctree)/scripts/makelst $*.o System.map $(OBJDUMP) > $@
cmd_cc_o_c $(CC) $(c_flags) -c -o $(@D)/.tmp_$(@F) $<
cmd_cc_s_c $(CC) $(c_flags) -fverbose-asm -S -o $@ $<
cmd_cpp_lds_S $(CPP) $(cpp_flags) -D__ASSEMBLY__ -o $@ $<
只是一个简单的控制选项。
其中c_flags定义为:
c_flags = -Wp,-MD,$(depfile) $(NOSTDINC_FLAGS) $(CPPFLAGS) /
$(__c_flags) $(modkern_cflags) /
-D"KBUILD_STR(s)=/#s" $(basename_flags) $(modname_flags)
NOSTDINC_FLAGS -nostdinc -isystem /usr/lib/gcc-lib/i386-redhat-linux/3.2.2/include 定义了头文件的控制
CPPFLAGS -D__KERNEL__ -Iinclude -include include/linux/autoconf.h 定义了编译kernel必须的宏 __KERNEL__和包含了系统配置选项文件。
__c_flags 为_c_flags,如果编译目标目录不同于源文件目录,对其中的-I选项增加源目录
其中用户可以对CFLAGS和EXTRA_CFLAGS作更改,同时更可以定义各个目标不同的编译选项
用户尽量不要改动CFLAGS的内容。
在 i386体系中CFLAGS部分内容如下:
CFLAGS -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -O2 -pipe -msoft-float -mpreferred-stack-boundary=2 -march=i686 -mregparm=3 -ffreestanding -maccumulate-outgoing-args -Iinclude/asm-i386/mach-default -fomit-frame-pointer
_a_flags $(AFLAGS) $(EXTRA_AFLAGS) $(AFLAGS_$(basetarget).o)
_c_flags $(CFLAGS) $(EXTRA_CFLAGS) $(CFLAGS_$(basetarget).o)
_cpp_flags $(CPPFLAGS) $(EXTRA_CPPFLAGS) $(CPPFLAGS_$(@F))
a_flags = -Wp,-MD,$(depfile) $(NOSTDINC_FLAGS) $(CPPFLAGS) /
$(__a_flags) $(modkern_aflags)
cpp_flags = -Wp,-MD,$(depfile) $(NOSTDINC_FLAGS) $(__cpp_flags)
ld_flags = $(LDFLAGS) $(EXTRA_LDFLAGS)
5.1.1 以下为有关MODULE的编译选项:
basetarget = $(basename $(notdir $@))
basename_flags = -D"KBUILD_BASENAME=KBUILD_STR($(call name-fix,$(basetarget)))"
modname = $(basetarget)
modname-multi = $(sort $(foreach m,$(multi-used),/
$(if $(filter $(subst $(obj)/,,$*.o), $($(m:.o=-objs)) $($(m:.o=-y))),$(m:.o=))))
$(multi-objs-m) : modname = $(modname-multi)
$(multi-objs-m:.o=.i) : modname = $(modname-multi)
modname_flags = $(if $(filter 1,$(words $(modname))),/
-D"KBUILD_MODNAME=KBUILD_STR($(call name-fix,$(modname)))")
其中c_flags中定义了 -D"KBUILD_STR(s)=/#s"
modkern_cflags定义的例子:
modkern_cflags := $(CFLAGS_KERNEL)
$(real-objs-m) : modkern_cflags := $(CFLAGS_MODULE)
$(real-objs-m:.o=.i) : modkern_cflags := $(CFLAGS_MODULE)
CFLAGS_KERNEL =
CFLAGS_MODULE = -DMODULE
modkern_aflags定义的例子:
modkern_aflags := $(AFLAGS_KERNEL)
$(real-objs-m) : modkern_aflags := $(AFLAGS_MODULE)
$(real-objs-m:.o=.s): modkern_aflags := $(AFLAGS_MODULE)
AFLAGS_KERNEL =
AFLAGS_MODULE = -DMODULE
单源文件可加载软件模块的生成:
$(LD) $(LDFLAGS) -r -o $@ $(@D)/.tmp_$(@F) /
-T $(@D)/.tmp_$(@F:.o=.ver); /