bfin-xxx-gcc中cc1.exe的生成

时间:2022-01-21 02:28:48

 

 

 

快乐虾

http://blog.csdn.net/lights_joy/

lights@hb165.com

 

 

本文适用于

gcc- 4.3.1

configure –target=bfin-uclinux-gnu

Blackfin系列DSP

Cygwin gcc 3.4.4

 

 

欢迎转载,但请保留作者信息

 

 


 

1       主控Makefile

gcc- 4.3.1 主控Makefile中,将创建host-i686-pc-cygwin子目录,并在其中编译生成libiberty.alibcpp.alibdecnumber.a这几个库文件,然后创建host-i686-pc-cygwin/gcc子目录,并在其中动态生成一个Makefile,再进行make all操作。此时要求生成的all目标有如下的依赖关系:

# This is the default target.

# Set by autoconf to "all.internal" for a native build, or

# "all.cross" to build a cross compiler.

all: all.cross

all.cross又有以下依赖关系:

# This is what to compile if making a cross-compiler.

all.cross: native gcc-cross$(exeext) cpp$(exeext) specs /

       libgcc-support lang.all.cross doc # srcextra

native目标的依赖关系为:

# This is what is made with the host's compiler

# whether making a cross compiler or not.

native: config.status auto-host.h build-po $(LANGUAGES) /

       $(EXTRA_PASSES) $(EXTRA_PROGRAMS) $(COLLECT2)

这里有

LANGUAGES = c gcov$(exeext) gcov-dump$(exeext) $(CONFIG_LANGUAGES)

CONFIG_LANGUAGES =  c++ fortran java objc

EXTRA_PASSES =

EXTRA_PROGRAMS =

COLLECT2 = collect2$(exeext)

在本文中仅分析cc1.exe这个目标的生成。

2       cc1.exe

c目标的规则定义为:

# Define the names for selecting languages in LANGUAGES.

c: cc1$(exeext)

它依赖于cc1.exe

cc1$(exeext): $(C_OBJS) cc1-checksum.o $(BACKEND) $(LIBDEPS)

       $(CC) $(ALL_CFLAGS) $(LDFLAGS) -o $@ $(C_OBJS) cc1-checksum.o /

         $(BACKEND) $(LIBS) $(GMPLIBS)

即在生成所有需要的obj文件后,将链接生成cc1.exe

几个变量的定义如下:

C_OBJS = c-lang.o stub-objc.o $(C_AND_OBJC_OBJS)

C_AND_OBJC_OBJS = attribs.o c-errors.o c-lex.o c-pragma.o c-decl.o c-typeck.o /

  c-convert.o c-aux-info.o c-common.o c-opts.o c-format.o c-semantics.o /

  c-incpath.o cppdefault.o c-ppoutput.o c-cppbuiltin.o prefix.o /

  c-objc-common.o c-dump.o c-pch.o c-parser.o $(C_TARGET_OBJS) /

  c-gimplify.o tree-mudflap.o c-pretty-print.o c-omp.o

在生成所有的.o文件后,这条规则的脚本将它们链接为cc1.exe

在这个Makefile中,并没有为每一个.c文件都指定一个特别的生成规则,而是使用了一个隐式规则:

.c.o:

       $(CC) -c $(ALL_CFLAGS) $(ALL_CPPFLAGS) $< $(OUTPUT_OPTION)

 

2.1    c-lang.o

这个目标适用于通用规则:

.c.o:

       $(CC) -c $(ALL_CFLAGS) $(ALL_CPPFLAGS) $< $(OUTPUT_OPTION)

 

c-lang.o : c-lang.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(TREE_H) /

    $(C_TREE_H) $(DIAGNOSTIC_H) /

    $(GGC_H) langhooks.h $(LANGHOOKS_DEF_H) $(C_COMMON_H) gtype-c.h /

    c-objc-common.h $(C_PRAGMA_H) c-common.def $(TREE_INLINE_H)

很简单,无非是编译生成.o文件而已。

 

2.1.1   $(CONFIG_H)

这个变量定义为:

CONFIG_H  = config.h  $(host_xm_file_list)

host_xm_file_list= auto-host.h $(srcdir)/../include/ansidecl.h $(srcdir)/config/i386/xm-cygwin.h

在这里除config.h外都是已经存在的文件,因而这个目标依赖于config.h

config.h: cs-config.h ; @true

cs-config.h: Makefile

       TARGET_CPU_DEFAULT="" /

       HEADERS="$(host_xm_include_list)" DEFINES="$(host_xm_defines)" /

       $(SHELL) $(srcdir)/mkconfig.sh config.h

在上述脚本中,调用gcc- 4.3.1 /gcc/mkconfig.sh生成config.hcs-config.h两个文件。

 

2.1.2   $(SYSTEM_H)

这个变量定义为:

SYSTEM_H = system.h hwint.h $(srcdir)/../include/libiberty.h

这几个文件都已经存在,跳过这个目标。

 

2.1.3   $(TM_H)

这个变量定义为:

GTM_H     = tm.h      $(tm_file_list)

TM_H      = $(GTM_H) insn-constants.h insn-flags.h options.h

tm_file_list=options.h $(srcdir)/config/bfin/gnu.h $(srcdir)/config/dbxelf.h $(srcdir)/config/elfos.h $(srcdir)/config/bfin/elf.h $(srcdir)/config/linux.h $(srcdir)/config/bfin/uclinux.h $(srcdir)/defaults.h

在这里有一个依赖$(srcdir)/config/bfin/gnu.h,这个文件实际并不存在,也不需要,在此直接去除。

2.1.3.1             tm.h

这条规则定义为:

tm.h: cs-tm.h ; @true

cs-tm.h: Makefile

       TARGET_CPU_DEFAULT="$(target_cpu_default)" /

       HEADERS="$(tm_include_list)" DEFINES="$(tm_defines)" /

       $(SHELL) $(srcdir)/mkconfig.sh tm.h

这段脚本将调用gcc- 4.3.1 /gcc/mkconfig.sh脚本生成tm.hcs-tm.h两个文件。这里tm_include_list的定义为:

tm_include_list=options.h config/dbxelf.h config/elfos.h config/bfin/elf.h config/linux.h config/bfin/uclinux.h defaults.h

很明显少了一个config/bfin/bfin.h,因此必须补上,且只能放在列表的最前面。否则出错。

2.1.3.2             options.h

这条规则定义为:

options.h: s-options-h ; @true

s-options-h: optionlist $(srcdir)/opt-functions.awk $(srcdir)/opth-gen.awk

       $(AWK) -f $(srcdir)/opt-functions.awk -f $(srcdir)/opth-gen.awk /

              < $< > tmp-options.h

       $(SHELL) $(srcdir)/../move-if-change tmp-options.h options.h

       $(STAMP) $@

这条规则依赖于optionlist生成一个optionlist文件,并将此文件做为本段脚本的一个参数执行,生成options.hs-options-h两个文件。

2.1.3.2.1       optionlist

这条规则定义为:

optionlist: s-options ; @true

s-options: $(ALL_OPT_FILES) Makefile $(srcdir)/opt-gather.awk

       $(AWK) -f $(srcdir)/opt-gather.awk $(ALL_OPT_FILES) > tmp-optionlist

       $(SHELL) $(srcdir)/../move-if-change tmp-optionlist optionlist

       $(STAMP) s-options

在这里ALL_OPT_FILES定义的文件均为已经存在于srcdir中的文件,因而这段脚本将生成optionlists-options两个文件。

 

2.1.3.3             insn-constants.h

这条规则定义为:

# genconstants needs to run before insn-conditions.md is available

# (because the constants may be used in the conditions).

insn-constants.h: s-constants; @true

s-constants: build/genconstants$(build_exeext) $(MD_DEPS)

       $(RUN_GEN) build/genconstants$(build_exeext) $(md_file) /

         > tmp-constants.h

       $(SHELL) $(srcdir)/../move-if-change tmp-constants.h insn-constants.h

       $(STAMP) s-constants

这条规则说 明将首 先生成genconstants.exe,然后调用它来生成insn-constants.h这个目标。

 

2.1.3.3.1       build/genconstants$(build_exeext)

Makefile中没有为此目标单独定义一条规则,而是用了一条通用规则:

# As a general rule...

build/gen%$(build_exeext): build/gen%.o $(BUILD_LIBDEPS)

       $(CC_FOR_BUILD) $(BUILD_CFLAGS) $(BUILD_LDFLAGS) -o $@ /

           $(filter-out $(BUILD_LIBDEPS), $^) $(BUILD_LIBS)

# All these programs use the MD reader ($(BUILD_RTL)).

genprogmd = attr attrtab automata codes conditions config constants emit /

           extract flags mddeps opinit output peep preds recog

$(genprogmd:%=build/gen%$(build_exeext)): $(BUILD_RTL) $(BUILD_ERRORS)

BUILD_LIBDEPS定义为:

BUILD_LIBDEPS= $(BUILD_LIBIBERTY)

BUILD_LIBIBERTY = $(build_libobjdir)/libiberty/libiberty.a

libiberty.a目标已经生成,因而这个目标转为依赖:

build/genconstants.o : genconstants.c $(RTL_BASE_H) $(BCONFIG_H)  /

  $(SYSTEM_H) coretypes.h $(GTM_H) errors.h

在这里,genconstants.ccoretypes.herrors.h均为gcc- 4.3.1 /gcc目录下的文件。

SYSTEM_H定义为:

SYSTEM_H = system.h hwint.h $(srcdir)/../include/libiberty.h

均为已经存在的文件。

此外,本目标还依赖于BUILD_RTLBUILD_ERRORS。其中后者已经生成,而BUILD_RTL则定义为:

BUILD_RTL = build/rtl.o build/read-rtl.o build/ggc-none.o build/vec.o /

           build/min-insn-modes.o build/gensupport.o build/print-rtl.o

在依赖的文件都生成后,这个目标的脚本将编译genconstants.c生成genconstants.o并链接生成host-i686-pc-cygwin/gcc/build/genconstants.exe

2.1.3.3.1.1  $(RTL_BASE_H)

这个变量的定义为:

RTL_BASE_H = rtl.h rtl.def $(MACHMODE_H) reg-notes.def insn-notes.def /

  input.h $(REAL_H) statistics.h vec.h fixed-value.h alias.h

MACHMODE_H = machmode.h mode-classes.def insn-modes.h

REAL_H = real.h $(MACHMODE_H)

因而转为依赖:

insn-modes.h: s-modes-h; @true

s-modes-h: build/genmodes$(build_exeext)

       $(RUN_GEN) build/genmodes$(build_exeext) -h > tmp-modes.h

       $(SHELL) $(srcdir)/../move-if-change tmp-modes.h insn-modes.h

       $(STAMP) s-modes-h

由于存在以下规则:

build/genmodes.o : genmodes.c $(BCONFIG_H) $(SYSTEM_H) errors.h        /

  $(HASHTAB_H) machmode.def $(extra_modes_file)

build/genmodes$(build_exeext) : $(BUILD_ERRORS)

BUILD_ERRORS = build/errors.o

build/gen%$(build_exeext): build/gen%.o $(BUILD_LIBDEPS)

       $(CC_FOR_BUILD) $(BUILD_CFLAGS) $(BUILD_LDFLAGS) -o $@ /

           $(filter-out $(BUILD_LIBDEPS), $^) $(BUILD_LIBS)

因此Makefile将首先生成bconfig.h,然后再编译genmodes.c生成genmodes.o,然后编译errors.c生成errors.o

最后将之链接为host-i686-pc-cygwin/gcc/build/genmodes.exe

生成这个文件后,执行genmodes.exe –h生成host-i686-pc-cygwin/gcc/insn-modes.h,再生成一个host-i686-pc-cygwin/gcc/s-modes-h的空文件。

2.1.3.3.1.2  $(BCONFIG_H)

这个变量定义为:

BCONFIG_H = bconfig.h $(build_xm_file_list)

build_xm_file_list= auto-host.h $(srcdir)/../include/ansidecl.h $(srcdir)/config/i386/xm-cygwin.h

bconfig.h外均为已经存在的文件,因此有依赖关系:

bconfig.h: cs-bconfig.h ; @true

cs-bconfig.h: Makefile

       TARGET_CPU_DEFAULT="" /

       HEADERS="$(build_xm_include_list)" DEFINES="$(build_xm_defines)" /

       $(SHELL) $(srcdir)/mkconfig.sh bconfig.h

即它将调用mkconfig.sh来生成host-i686-pc-cygwin/gcc/bconfig.h

2.1.3.3.1.3  $(GTM_H)

这个变量定义为:

GTM_H     = tm.h      $(tm_file_list)

tm_file_list=options.h $(srcdir)/config/dbxelf.h $(srcdir)/config/elfos.h $(srcdir)/config/bfin/elf.h $(srcdir)/config/linux.h $(srcdir)/config/bfin/uclinux.h $(srcdir)/defaults.h

其中,tm.h在之前已经生成,其它的均为已经存在的文件,故可略过此目标。

2.1.3.3.1.4  build/rtl.o

在这里定义了一条通用规则:

build/%.o :  # dependencies provided by explicit rule later

       $(CC_FOR_BUILD) -c $(BUILD_CFLAGS) $(BUILD_CPPFLAGS) -o $@ $<

还定义了一个依赖关系:

build/rtl.o: rtl.c $(BCONFIG_H) coretypes.h $(GTM_H) $(SYSTEM_H)   /

  $(RTL_H) $(REAL_H) $(GGC_H) errors.h

在这个依赖关系中rtl.ccoretypes.herrors.h为源文件,BCONFIG_HGTM_HSYSTEM_H 定义的文件或者是源文件,或者是已经生成。

RTL_H定义为:

RTL_H = $(RTL_BASE_H) genrtl.h

其中$(RTL_BASE_H)目标已经生成,只要生成genrtl.h

REAL_H定义为:

REAL_H = real.h $(MACHMODE_H)

MACHMODE_H = machmode.h mode-classes.def insn-modes.h

其中insn-modes.h在此前已经生成,其余的为源文件。

GGC_H的定义为:

GGC_H = ggc.h gtype-desc.h

其中ggc.h为源文件。

因此rtl.o转而依赖于genrtl.hgtype-desc.h两个目标。

在编译这个文件时将发生一个语法错误:

../.././gcc/rtl.c: In function `copy_rtx`:

../.././gcc/rtl.c:247: error: `FIRST_PSEUDO_REGISTER` undeclared (first use in this function)

../.././gcc/rtl.c:247: error: (Each undeclared identifier is reported only once

../.././gcc/rtl.c:247: error: for each function it appears in.)

这个宏定义明明在gcc/config/bfin/bfin.h中定义了,这个错误只能说明是没有包含这个头文件,通过在xm_include_list变量中添加config/bfin/bfin.h可以解决此问题。

 

2.1.3.3.1.4.1   genrtl.h

这个依赖关系定义为:

genrtl.h: s-genrtl-h; @true

s-genrtl-h: build/gengenrtl$(build_exeext)

       $(RUN_GEN) build/gengenrtl$(build_exeext) -h > tmp-genrtl.h

       $(SHELL) $(srcdir)/../move-if-change tmp-genrtl.h genrtl.h

       $(STAMP) s-genrtl-h

build/gengenrtl.exe目标则依赖于通用规则:

build/gen%$(build_exeext): build/gen%.o $(BUILD_LIBDEPS)

       $(CC_FOR_BUILD) $(BUILD_CFLAGS) $(BUILD_LDFLAGS) -o $@ /

           $(filter-out $(BUILD_LIBDEPS), $^) $(BUILD_LIBS)

因此这里将首先编译gengenrtl.c生成gengenrtl.o再链接成gengenrtl.exe文件,然后调用gengenrtl.exe生成genrtl.h文件。

2.1.3.3.1.4.2   gtype-desc.h

这条规则定义为:

$(ALL_GTFILES_H) gtype-desc.c gtype-desc.h : s-gtype ; @true

s-gtype: build/gengtype$(build_exeext) $(filter-out [%], $(GTFILES)) /

        gtyp-input.list

       $(RUN_GEN) build/gengtype$(build_exeext) $(srcdir) gtyp-input.list

       $(STAMP) s-gtype

在生成gengtype.exe文件后,这段脚本将调用gengtype.exe生成一系列的文件:

2008-08-20  13:14           192,667 gtype-desc.c

2008-08-20  13:14             7,807 gtype-c.h

2008-08-20  13:14            10,491 gtype-treelang.h

2008-08-20  13:14             9,735 gtype-objcp.h

2008-08-20  13:14             8,002 gtype-objc.h

2008-08-20  13:14           122,718 gtype-java.h

2008-08-20  13:14            19,733 gtype-fortran.h

2008-08-20  13:14             9,625 gtype-cp.h

2008-08-20  13:14           100,010 gtype-ada.h

2008-08-20  13:14            70,002 gtype-desc.h

2008-08-20  13:14             1,143 gt-coverage.h

2008-08-20  13:14             1,479 gt-caller-save.h

2008-08-20  13:14               933 gt-bitmap.h

2008-08-20  13:14               966 gt-cselib.h

2008-08-20  13:14             1,137 gt-cgraph.h

2008-08-20  13:14             2,046 gt-ipa-inline.h

2008-08-20  13:14             1,172 gt-dojump.h

2008-08-20  13:14             1,170 gt-dwarf2asm.h

2008-08-20  13:14             2,866 gt-emit-rtl.h

2008-08-20  13:14               990 gt-explow.h

2008-08-20  13:14             1,095 gt-expr.h

2008-08-20  13:14               966 gt-gcse.h

2008-08-20  13:14             1,000 gt-lists.h

2008-08-20  13:14             1,007 gt-regclass.h

2008-08-20  13:14             1,008 gt-cfglayout.h

2008-08-20  13:14             1,474 gt-sdbout.h

2008-08-20  13:14               992 gt-stor-layout.h

2008-08-20  13:14             2,919 gt-tree-mudflap.h

2008-08-20  13:14             1,148 gt-tree-ssa-address.h

2008-08-20  13:14               943 gt-tree-phinodes.h

2008-08-20  13:14             1,153 gt-tree-ssa-propagate.h

2008-08-20  13:14               947 gt-tree-iterator.h

2008-08-20  13:14             1,014 gt-gimplify.h

2008-08-20  13:14             1,293 gt-tree-vect-generic.h

2008-08-20  13:14             2,298 gt-tree-profile.h

2008-08-20  13:14               996 gt-tree-nested.h

2008-08-20  13:14             1,054 gt-ipa-reference.h

2008-08-20  13:14             1,264 gt-tree-ssa-structalias.h

2008-08-20  13:14             1,026 gt-tree-parloops.h

2008-08-20  13:14             1,198 gt-omp-low.h

2008-08-20  13:14             1,451 gt-varpool.h

2008-08-20  13:14             1,129 gt-targhooks.h

2008-08-20  13:14             2,038 gt-passes.h

2008-08-20  13:14             1,109 gt-cgraphunit.h

2008-08-20  13:14             1,266 gt-ada-decl.h

2008-08-20  13:14             1,374 gt-cp-mangle.h

2008-08-20  13:14             1,129 gt-cp-call.h

2008-08-20  13:14             1,569 gt-cp-decl2.h

2008-08-20  13:14               982 gt-cp-repo.h

2008-08-20  13:14             1,015 gt-cp-method.h

2008-08-20  13:14             1,135 gt-cp-class.h

2008-08-20  13:14             1,278 gt-cp-cp-objcp-common.h

2008-08-20  13:14             1,582 gt-fortran-trans-decl.h

2008-08-20  13:14             2,599 gt-fortran-trans-intrinsic.h

2008-08-20  13:14             2,088 gt-fortran-trans-io.h

2008-08-20  13:14             1,925 gt-fortran-trans-types.h

2008-08-20  13:14             1,354 gt-java-builtins.h

2008-08-20  13:14             1,504 gt-java-class.h

2008-08-20  13:14             1,003 gt-java-constants.h

2008-08-20  13:14             1,708 gt-java-expr.h

2008-08-20  13:14             1,099 gt-java-jcf-parse.h

2008-08-20  13:14             1,097 gt-java-mangle.h

2008-08-20  13:14               988 gt-java-resource.h

2008-08-20  13:14             1,018 gt-treelang-tree1.h

2008-08-20  13:14             2,446 gt-function.h

2008-08-20  13:14             2,454 gt-integrate.h

2008-08-20  13:14             1,712 gt-bfin.h

2008-08-20  13:14             1,785 gt-java-lang.h

2008-08-20  13:14            99,597 gt-treelang-treetree.h

2008-08-20  13:14             5,165 gt-alias.h

2008-08-20  13:14             3,257 gt-dbxout.h

2008-08-20  13:14            58,038 gt-dwarf2out.h

2008-08-20  13:14            13,288 gt-except.h

2008-08-20  13:14             3,183 gt-optabs.h

2008-08-20  13:14             2,841 gt-stringpool.h

2008-08-20  13:14             5,160 gt-tree.h

2008-08-20  13:14            11,932 gt-varasm.h

2008-08-20  13:14             3,265 gt-tree-scalar-evolution.h

2008-08-20  13:14             8,228 gt-ada-trans.h

2008-08-20  13:14             6,310 gt-ada-utils.h

2008-08-20  13:14             2,559 gt-cp-rtti.h

2008-08-20  13:14            12,139 gt-cp-name-lookup.h

2008-08-20  13:14             2,591 gt-cp-pt.h

2008-08-20  13:14             4,160 gt-c-common.h

2008-08-20  13:14           133,768 gt-cp-tree.h

2008-08-20  13:14             5,311 gt-cp-decl.h

2008-08-20  13:14             2,558 gt-cp-semantics.h

2008-08-20  13:14             8,006 gt-cp-parser.h

2008-08-20  13:14             3,826 gt-cp-typeck2.h

2008-08-20  13:14             5,823 gt-c-pragma.h

2008-08-20  13:14           100,359 gt-fortran-f95-lang.h

2008-08-20  13:14             2,982 gt-java-decl.h

2008-08-20  13:14             2,037 gt-c-parser.h

2008-08-20  13:14           107,998 gt-c-decl.h

2008-08-20  13:14            15,587 gt-objc-objc-act.h

a)         build/gengtype$(build_exeext)

这个文件的生成适用于默认规则:

build/gen%$(build_exeext): build/gen%.o $(BUILD_LIBDEPS)

       $(CC_FOR_BUILD) $(BUILD_CFLAGS) $(BUILD_LDFLAGS) -o $@ /

           $(filter-out $(BUILD_LIBDEPS), $^) $(BUILD_LIBS)

还有一个依赖关系:

build/gengtype$(build_exeext) : build/gengtype-lex.o build/gengtype-parse.o /

                      $(BUILD_ERRORS)

即它将用gengtype.cgengtype-lex.cgengtype-parse.cerrors.c这四个文件来生成build/gengtype.exe

b)        $(filter-out [%], $(GTFILES))

GTFILES中定义的文件均为源文件,可略过。

c)        gtyp-input.list

这个依赖关系定义为:

define echo_to_gi.list

echo '$(gtyp)' >> tmp-gi.list

 

gtyp-input.list: s-gtyp-input ; @true

s-gtyp-input: Makefile

       $(foreach gtyp, $(GTFILES), $(echo_to_gi.list))

       $(SHELL) $(srcdir)/../move-if-change tmp-gi.list gtyp-input.list

       $(STAMP) s-gtyp-input

这段脚本将生成一个叫gtyp-input.list的文件,这个文件的每一行均是一个文件名。

2.1.3.3.1.5  build/read-rtl.o

在这里定义了一条通用规则:

build/%.o :  # dependencies provided by explicit rule later

       $(CC_FOR_BUILD) -c $(BUILD_CFLAGS) $(BUILD_CPPFLAGS) -o $@ $<

还定义了一个依赖关系:

build/read-rtl.o: read-rtl.c $(BCONFIG_H) $(SYSTEM_H) coretypes.h     /

  $(GTM_H) $(RTL_BASE_H) $(OBSTACK_H) $(HASHTAB_H) gensupport.h

在这个依赖关系中或者是源文件,或者是已经生成,因而就直接使用gcc编译即可。

2.1.3.3.1.6  build/ggc-none.o

在这里定义了一条通用规则:

build/%.o :  # dependencies provided by explicit rule later

       $(CC_FOR_BUILD) -c $(BUILD_CFLAGS) $(BUILD_CPPFLAGS) -o $@ $<

还定义了一个依赖关系:

build/ggc-none.o : ggc-none.c $(BCONFIG_H) $(SYSTEM_H) coretypes.h    /

  $(GGC_H)

在这个依赖关系中或者是源文件,或者是已经生成,因而就直接使用gcc编译即可。

2.1.3.3.1.7  build/vec.o

在这里定义了一条通用规则:

build/%.o :  # dependencies provided by explicit rule later

       $(CC_FOR_BUILD) -c $(BUILD_CFLAGS) $(BUILD_CPPFLAGS) -o $@ $<

还定义了一个依赖关系:

build/vec.o : vec.c $(BCONFIG_H) $(SYSTEM_H) coretypes.h vec.h /

   $(GGC_H) toplev.h

在这个依赖关系中或者是源文件,或者是已经生成,因而就直接使用gcc编译即可。

2.1.3.3.1.8  build/min-insn-modes.o

在这里定义了一条通用规则:

build/%.o :  # dependencies provided by explicit rule later

       $(CC_FOR_BUILD) -c $(BUILD_CFLAGS) $(BUILD_CPPFLAGS) -o $@ $<

还定义了一个依赖关系:

build/min-insn-modes.o : min-insn-modes.c $(BCONFIG_H) $(SYSTEM_H)    /

  $(MACHMODE_H)

在这个依赖关系中除min-insn-modes.c外或者是源文件,或者是已经生成,因而转为依赖关系:

min-insn-modes.c: s-modes-m; @true

s-modes-m: build/genmodes$(build_exeext)

       $(RUN_GEN) build/genmodes$(build_exeext) -m > tmp-min-modes.c

       $(SHELL) $(srcdir)/../move-if-change tmp-min-modes.c min-insn-modes.c

       $(STAMP) s-modes-m

在这个依赖关系中,genmodes.exe已经生成,故此直接调用生成min-insn-modes.c,最后编译成min-insn-modes.o

2.1.3.3.1.9  build/gensupport.o

在这里定义了一条通用规则:

build/%.o :  # dependencies provided by explicit rule later

       $(CC_FOR_BUILD) -c $(BUILD_CFLAGS) $(BUILD_CPPFLAGS) -o $@ $<

还定义了一个依赖关系:

build/gensupport.o: gensupport.c $(BCONFIG_H) $(SYSTEM_H) coretypes.h /

  $(GTM_H) $(RTL_BASE_H) $(OBSTACK_H) errors.h $(HASHTAB_H)             /

  gensupport.h

在这个依赖关系中或者是源文件,或者是已经生成,因而就直接使用gcc编译即可。

2.1.3.3.1.10 build/print-rtl.o

在这里定义了一条通用规则:

build/%.o :  # dependencies provided by explicit rule later

       $(CC_FOR_BUILD) -c $(BUILD_CFLAGS) $(BUILD_CPPFLAGS) -o $@ $<

还定义了一个依赖关系:

build/print-rtl.o: print-rtl.c $(BCONFIG_H) $(SYSTEM_H) coretypes.h    /

  $(GTM_H) $(RTL_BASE_H)

在这个依赖关系中或者是源文件,或者是已经生成,因而就直接使用gcc编译即可。

2.1.3.3.2       $(MD_DEPS)

这个变量定义为:

md_file=$(srcdir)/config/bfin/bfin.md

# Dependencies for the md file.  The first time through, we just assume

# the md file itself and the generated dependency file (in order to get

# it built).  The second time through we have the dependency file.

-include mddeps.mk

MD_DEPS = s-mddeps $(md_file) $(MD_INCLUDES)

 

s-mddeps: $(md_file) $(MD_INCLUDES) build/genmddeps$(build_exeext)

       $(RUN_GEN) build/genmddeps$(build_exeext) $(md_file) > tmp-mddeps

       $(SHELL) $(srcdir)/../move-if-change tmp-mddeps mddeps.mk

       $(STAMP) s-mddeps

因而这个目标将首先要求生成genmddeps.exe,然后调用它生成mddeps.mk。在这个生成的mddeps.mk中定义了MD_INCLUDES变量的值为:

MD_INCLUDES = /

       ../.././gcc/config/bfin/predicates.md

 

../.././gcc/config/bfin/predicates.md:

因此可略过MD_INCLUDES这个目标。

genmddeps.exe则由通用规则来生成:

build/gen%$(build_exeext): build/gen%.o $(BUILD_LIBDEPS)

       $(CC_FOR_BUILD) $(BUILD_CFLAGS) $(BUILD_LDFLAGS) -o $@ /

           $(filter-out $(BUILD_LIBDEPS), $^) $(BUILD_LIBS)

build/genmddeps.o: genmddeps.c $(BCONFIG_H) $(SYSTEM_H) coretypes.h /

  $(GTM_H) $(RTL_BASE_H) errors.h gensupport.h

 

2.1.3.4             insn-flags.h

这条规则定义为:

simple_generated_h = insn-attr.h insn-codes.h insn-config.h insn-flags.h

$(simple_generated_h): insn-%.h: s-%; @true

$(simple_generated_h:insn-%.h=s-%): s-%: build/gen%$(build_exeext) /

  $(MD_DEPS) insn-conditions.md

       $(RUN_GEN) build/gen$*$(build_exeext) $(md_file) /

         insn-conditions.md > tmp-$*.h

       $(SHELL) $(srcdir)/../move-if-change tmp-$*.h insn-$*.h

       $(STAMP) s-$*

因此本目标将首先编译genflags.c,生成genflags.exe,然后调用它生成insn-flags.h

 

2.1.3.4.1       genflags.exe

这个目标适用于通用规则:

build/gen%$(build_exeext): build/gen%.o $(BUILD_LIBDEPS)

       $(CC_FOR_BUILD) $(BUILD_CFLAGS) $(BUILD_LDFLAGS) -o $@ /

           $(filter-out $(BUILD_LIBDEPS), $^) $(BUILD_LIBS)

build/genflags.o : genflags.c $(RTL_BASE_H) $(OBSTACK_H) $(BCONFIG_H)     /

  $(SYSTEM_H) coretypes.h $(GTM_H) errors.h gensupport.h

所依赖的目标已经全部生成,因而直接编译genflags.c生成genflags.exe

2.1.3.4.2       insn-conditions.md

这个依赖关系定义为:

insn-conditions.md: s-condmd; @true

s-condmd: build/gencondmd$(build_exeext)

       $(RUN_GEN) build/gencondmd$(build_exeext) > tmp-cond.md

       $(SHELL) $(srcdir)/../move-if-change tmp-cond.md insn-conditions.md

       $(STAMP) s-condmd

这条规则说 明将首 先生成gencondmd.exe,再调用它生成insn-conditions.md

2.1.3.4.2.1  gencondmd.exe

这个目标适用于通用规则:

build/gen%$(build_exeext): build/gen%.o $(BUILD_LIBDEPS)

       $(CC_FOR_BUILD) $(BUILD_CFLAGS) $(BUILD_LDFLAGS) -o $@ /

           $(filter-out $(BUILD_LIBDEPS), $^) $(BUILD_LIBS)

build/gencondmd.o : build/gencondmd.c $(BCONFIG_H) $(SYSTEM_H)        /

  coretypes.h $(GTM_H) insn-constants.h $(RTL_H) $(TM_P_H)          /

  $(FUNCTION_H) $(REGS_H) $(RECOG_H) $(REAL_H) output.h $(FLAGS_H) /

  $(RESOURCE_H) toplev.h reload.h except.h tm-constrs.h

这里FUNCITON_H定义为:

FUNCTION_H = function.h $(TREE_H) $(HASHTAB_H)

TREE_H = tree.h tree.def $(MACHMODE_H) tree-check.h $(BUILTINS_DEF) /

          input.h statistics.h vec.h treestruct.def $(HASHTAB_H) /

          double-int.h alias.h

在这些依赖的文件中,tree-check.h需要动态生成。

2.1.3.4.2.1.1   gencondmd.c

这条依赖关系定义为:

build/gencondmd.c: s-conditions; @true

s-conditions: $(MD_DEPS) build/genconditions$(build_exeext)

       $(RUN_GEN) build/genconditions$(build_exeext) $(md_file) > tmp-condmd.c

       $(SHELL) $(srcdir)/../move-if-change tmp-condmd.c build/gencondmd.c

       $(STAMP) s-conditions

在这里genconditions.exe的生成适用于通用规则:

build/gen%$(build_exeext): build/gen%.o $(BUILD_LIBDEPS)

       $(CC_FOR_BUILD) $(BUILD_CFLAGS) $(BUILD_LDFLAGS) -o $@ /

           $(filter-out $(BUILD_LIBDEPS), $^) $(BUILD_LIBS)

build/genconditions.o : genconditions.c $(RTL_BASE_H) $(BCONFIG_H)       /

  $(SYSTEM_H) coretypes.h $(GTM_H) errors.h

因为所有目标都已经生成或者是源文件,因此直接编译生成genconditions.exe,然后调用它生成gencondmd.c这个文件。

2.1.3.4.2.1.2   tm_p.h

这条规则定义为:

tm_p.h: cs-tm_p.h ; @true

cs-tm_p.h: Makefile

       TARGET_CPU_DEFAULT="" /

       HEADERS="$(tm_p_include_list)" DEFINES="" /

       $(SHELL) $(srcdir)/mkconfig.sh tm_p.h

即它将调用mkconfig.sh来生成tm_p.h

2.1.3.4.2.1.3   tree-check.h

这条规则定义为:

tree-check.h: s-check ; @true

s-check : build/gencheck$(build_exeext)

       $(RUN_GEN) build/gencheck$(build_exeext) > tmp-check.h

       $(SHELL) $(srcdir)/../move-if-change tmp-check.h tree-check.h

       $(STAMP) s-check

即它将首先生成gencheck.exe,然后调用它生成tree-check.h

gencheck.exe的生成适用于通用规则:

build/gen%$(build_exeext): build/gen%.o $(BUILD_LIBDEPS)

       $(CC_FOR_BUILD) $(BUILD_CFLAGS) $(BUILD_LDFLAGS) -o $@ /

           $(filter-out $(BUILD_LIBDEPS), $^) $(BUILD_LIBS)

build/gencheck.o : gencheck.c gencheck.h tree.def $(BCONFIG_H) $(GTM_H)      /

       $(SYSTEM_H) coretypes.h $(lang_tree_files)

所有目标都已具备,直接编译gencheck.c生成gencheck.exe

 

2.1.3.4.2.1.4   tm-constrs.h

这条规则定义为:

tm-constrs.h: s-constrs-h; @true

s-constrs-h: $(MD_DEPS) build/genpreds$(build_exeext)

       $(RUN_GEN) build/genpreds$(build_exeext) -c $(md_file) > tmp-constrs.h

       $(SHELL) $(srcdir)/../move-if-change tmp-constrs.h tm-constrs.h

       $(STAMP) s-constrs-h

即它要求先生成genpreds.exe,然后调用此文件生成tm-constrs.h,而genpreds.exe的生成适用于通用规则:

build/gen%$(build_exeext): build/gen%.o $(BUILD_LIBDEPS)

       $(CC_FOR_BUILD) $(BUILD_CFLAGS) $(BUILD_LDFLAGS) -o $@ /

           $(filter-out $(BUILD_LIBDEPS), $^) $(BUILD_LIBS)

build/genpreds.o : genpreds.c $(RTL_BASE_H) $(BCONFIG_H) $(SYSTEM_H)     /

  coretypes.h $(GTM_H) errors.h gensupport.h $(OBSTACK_H)

2.1.4   $(TREE_H)

这个变量的定义为:

TREE_H = tree.h tree.def $(MACHMODE_H) tree-check.h $(BUILTINS_DEF) /

          input.h statistics.h vec.h treestruct.def $(HASHTAB_H) /

          double-int.h alias.h

它的目标在此之前已经全部生成。

2.1.5   $(C_TREE_H)

这个变量的定义为:

C_TREE_H = c-tree.h $(C_COMMON_H) toplev.h $(DIAGNOSTIC_H)

C_COMMON_H = c-common.h $(SPLAY_TREE_H) $(CPPLIB_H) $(GGC_H)

DIAGNOSTIC_H = diagnostic.h diagnostic.def $(PRETTY_PRINT_H) options.h

这些都是源文件或者已经生成的目标。

2.1.6   $(DIAGNOSTIC_H)

这个变量的定义为:

DIAGNOSTIC_H = diagnostic.h diagnostic.def $(PRETTY_PRINT_H) options.h

PRETTY_PRINT_H = pretty-print.h input.h $(OBSTACK_H)

OBSTACK_H   = $(srcdir)/../include/obstack.h

都是源文件。

2.1.7   $(GGC_H)

这个变量的定义为:

GGC_H = ggc.h gtype-desc.h

一个是源文件,一个已经生成。

2.1.8   $(LANGHOOKS_DEF_H)

这个变量定义为:

LANGHOOKS_DEF_H = langhooks-def.h $(HOOKS_H)

HOOKS_H = hooks.h $(MACHMODE_H)

MACHMODE_H = machmode.h mode-classes.def insn-modes.h

都是源文件或者已经生成的文件。

 

2.1.9   $(C_COMMON_H)

这个变量定义为:

C_COMMON_H = c-common.h $(SPLAY_TREE_H) $(CPPLIB_H) $(GGC_H)

都是源文件或者已经实现的目标。

 

2.1.10 gtype-c.h

这个文件在此前已经生成。

2.1.11 $(C_PRAGMA_H)

这个变量定义为:

C_PRAGMA_H = c-pragma.h $(CPPLIB_H)

CPPLIB_H = $(srcdir)/../libcpp/include/line-map.h /

       $(srcdir)/../libcpp/include/cpplib.h

都是源文件。

2.1.12 $(TREE_INLINE_H)

这个变量定义为:

VARRAY_H = varray.h $(MACHMODE_H) $(SYSTEM_H) coretypes.h $(TM_H)

TREE_INLINE_H = tree-inline.h $(VARRAY_H) pointer-set.h

都是源文件或者已经生成的文件。

2.2    stub-objc.o

这个目标适用于通用规则:

.c.o:

       $(CC) -c $(ALL_CFLAGS) $(ALL_CPPFLAGS) $< $(OUTPUT_OPTION)

 

stub-objc.o : stub-objc.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TREE_H) /

    $(C_COMMON_H)

所需要的目标已经全部生成,因此这条规则很简单,无非是编译生成.o文件而已。

 

2.3    attribs.o

这个目标适用于通用规则:

.c.o:

       $(CC) -c $(ALL_CFLAGS) $(ALL_CPPFLAGS) $< $(OUTPUT_OPTION)

 

attribs.o : attribs.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(TREE_H) /

       $(FLAGS_H) toplev.h output.h $(RTL_H) $(GGC_H) $(TM_P_H) /

       $(TARGET_H) langhooks.h $(CPPLIB_H)

所需要的目标已经全部生成,因此这条规则很简单,无非是编译生成.o文件而已。

 

2.4    c-errors.o

这个目标适用于通用规则:

.c.o:

       $(CC) -c $(ALL_CFLAGS) $(ALL_CPPFLAGS) $< $(OUTPUT_OPTION)

 

c-errors.o: c-errors.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(TREE_H) /

    $(C_TREE_H) $(FLAGS_H) $(DIAGNOSTIC_H) $(TM_P_H)

所需要的目标已经全部生成,因此这条规则很简单,无非是编译生成.o文件而已。

 

2.5    c-lex.o

这个目标适用于通用规则:

.c.o:

       $(CC) -c $(ALL_CFLAGS) $(ALL_CPPFLAGS) $< $(OUTPUT_OPTION)

 

c-lex.o : c-lex.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(TREE_H) /

    $(RTL_H) debug.h $(C_TREE_H) $(C_COMMON_H) $(REAL_H) $(SPLAY_TREE_H) /

    $(C_PRAGMA_H) input.h intl.h $(FLAGS_H) toplev.h output.h /

    $(CPPLIB_H) $(TARGET_H) $(TIMEVAR_H) $(TM_P_H)

所需要的目标已经全部生成,因此这条规则很简单,无非是编译生成.o文件而已。

 

2.6    c-pragma.o

这个目标适用于通用规则:

.c.o:

       $(CC) -c $(ALL_CFLAGS) $(ALL_CPPFLAGS) $< $(OUTPUT_OPTION)

 

c-pragma.o: c-pragma.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H) /

    $(TREE_H) $(FUNCTION_H) $(C_PRAGMA_H) toplev.h output.h $(GGC_H) $(TM_P_H) /

    $(C_COMMON_H) $(TARGET_H) gt-c-pragma.h $(CPPLIB_H) $(FLAGS_H)

所需要的目标已经全部生成,因此这条规则很简单,无非是编译生成.o文件而已。

 

2.7    c-decl.o

这个目标适用于通用规则:

.c.o:

       $(CC) -c $(ALL_CFLAGS) $(ALL_CPPFLAGS) $< $(OUTPUT_OPTION)

 

c-decl.o : c-decl.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(TREE_H) /

    $(RTL_H) $(C_TREE_H) $(GGC_H) $(TARGET_H) $(FLAGS_H) $(FUNCTION_H) output.h /

    $(EXPR_H) debug.h toplev.h intl.h $(TM_P_H) $(TREE_INLINE_H) $(TIMEVAR_H) /

    opts.h $(C_PRAGMA_H) gt-c-decl.h $(CGRAPH_H) $(HASHTAB_H) libfuncs.h /

    except.h $(LANGHOOKS_DEF_H) $(TREE_DUMP_H) $(C_COMMON_H) $(CPPLIB_H) /

    $(DIAGNOSTIC_H) input.h langhooks.h $(TREE_GIMPLE_H) tree-mudflap.h  /

    pointer-set.h

这个目标依赖于EXPR_H。这个变量定义为:

EXPR_H = expr.h insn-config.h $(FUNCTION_H) $(RTL_H) $(FLAGS_H) $(TREE_H) $(MACHMODE_H) $(EMIT_RTL_H)

其中insn-config.h没有生成,因此必 先生成这个文件,看看它的依赖关系:

simple_generated_h = insn-attr.h insn-codes.h insn-config.h insn-flags.h

$(simple_generated_h): insn-%.h: s-%; @true

$(simple_generated_h:insn-%.h=s-%): s-%: build/gen%$(build_exeext) /

  $(MD_DEPS) insn-conditions.md

       $(RUN_GEN) build/gen$*$(build_exeext) $(md_file) /

         insn-conditions.md > tmp-$*.h

       $(SHELL) $(srcdir)/../move-if-change tmp-$*.h insn-$*.h

       $(STAMP) s-$*

因此本目标将首先编译genconfig.c,生成genconfig.exe,然后调用它生成insn-config.h

 

 

2.8    c-typeck.o

这个目标适用于通用规则:

.c.o:

       $(CC) -c $(ALL_CFLAGS) $(ALL_CPPFLAGS) $< $(OUTPUT_OPTION)

 

c-typeck.o : c-typeck.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) /

    $(TREE_H) $(C_TREE_H) $(TARGET_H) $(FLAGS_H) intl.h output.h $(EXPR_H) /

    $(RTL_H) toplev.h $(TM_P_H) langhooks.h $(GGC_H) $(TREE_FLOW_H) /

    $(TREE_GIMPLE_H) tree-iterator.h

所需要的目标已经全部生成,因此这条规则很简单,无非是编译生成.o文件而已。

 

2.9    c-convert.o

这个目标适用于通用规则:

.c.o:

       $(CC) -c $(ALL_CFLAGS) $(ALL_CPPFLAGS) $< $(OUTPUT_OPTION)

 

c-convert.o : c-convert.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) /

    $(TREE_H) $(FLAGS_H) toplev.h $(C_COMMON_H) convert.h $(C_TREE_H) /

    langhooks.h $(TARGET_H)

所需要的目标已经全部生成,因此这条规则很简单,无非是编译生成.o文件而已。

 

2.10       c-aux-info.o

这个目标适用于通用规则:

.c.o:

       $(CC) -c $(ALL_CFLAGS) $(ALL_CPPFLAGS) $< $(OUTPUT_OPTION)

 

c-aux-info.o : c-aux-info.c  $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(TREE_H) /

    $(C_TREE_H) $(FLAGS_H) toplev.h

所需要的目标已经全部生成,因此这条规则很简单,无非是编译生成.o文件而已。

 

2.11       c-common.o

这个目标适用于通用规则:

.c.o:

       $(CC) -c $(ALL_CFLAGS) $(ALL_CPPFLAGS) $< $(OUTPUT_OPTION)

 

c-common.o : c-common.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(TREE_H) /

       $(OBSTACK_H) $(C_COMMON_H) $(FLAGS_H) toplev.h output.h $(C_PRAGMA_H) /

       $(GGC_H) $(EXPR_H) $(TM_P_H) builtin-types.def builtin-attrs.def /

       $(DIAGNOSTIC_H) gt-c-common.h langhooks.h $(VARRAY_H) $(RTL_H) /

       $(TARGET_H) $(C_TREE_H) tree-iterator.h langhooks.h tree-mudflap.h /

       intl.h opts.h $(REAL_H) $(CPPLIB_H) $(TREE_INLINE_H) $(HASHTAB_H) /

       $(BUILTINS_DEF)

所需要的目标已经全部生成,因此这条规则很简单,无非是编译生成.o文件而已。

 

2.12       c-opts.o

这条规则定义为:

c-opts.o : c-opts.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H)         /

        $(TREE_H) $(C_PRAGMA_H) $(FLAGS_H) toplev.h langhooks.h           /

        $(TREE_INLINE_H) $(DIAGNOSTIC_H) intl.h debug.h $(C_COMMON_H)  /

        opts.h options.h $(MKDEPS_H) c-incpath.h cppdefault.h $(TM_P_H)

       $(CC) -c $(ALL_CFLAGS) $(ALL_CPPFLAGS) /

              $< $(OUTPUT_OPTION)

所需要的目标已经全部生成,因此这条规则很简单,无非是编译生成.o文件而已。

 

2.13       c-format.o

这个目标适用于通用规则:

.c.o:

       $(CC) -c $(ALL_CFLAGS) $(ALL_CPPFLAGS) $< $(OUTPUT_OPTION)

 

c-format.o : c-format.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(TREE_H) langhooks.h /

       $(C_COMMON_H) $(FLAGS_H) toplev.h intl.h $(DIAGNOSTIC_H) alloc-pool.h /

       c-format.h

所需要的目标已经全部生成,因此这条规则很简单,无非是编译生成.o文件而已。

 

2.14       c-semantics.o

这个目标适用于通用规则:

.c.o:

       $(CC) -c $(ALL_CFLAGS) $(ALL_CPPFLAGS) $< $(OUTPUT_OPTION)

 

c-semantics.o : c-semantics.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) /

       $(TREE_H) $(FLAGS_H) toplev.h output.h $(RTL_H) $(GGC_H) /

       $(PREDICT_H) $(TREE_INLINE_H) $(C_COMMON_H) except.h $(FUNCTION_H) /

       langhooks.h $(SPLAY_TREE_H) $(TIMEVAR_H) $(TREE_GIMPLE_H) /

       $(VARRAY_H)

所需要的目标已经全部生成,因此这条规则很简单,无非是编译生成.o文件而已。

 

2.15       c-incpath.o

这个目标适用于通用规则:

.c.o:

       $(CC) -c $(ALL_CFLAGS) $(ALL_CPPFLAGS) $< $(OUTPUT_OPTION)

 

c-incpath.o: c-incpath.c c-incpath.h $(CONFIG_H) $(SYSTEM_H) $(CPPLIB_H) /

              intl.h prefix.h coretypes.h $(TM_H) cppdefault.h $(TARGET_H) /

              $(MACHMODE_H)

所需要的目标已经全部生成,因此这条规则很简单,无非是编译生成.o文件而已。

 

2.16       cppdefault.o

这条规则定义为:

cppdefault.o: cppdefault.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) /

       cppdefault.h Makefile

       $(CC) $(ALL_CFLAGS) $(ALL_CPPFLAGS) /

         $(PREPROCESSOR_DEFINES) /

         -c $(srcdir)/cppdefault.c $(OUTPUT_OPTION)

所需要的目标已经全部生成,因此这条规则很简单,无非是编译生成.o文件而已。

 

2.17       c-ppoutput.o

这个目标适用于通用规则:

.c.o:

       $(CC) -c $(ALL_CFLAGS) $(ALL_CPPFLAGS) $< $(OUTPUT_OPTION)

 

c-ppoutput.o : c-ppoutput.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) /

    $(C_COMMON_H) $(TREE_H) $(CPPLIB_H) $(srcdir)/../libcpp/internal.h /

    $(C_PRAGMA_H)

所需要的目标已经全部生成,因此这条规则很简单,无非是编译生成.o文件而已。

 

2.18       c-cppbuiltin.o

这个目标适用于通用规则:

.c.o:

       $(CC) -c $(ALL_CFLAGS) $(ALL_CPPFLAGS) $< $(OUTPUT_OPTION)

 

c-cppbuiltin.o : c-cppbuiltin.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) /

       $(TREE_H) version.h $(C_COMMON_H) $(C_PRAGMA_H) $(FLAGS_H) toplev.h /

       output.h except.h $(REAL_H) $(TARGET_H) $(TM_P_H)

所需要的目标已经全部生成,因此这条规则很简单,无非是编译生成.o文件而已。

 

2.19       prefix.o

这条规则定义为:

prefix.o: prefix.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) prefix.h /

       Makefile $(BASEVER)

       $(CC) $(ALL_CFLAGS) $(ALL_CPPFLAGS) /

       -DPREFIX=/"$(prefix)/" -DBASEVER=$(BASEVER_s) /

         -c $(srcdir)/prefix.c $(OUTPUT_OPTION)

所需要的目标已经全部生成,因此这条规则很简单,无非是编译生成.o文件而已。

 

2.20       c-objc-common.o

这个目标适用于通用规则:

.c.o:

       $(CC) -c $(ALL_CFLAGS) $(ALL_CPPFLAGS) $< $(OUTPUT_OPTION)

 

c-objc-common.o : c-objc-common.c $(CONFIG_H) $(SYSTEM_H) coretypes.h /

    $(TM_H) $(TREE_H) $(C_TREE_H) $(RTL_H) insn-config.h $(INTEGRATE_H) /

    $(FUNCTION_H) $(FLAGS_H) toplev.h $(TREE_INLINE_H) $(DIAGNOSTIC_H) $(VARRAY_H) /

    langhooks.h $(GGC_H) $(TARGET_H) $(C_PRETTY_PRINT_H) c-objc-common.h /

    tree-mudflap.h

所需要的目标已经全部生成,因此这条规则很简单,无非是编译生成.o文件而已。

 

2.21       c-dump.o

这个目标适用于通用规则:

.c.o:

       $(CC) -c $(ALL_CFLAGS) $(ALL_CPPFLAGS) $< $(OUTPUT_OPTION)

 

c-dump.o : c-dump.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(TREE_H) /

       $(C_TREE_H) $(TREE_DUMP_H)

所需要的目标已经全部生成,因此这条规则很简单,无非是编译生成.o文件而已。

 

2.22       c-pch.o

这条规则定义为:

c-pch.o : c-pch.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(CPPLIB_H) $(TREE_H) /

       $(C_COMMON_H) output.h toplev.h $(C_PRAGMA_H) $(GGC_H) debug.h /

       langhooks.h $(FLAGS_H) hosthooks.h version.h $(TARGET_H)

       $(CC) -c $(ALL_CFLAGS) $(ALL_CPPFLAGS) /

         -DHOST_MACHINE=/"$(host)/" -DTARGET_MACHINE=/"$(target)/" /

         $< $(OUTPUT_OPTION)

所需要的目标已经全部生成,因此这条规则很简单,无非是编译生成.o文件而已。

 

2.23       c-parser.o

这个目标适用于通用规则:

.c.o:

       $(CC) -c $(ALL_CFLAGS) $(ALL_CPPFLAGS) $< $(OUTPUT_OPTION)

 

c-parser.o : c-parser.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(TREE_H) /

    $(GGC_H) $(TIMEVAR_H) $(C_TREE_H) input.h $(FLAGS_H) toplev.h output.h /

    $(CPPLIB_H) gt-c-parser.h langhooks.h $(C_COMMON_H) $(C_PRAGMA_H) /

    vec.h $(TARGET_H)

所需要的目标已经全部生成,因此这条规则很简单,无非是编译生成.o文件而已。

 

2.24       $(C_TARGET_OBJS)

这个变量定义为:

# Target specific, C specific object file

C_TARGET_OBJS=

可略过。

2.25       c-gimplify.o

这个目标适用于通用规则:

.c.o:

       $(CC) -c $(ALL_CFLAGS) $(ALL_CPPFLAGS) $< $(OUTPUT_OPTION)

 

c-gimplify.o : c-gimplify.c $(CONFIG_H) $(SYSTEM_H) $(TREE_H) /

   $(C_TREE_H) $(C_COMMON_H) $(DIAGNOSTIC_H) $(TREE_GIMPLE_H) $(VARRAY_H) /

   $(FLAGS_H) langhooks.h toplev.h $(RTL_H) $(TREE_FLOW_H) $(LANGHOOKS_DEF_H) /

   $(TM_H) coretypes.h $(C_PRETTY_PRINT_H) $(CGRAPH_H) $(BASIC_BLOCK_H) /

   hard-reg-set.h $(TREE_DUMP_H) $(TREE_INLINE_H)

所需要的目标已经全部生成,因此这条规则很简单,无非是编译生成.o文件而已。

 

2.26       tree-mudflap.o

这个目标适用于通用规则:

.c.o:

       $(CC) -c $(ALL_CFLAGS) $(ALL_CPPFLAGS) $< $(OUTPUT_OPTION)

 

tree-mudflap.o : $(CONFIG_H) $(SYSTEM_H) $(TREE_H) $(TREE_INLINE_H) /

   $(TREE_GIMPLE_H) $(DIAGNOSTIC_H) $(HASHTAB_H) langhooks.h tree-mudflap.h /

   $(TM_H) coretypes.h $(TREE_DUMP_H) tree-pass.h $(CGRAPH_H) $(GGC_H) /

   gt-tree-mudflap.h $(BASIC_BLOCK_H) $(FLAGS_H) $(FUNCTION_H) hard-reg-set.h /

   $(RTL_H) $(TM_P_H) $(TREE_FLOW_H) toplev.h

所需要的目标已经全部生成,因此这条规则很简单,无非是编译生成.o文件而已。

 

2.27       c-pretty-print.o

这个目标适用于通用规则:

.c.o:

       $(CC) -c $(ALL_CFLAGS) $(ALL_CPPFLAGS) $< $(OUTPUT_OPTION)

 

c-pretty-print.o : c-pretty-print.c $(C_PRETTY_PRINT_H) /

       $(C_TREE_H) $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(REAL_H) /

       $(DIAGNOSTIC_H) tree-iterator.h fixed-value.h

所需要的目标已经全部生成,因此这条规则很简单,无非是编译生成.o文件而已。

 

2.28       c-omp.o

这个目标适用于通用规则:

.c.o:

       $(CC) -c $(ALL_CFLAGS) $(ALL_CPPFLAGS) $< $(OUTPUT_OPTION)

 

c-omp.o : c-omp.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(TREE_H) /

       $(FUNCTION_H) $(C_COMMON_H) toplev.h $(TREE_GIMPLE_H)

所需要的目标已经全部生成,因此这条规则很简单,无非是编译生成.o文件而已。

 

2.29       cc1-checksum.o

这个目标适用于通用规则:

.c.o:

       $(CC) -c $(ALL_CFLAGS) $(ALL_CPPFLAGS) $< $(OUTPUT_OPTION)

cc1-checksum.o : cc1-checksum.c

cc1-checksum.c : cc1-dummy$(exeext) build/genchecksum$(build_exeext)

       build/genchecksum$(build_exeext) cc1-dummy$(exeext) > $@

这条规则说明要生成这个目标,必 须首 先生成cc1-dummy.exegenchecksum.exe,然后用这两个可执行文件生成cc1-checksum.c,然后应用默认规则生成目标。

2.29.1 cc1-dummy$(exeext)

这条规则定义为:

cc1-dummy$(exeext): $(C_OBJS) dummy-checksum.o $(BACKEND) $(LIBDEPS)

     $(CC) $(ALL_CFLAGS) $(LDFLAGS) -o $@ $(C_OBJS) dummy-checksum.o /

       $(BACKEND) $(LIBS) $(GMPLIBS)

在这个依赖关系中,$(C_OBJS)定义的目标已经生成。$(LIBDEPS)定义的目标也已经生成或者已经存在,因此这个目标只依赖于dummy-checksum.o$(BACKEND)

在这些目标都生成后,将链接生成cc1-dummy.exe

2.29.1.1       dummy-checksum.o

这个目标适用于通用规则:

.c.o:

       $(CC) -c $(ALL_CFLAGS) $(ALL_CPPFLAGS) $< $(OUTPUT_OPTION)

dummy-checksum.o : dummy-checksum.c

没什么,无非是编译dummy-checksum.c而已。

 

2.29.1.2       $(BACKEND)

这个变量定义为:

BACKEND = main.o  libbackend.a $(CPPLIB) $(LIBDECNUMBER)

将之展开可以得到下面的依赖关系。

2.29.1.2.1  main.o 

这个目标适用于通用规则:

.c.o:

       $(CC) -c $(ALL_CFLAGS) $(ALL_CPPFLAGS) $< $(OUTPUT_OPTION)

main.o : main.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) toplev.h

没什么,无非是编译main.c而已。

 

2.29.1.2.2  libbackend.a

这个依赖关系定义为:

libbackend.a: $(OBJS)

       -rm -rf libbackend.a

       $(AR) $(AR_FLAGS) libbackend.a $(OBJS)

       -$(RANLIB) $(RANLIB_FLAGS) libbackend.a

从这个规则可以看出,它将首先编译所需要的.o文件,然后将它们链接到libbackend.a这个库文件中。在编译这些文件时,大部分都适用于通用规则:

.c.o:

       $(CC) -c $(ALL_CFLAGS) $(ALL_CPPFLAGS) $< $(OUTPUT_OPTION)

OBJS的定义为:

OBJS = $(OBJS-common) $(OBJS-md) $(OBJS-archive)

展开后就有以下的依赖关系。

2.29.1.2.3  $(CPPLIB)

这个变量定义为:

CPPLIB = ../libcpp/libcpp.a

在此前已经生成,故略过此目标。

2.29.1.2.4  $(LIBDECNUMBER)

这个变量定义为:

LIBDECNUMBER = ../libdecnumber/libdecnumber.a

在此前已经生成,故略过此目标。

2.29.2 genchecksum$(build_exeext)

这个目标适用于通用规则:

build/gen%$(build_exeext): build/gen%.o $(BUILD_LIBDEPS)

       $(CC_FOR_BUILD) $(BUILD_CFLAGS) $(BUILD_LDFLAGS) -o $@ /

           $(filter-out $(BUILD_LIBDEPS), $^) $(BUILD_LIBS);/

且有如下依赖关系:

build/genchecksum.o : genchecksum.c $(BCONFIG_H) $(SYSTEM_H) $(MD5_H)

即它将用genchecksum.c来生成genchecksum.exe

2.30       $(BACKEND)

此目标已经生成,略过。

2.31       $(LIBDEPS)

此目标已经生成,略过。

 

3       参考资料

host-i686-pc-cygwin/libiberty/Makefile解析( 2008-8-19 )

host-i686-pc-cygwin/fixincludes/Makefile分析( 2008-8-19 )

host-i686-pc-cygwin/zlib/Makefile分析( 2008-8-19 )

host-i686-pc-cygwin/libcpp/Makefile分析( 2008-8-19 )

host-i686-pc-cygwin/libdecnumber/Makefile分析( 2008-8-19 )

bfin-xxx-gcccc1.exe的生成顺序( 2008-8-22 )