LINUX编译系统(4)

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);   /

你可能感兴趣的:(Linux,linux,module,cmd,assembly,filter,c)