快乐虾
http://blog.csdn.net/lights_joy/
lights@hb165.com
本文适用于
gcc-
configure –target=bfin-uclinux-gnu
Blackfin系列DSP
Cygwin gcc
欢迎转载,但请保留作者信息
1 主控Makefile
在gcc-
# 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-
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-
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.h和s-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中的文件,因而这段脚本将生成optionlist和s-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
这条规则说
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.c,coretypes.h,errors.h均为gcc-
SYSTEM_H定义为:
SYSTEM_H = system.h hwint.h $(srcdir)/../include/libiberty.h
均为已经存在的文件。
此外,本目标还依赖于BUILD_RTL和BUILD_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.c,coretypes.h,errors.h为源文件,BCONFIG_H,GTM_H和SYSTEM_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.h和gtype-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.c,gengtype-lex.c,gengtype-parse.c和errors.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
这条规则说
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) > $@
这条规则说明要生成这个目标,必
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解析(
host-i686-pc-cygwin/fixincludes/Makefile分析(
host-i686-pc-cygwin/zlib/Makefile分析(
host-i686-pc-cygwin/libcpp/Makefile分析(
host-i686-pc-cygwin/libdecnumber/Makefile分析(
bfin-xxx-gcc中cc1.exe的生成顺序(