快乐虾
http://blog.csdn.net/lights_joy/
本文适用于
gcc- 4.3.1
configure –target=bfin-uclinux-gnu
Blackfin系列DSP
Cygwin gcc 3.4.4
欢迎转载,但请保留作者信息
这个Makefile由gcc- 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
这个目标的依赖关系为:
# 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。
这个文件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检测到configure和config.gcc的变化时将自动重新生成此文件。在学习过程中将此规则屏蔽。
这个文件同样由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
同样地,在学习时略过它。
这条规则为:
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
因而这个目标实际上什么也没做。
这条规则定义为:
# 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的生成》
这条规则定义为:
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。
这条规则定义为:
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。
这个目标并不是放在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的生成》。
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目标的生成》。
这个目标并不是放在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目标的生成》。
这个目标并不是放在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目标的生成》。
这条规则定义为:
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
这条规则定义为:
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)
所需要的目标均已生成,直接编译即可。
这个文件适用于通用规则:
.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
由于所需要的目标都已经生成,直接编译即可。
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-gcc中cc1plus.exe的生成( 2008-08-23 )
bfin-xxx-gcc中fortran目标的生成( 2008-8-24 )
bfin-xxx-gcc中java目标的生成( 2008-8-24 )
bfin-xxx-gcc中objc目标的生成( 2008-8-26 )
bfin-xxx-gcc中collect2目标的生成( 2008-8-26 )