![]() |
|
||||||||||||||
| | 首页 | 新闻 | 文库 | 方案 | 技术 | 独家 | 座谈 | 下载 | 图库 | 开发板 | 仿真器 | 邮购 | VIP会员 | 芯片代购 | 客户评价 | | ||
|
||
|
|||||
| bfin-xxx-gcc中native目标的生成 | |||||
作者:快乐虾 文章来源:http://blog.csdn.net/lights_joy 点击数: 更新时间:2008-8-27 ![]() |
|||||
1 host-i686-pc-cygwin/gcc/Makefile这个Makefile由gcc- # 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 1.1 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) 这个目标将生成一系列在windows下运行的编译器,这些编译器生成的目标代码为blackfin cpu。 1.1.1 config.status这个文件gcc- # Really, really stupid make features, such as SUN's KEEP_STATE, may force # a target to build even if it is up-to-date. So we must verify that # config.status does not exist before failing. config.status: $(srcdir)/configure $(srcdir)/config.gcc @if [ ! -f config.status ] ; then \ echo You must configure gcc. Look at http://gcc.gnu.org/install/ for details.; \ false; \ else \ LANGUAGES="$(CONFIG_LANGUAGES)" $(SHELL) config.status --recheck; \ fi 这样当make检测到configure和config.gcc的变化时将自动重新生成此文件。在学习过程中将此规则屏蔽。 1.1.2 auto-host.h这个文件同样由gcc- # Don't run autoheader automatically either. # Only run it if maintainer mode is enabled. # $(srcdir)/config.in: $(srcdir)/cstamp-h.in # $(srcdir)/cstamp-h.in: $(srcdir)/configure.ac # (cd $(srcdir) && autoheader) # @rm -f $(srcdir)/cstamp-h.in # echo timestamp > $(srcdir)/cstamp-h.in auto-host.h: cstamp-h ; @true cstamp-h: config.in config.status CONFIG_HEADERS=auto-host.h:config.in \ CONFIG_FILES= \ LANGUAGES="$(CONFIG_LANGUAGES)" $(SHELL) config.status 同样地,在学习时略过它。 1.1.3 build-po这条规则为: build-po: $(CATALOGS) 而CATALOGS则定义为: CATALOGS = $(patsubst %,po/%, be.gmo da.gmo de.gmo el.gmo es.gmo fr.gmo ja.gmo nl.gmo ru.gmo sr.gmo sv.gmo tr.gmo zh_CN.gmo zh_TW.gmo be.gmo da.gmo de.gmo el.gmo es.gmo fr.gmo ja.gmo nl.gmo ru.gmo sr.gmo sv.gmo tr.gmo zh_CN.gmo zh_TW.gmo) 此外还有一条隐规则: # Dummy rules to deal with dependencies produced by use of # "build-po" and "install-po" above, when NLS is disabled. build-: ; @true install-: ; @true 因而这个目标实际上什么也没做。 1.1.4 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) 这部分的实现参见《bfin-xxx-gcc中cc1.exe的生成》 1.1.5 gcov$(exeext)这条规则定义为: GCOV_OBJS = gcov.o intl.o version.o errors.o gcov$(exeext): $(GCOV_OBJS) $(LIBDEPS) $(CC) $(ALL_CFLAGS) $(LDFLAGS) $(GCOV_OBJS) $(LIBS) -o $@ 在这个依赖关系中,除gcov.o外,其余目标均已经生成,因此这条规则转为依赖通用规则: .c.o: $(CC) -c $(ALL_CFLAGS) $(ALL_CPPFLAGS) $< $(OUTPUT_OPTION);\ 此外还有依赖关系: gcov.o: gcov.c gcov-io.c $(GCOV_IO_H) intl.h $(SYSTEM_H) coretypes.h $(TM_H) \ $(CONFIG_H) version.h 这里的所有目标均已经生成,因此直接编译链接即可生成gcov.exe。 1.1.6 gcov-dump$(exeext)这条规则定义为: GCOV_DUMP_OBJS = gcov-dump.o version.o errors.o gcov-dump$(exeext): $(GCOV_DUMP_OBJS) $(LIBDEPS) $(CC) $(ALL_CFLAGS) $(LDFLAGS) $(GCOV_DUMP_OBJS) $(LIBS) -o $@ 在这个依赖关系中,除gcov-dump.o外,其余目标均已经生成,因此这条规则转为依赖通用规则: .c.o: $(CC) -c $(ALL_CFLAGS) $(ALL_CPPFLAGS) $< $(OUTPUT_OPTION);\ 此外还有依赖关系: gcov-dump.o: gcov-dump.c gcov-io.c $(GCOV_IO_H) $(SYSTEM_H) coretypes.h \ $(TM_H) $(CONFIG_H) 这里的所有目标均已经生成,因此直接编译链接即可生成gcov-dump.exe。 1.1.7 c++这个目标并不是放在gcc/Makefile中,而是在gcc/cp/Make-lang.in文件中,然后在gcc/Makefile中有这个的语句: LANG_MAKEFRAGS = $(srcdir)/ada/Make-lang.in $(srcdir)/cp/Make-lang.in $(srcdir)/fortran/Make-lang.in $(srcdir)/java/Make-lang.in $(srcdir)/objc/Make-lang.in $(srcdir)/objcp/Make-lang.in $(srcdir)/treelang/Make-lang.in ifneq ($(LANG_MAKEFRAGS),) include $(LANG_MAKEFRAGS) endif 这样就包含了gcc/cp/Make-lang.in。在此文件中是这样定义c++这条规则的: # Define the names for selecting c++ in LANGUAGES. # Note that it would be nice to move the dependency on g++ # into the C++ rule, but that needs a little bit of work # to do the right thing within all.cross. c++: cc1plus$(exeext) cc1plus$(exeext): $(CXX_OBJS) cc1plus-checksum.o $(BACKEND) $(LIBDEPS) $(CC) $(ALL_CFLAGS) $(LDFLAGS) -o $@ \ $(CXX_OBJS) cc1plus-checksum.o $(BACKEND) $(LIBS) $(GMPLIBS) 在这个依赖关系中,$(BACKEND)和$(LIBDEPS)在生成cc1.exe时已经生成,因此这个目标依赖于$(CXX_OBJS)和cc1plus-checksum.o。在这些目标生成后,这段脚本将它们链接为cc1plus.exe。 CXX_OBJS = cp/cp-lang.o stub-objc.o $(CXX_AND_OBJCXX_OBJS) CXX_AND_OBJCXX_OBJS = cp/call.o cp/decl.o cp/expr.o cp/pt.o cp/typeck2.o \ cp/class.o cp/decl2.o cp/error.o cp/lex.o cp/parser.o cp/ptree.o cp/rtti.o \ cp/typeck.o cp/cvt.o cp/except.o cp/friend.o cp/init.o cp/method.o \ cp/search.o cp/semantics.o cp/tree.o cp/repo.o cp/dump.o cp/optimize.o \ cp/mangle.o cp/cp-objcp-common.o cp/name-lookup.o cp/cxx-pretty-print.o \ cp/cp-gimplify.o tree-mudflap.o $(CXX_C_OBJS) 在这里$(CXX_C_OBJS)定义了与cc1.exe共用的C文件,而这些文件在之前已经生成,因此可略过。 这部分的具体分析参见《bfin-xxx-gcc中cc1plus.exe的生成》。 1.1.8 fortranfortran这个目标并不是放在gcc/Makefile中,而是在gcc/fortran/Make-lang.in文件中,然后在gcc/Makefile中有这个的语句: LANG_MAKEFRAGS = $(srcdir)/ada/Make-lang.in $(srcdir)/cp/Make-lang.in $(srcdir)/fortran/Make-lang.in $(srcdir)/java/Make-lang.in $(srcdir)/objc/Make-lang.in $(srcdir)/objcp/Make-lang.in $(srcdir)/treelang/Make-lang.in ifneq ($(LANG_MAKEFRAGS),) include $(LANG_MAKEFRAGS) endif 这样就包含了gcc/fortran/Make-lang.in。在此文件中是这样定义fortran这条规则的: # Define the names for selecting gfortran in LANGUAGES. fortran: f951$(exeext) f951$(exeext): $(F95_OBJS) \ $(BACKEND) $(LIBDEPS) attribs.o $(CC) $(ALL_CFLAGS) $(LDFLAGS) -o $@ \ $(F95_OBJS) $(BACKEND) $(LIBS) attribs.o $(GMPLIBS) 在这个依赖关系中,$(BACKEND),$(LIBDEPS)和attribs.o在生成cc1.exe时已经生成,因此这个目标依赖于$(F95_OBJS)。在这些目标生成后,这段脚本将它们链接为f951.exe。 F95_PARSER_OBJS = fortran/arith.o fortran/array.o fortran/bbt.o \ fortran/check.o fortran/data.o fortran/decl.o fortran/dump-parse-tree.o \ fortran/error.o fortran/expr.o fortran/interface.o \ fortran/intrinsic.o fortran/io.o fortran/iresolve.o \ fortran/match.o fortran/matchexp.o fortran/misc.o fortran/module.o \ fortran/openmp.o fortran/options.o fortran/parse.o fortran/primary.o \ fortran/resolve.o fortran/scanner.o fortran/simplify.o fortran/st.o \ fortran/symbol.o fortran/target-memory.o F95_OBJS = $(F95_PARSER_OBJS) \ fortran/convert.o fortran/dependency.o fortran/f95-lang.o \ fortran/trans.o fortran/trans-array.o fortran/trans-common.o \ fortran/trans-const.o fortran/trans-decl.o fortran/trans-expr.o \ fortran/trans-intrinsic.o fortran/trans-io.o fortran/trans-openmp.o \ fortran/trans-stmt.o fortran/trans-types.o 在这里.o文件的生成适用于通用规则: .c.o: $(CC) -c $(ALL_CFLAGS) $(ALL_CPPFLAGS) $< $(OUTPUT_OPTION);\ 然后为$(F95_PARSER_OBJS)定义了一个依赖关系: $(F95_PARSER_OBJS): fortran/gfortran.h fortran/libgfortran.h \ fortran/intrinsic.h fortran/match.h \ fortran/parse.h fortran/arith.h fortran/target-memory.h \ $(CONFIG_H) $(SYSTEM_H) $(TM_H) $(TM_P_H) coretypes.h \ $(RTL_H) $(TREE_H) $(TREE_DUMP_H) $(GGC_H) $(EXPR_H) \ $(FLAGS_H) output.h $(DIAGNOSTIC_H) errors.h $(FUNCTION_H) 对于其它的.o文件,则单独定义依赖规则。 在所有的.o文件都生成后,将把它们链接成f951.exe这个fortran编译器。 详细的分析参见《bfin-xxx-gcc中fortran目标的生成》。 1.1.9 java这个目标并不是放在gcc/Makefile中,而是在gcc/java/Make-lang.in文件中,然后在gcc/Makefile中有这个的语句: LANG_MAKEFRAGS = $(srcdir)/ada/Make-lang.in $(srcdir)/cp/Make-lang.in $(srcdir)/fortran/Make-lang.in $(srcdir)/java/Make-lang.in $(srcdir)/objc/Make-lang.in $(srcdir)/objcp/Make-lang.in $(srcdir)/treelang/Make-lang.in ifneq ($(LANG_MAKEFRAGS),) include $(LANG_MAKEFRAGS) endif 这样就包含了gcc/java/Make-lang.in。在此文件中是这样定义java这条规则的: java: jc1$(exeext) $(GCJ)$(exeext) jvgenmain$(exeext) jcf-dump$(exeext) 最终的结果将生成jc1.exe,gcj.exe,jvgenmain.exe和jcf-dump.exe四个文件。 这部分的详细分析参见《bfin-xxx-gcc中java目标的生成》。 1.1.10 objc这个目标并不是放在gcc/Makefile中,而是在gcc/objc/Make-lang.in文件中,然后在gcc/Makefile中有这个的语句: LANG_MAKEFRAGS = $(srcdir)/ada/Make-lang.in $(srcdir)/cp/Make-lang.in $(srcdir)/fortran/Make-lang.in $(srcdir)/java/Make-lang.in $(srcdir)/objc/Make-lang.in $(srcdir)/objcp/Make-lang.in $(srcdir)/treelang/Make-lang.in ifneq ($(LANG_MAKEFRAGS),) include $(LANG_MAKEFRAGS) endif 这样就包含了gcc/java/Make-lang.in。在此文件中是这样定义java这条规则的: objc: cc1obj$(exeext) cc1obj$(exeext): $(OBJC_OBJS) $(C_AND_OBJC_OBJS) cc1obj-checksum.o $(BACKEND) $(LIBDEPS) $(CC) $(ALL_CFLAGS) $(LDFLAGS) -o $@ \ $(OBJC_OBJS) $(C_AND_OBJC_OBJS) cc1obj-checksum.o \ $(BACKEND) $(LIBS) $(GMPLIBS) 最终的结果将链接生成cc1obj.exe文件。 这个目标的详细生成过程参见《bfin-xxx-gcc中objc目标的生成》。 1.1.11 collect2$(exeext)这条规则定义为: collect2$(exeext): $(COLLECT2_OBJS) $(LIBDEPS) # Don't try modifying collect2 (aka ld) in place--it might be linking this. $(CC) $(ALL_CFLAGS) $(LDFLAGS) -o T$@ \ $(COLLECT2_OBJS) $(LIBS) $(COLLECT2_LIBS) mv -f T$@ $@ 其中$(LIBDEPS)已经生成,因而在$(COLLECT2_OBJS)目标生成后,这段脚本将它们链接为collect2.exe。 COLLECT2_OBJS = collect2.o tlink.o intl.o version.o 1.1.11.1 collect2.o这条规则定义为: collect2.o : collect2.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) intl.h \ $(OBSTACK_H) $(DEMANGLE_H) collect2.h version.h $(CC) $(ALL_CFLAGS) $(ALL_CPPFLAGS) \ -DTARGET_MACHINE=\"$(target_noncanonical)\" \ -c $(srcdir)/collect2.c $(OUTPUT_OPTION) 所需要的目标均已生成,直接编译即可。 1.1.11.2 tlink.o这个文件适用于通用规则: .c.o: $(CC) -c $(ALL_CFLAGS) $(ALL_CPPFLAGS) $< $(OUTPUT_OPTION);\ 同时有下列依赖关系: tlink.o: tlink.c $(DEMANGLE_H) $(HASHTAB_H) $(CONFIG_H) $(SYSTEM | |||||