bfin-xxx-gcc中native目标的生成

 

快乐虾

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

[email protected]

   

 

本文适用于

gcc- 4.3.1

configure –target=bfin-uclinux-gnu

Blackfin系列DSP

Cygwin gcc 3.4.4

 

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

 

 

 

1       host-i686-pc-cygwin/gcc/Makefile

这个Makefilegcc- 4.3.1 /gcc/configure脚本生成,并在主控的Makefile中进行make操作,要求生成的目标为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

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- 4.3.1 /gcc/configure脚本生成,但是在Makefile中仍然定义了一个依赖规则:

# 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检测到configureconfig.gcc的变化时将自动重新生成此文件。在学习过程中将此规则屏蔽。

 

1.1.2   auto-host.h

这个文件同样由gcc- 4.3.1 /gcc/configure脚本生成,但是在Makefile中仍然定义了一个依赖规则:

# 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   fortran

fortran这个目标并不是放在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.exegcj.exejvgenmain.exejcf-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_H) coretypes.h $(TM_H) /

    $(OBSTACK_H) collect2.h intl.h

由于所需要的目标都已经生成,直接编译即可。

 

 

2       参考资料

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-gcccc1plus.exe的生成 2008-08-23

bfin-xxx-gccfortran目标的生成( 2008-8-24 )

bfin-xxx-gccjava目标的生成( 2008-8-24 )

bfin-xxx-gccobjc目标的生成( 2008-8-26 )

bfin-xxx-gcccollect2目标的生成( 2008-8-26 )

 

 

 

 

 

 

 

你可能感兴趣的:(bfin-xxx-gcc中native目标的生成)