网站公告列表

  没有公告

加入收藏
设为首页
联系本站
您现在的位置: AnalogCN安诺电子 >> 文章 >> 技术交流 >> 文章正文
  bfin-xxx-gcc主控Makefile中all-host目标的生成           ★★★ 【字体:
bfin-xxx-gcc主控Makefile中all-host目标的生成
作者:快乐虾    文章来源:http://blog.csdn.net/lights_joy    点击数:    更新时间:2008-8-28    

1.1    all-host

这个目标将在生成all目标时生成。

.PHONY: all-host

 

all-host: maybe-all-ash                      #空目标

all-host: maybe-all-autoconf                 #空目标

all-host: maybe-all-automake                #空目标

all-host: maybe-all-bash                       #空目标

all-host: maybe-all-bison               #空目标

all-host: maybe-all-byacc                     #空目标

all-host: maybe-all-bzip2               #空目标

all-host: maybe-all-dejagnu                   #空目标

all-host: maybe-all-diff                        #空目标

all-host: maybe-all-dosutils                   #空目标

all-host: maybe-all-etc                         #空目标

all-host: maybe-all-fastjar                     #空目标

all-host: maybe-all-fileutils                   #空目标

all-host: maybe-all-findutils                  #空目标

all-host: maybe-all-find                        #空目标

all-host: maybe-all-fixincludes

all-host: maybe-all-flex                        #空目标

all-host: maybe-all-gcc

all-host: maybe-all-gawk               #空目标

all-host: maybe-all-gettext                    #空目标

all-host: maybe-all-gnuserv                  #空目标

all-host: maybe-all-gprof               #空目标

all-host: maybe-all-gzip                        #空目标

all-host: maybe-all-hello                       #空目标

all-host: maybe-all-indent                     #空目标

all-host: maybe-all-intl

all-host: maybe-all-tcl                          #空目标

all-host: maybe-all-itcl                         #空目标

all-host: maybe-all-libcpp

all-host: maybe-all-libdecnumber

all-host: maybe-all-libgui               #空目标

all-host: maybe-all-libiberty

all-host: maybe-all-libtool                     #空目标

all-host: maybe-all-m4                         #空目标

all-host: maybe-all-make               #空目标

all-host: maybe-all-mmalloc                 #空目标

all-host: maybe-all-patch               #空目标

all-host: maybe-all-perl                        #空目标

all-host: maybe-all-prms                      #空目标

all-host: maybe-all-rcs                         #空目标

all-host: maybe-all-readline                   #空目标

all-host: maybe-all-release                    #空目标

all-host: maybe-all-recode                    #空目标

all-host: maybe-all-sed                         #空目标

all-host: maybe-all-send-pr                   #空目标

all-host: maybe-all-shellutils                 #空目标

all-host: maybe-all-sid                         #空目标

all-host: maybe-all-sim                        #空目标

all-host: maybe-all-tar                          #空目标

all-host: maybe-all-texinfo                    #空目标

all-host: maybe-all-textutils                  #空目标

all-host: maybe-all-time                       #空目标

all-host: maybe-all-uudecode                #空目标

all-host: maybe-all-wdiff               #空目标

all-host: maybe-all-zip                         #空目标

all-host: maybe-all-zlib

all-host: maybe-all-gdb                        #空目标

all-host: maybe-all-expect                    #空目标

all-host: maybe-all-guile                       #空目标

all-host: maybe-all-tk                           #空目标

all-host: maybe-all-libtermcap        #空目标

all-host: maybe-all-utils                        #空目标

all-host: maybe-all-gnattools                 #空目标

1.1.1   maybe-all-fixincludes

all-host目标的生成依赖于这个目标,而它的依赖关系定义为:

.PHONY: all-fixincludes maybe-all-fixincludes

maybe-all-fixincludes:

TARGET-fixincludes=all

maybe-all-fixincludes: all-fixincludes

即这个目标将依赖于all-fixincludes这个目标。

1.1.1.1             all-fixincludes

这个目标的依赖关系如下:

all-fixincludes: configure-fixincludes

       @: $(MAKE); $(unstage)

       @r=`${PWD_COMMAND}`; export r; \

       s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \

       $(HOST_EXPORTS) \

       (cd $(HOST_SUBDIR)/fixincludes && \

         $(MAKE) $(FLAGS_TO_PASS)  $(TARGET-fixincludes))  

再往下还有:

all-fixincludes: maybe-all-libiberty

因此这个目标将依赖于configure-fixincludesmaybe-all-libibertymaybe-all-libiberty这个依赖关系将在host-i686-pc-cygwin\libiberty子目录下生成一个libiberty.a的库,而configure-fixincludes这个依赖关系将生成host-i686-pc-cygwin\fixincludes子目录并在此子目录下生成Makefile

在上述两部分完成后,将进入host-i686-pc-cygwin\fixincludes子目录并在其中执行make操作,指定的生成目标$(TARGET-fixincludes)的值为all

make之后,将在host-i686-pc-cygwin\fixincludes目录下生成几个文件:

fixincl.exe

fixinc.sh

mkheaders

1.1.1.1.1       configure-fixincludes

可以认为这是一个最终目标:

.PHONY: configure-fixincludes maybe-configure-fixincludes

configure-fixincludes:

       @: $(MAKE); $(unstage)

       @r=`${PWD_COMMAND}`; export r; \

       s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \

       test ! -f $(HOST_SUBDIR)/fixincludes/Makefile || exit 0; \

       $(SHELL) $(srcdir)/mkinstalldirs $(HOST_SUBDIR)/fixincludes ; \

       $(HOST_EXPORTS) \

       echo Configuring in $(HOST_SUBDIR)/fixincludes; \

       cd "$(HOST_SUBDIR)/fixincludes" || exit 1; \

       case $(srcdir) in \

         /* | [A-Za-z]:[\\/]*) topdir=$(srcdir) ;; \

         *) topdir=`echo $(HOST_SUBDIR)/fixincludes/ | \

              sed -e 's,\./,,g' -e 's,[^/]*/,../,g' `$(srcdir) ;; \

       esac; \

       srcdiroption="--srcdir=$${topdir}/fixincludes"; \

       libsrcdir="$$s/fixincludes"; \

       $(SHELL) $${libsrcdir}/configure \

         $(HOST_CONFIGARGS) --build=${build_alias} --host=${host_alias} \

         --target=${target_alias} $${srcdiroption}  \

         || exit 1

在这里HOST_SUBDIR定义为:

HOST_SUBDIR = host-i686-pc-cygwin

HOST_EXPORTS则定义为:

# This is the list of variables to export in the environment when

# configuring subdirectories for the host system.  We need to pass

# some to the GCC configure because of its hybrid host/target nature.

HOST_EXPORTS = \

       $(BASE_EXPORTS) \

       CC="$(CC)"; export CC; \

       CFLAGS="$(CFLAGS)"; export CFLAGS; \

       CONFIG_SHELL="$(SHELL)"; export CONFIG_SHELL; \

       CXX="$(CXX)"; export CXX; \

       CXXFLAGS="$(CXXFLAGS)"; export CXXFLAGS; \

       AR="$(AR)"; export AR; \

       AS="$(AS)"; export AS; \

       CC_FOR_BUILD="$(CC_FOR_BUILD)"; export CC_FOR_BUILD; \

       DLLTOOL="$(DLLTOOL)"; export DLLTOOL; \

       LD="$(LD)"; export LD; \

       LDFLAGS="$(LDFLAGS)"; export LDFLAGS; \

       NM="$(NM)"; export NM; \

       RANLIB="$(RANLIB)"; export RANLIB; \

       WINDRES="$(WINDRES)"; export WINDRES; \

       WINDMC="$(WINDMC)"; export WINDMC; \

       OBJCOPY="$(OBJCOPY)"; export OBJCOPY; \

       OBJDUMP="$(OBJDUMP)"; export OBJDUMP; \

       AR_FOR_TARGET="$(AR_FOR_TARGET)"; export AR_FOR_TARGET; \

       AS_FOR_TARGET="$(AS_FOR_TARGET)"; export AS_FOR_TARGET; \

       GCC_FOR_TARGET="$(GCC_FOR_TARGET)"; export GCC_FOR_TARGET; \

       LD_FOR_TARGET="$(LD_FOR_TARGET)"; export LD_FOR_TARGET; \

       NM_FOR_TARGET="$(NM_FOR_TARGET)"; export NM_FOR_TARGET; \

       OBJDUMP_FOR_TARGET="$(OBJDUMP_FOR_TARGET)"; export OBJDUMP_FOR_TARGET; \

       RANLIB_FOR_TARGET="$(RANLIB_FOR_TARGET)"; export RANLIB_FOR_TARGET; \

       TOPLEVEL_CONFIGURE_ARGUMENTS="$(TOPLEVEL_CONFIGURE_ARGUMENTS)"; export TOPLEVEL_CONFIGURE_ARGUMENTS; \

       GMPLIBS="$(HOST_GMPLIBS)"; export GMPLIBS; \

       GMPINC="$(HOST_GMPINC)"; export GMPINC; \

       $(RPATH_ENVVAR)=`echo "$(HOST_LIB_PATH)$$$(RPATH_ENVVAR)" | sed 's,::*,:,g;s,^:*,,;s,:*$$,,'`; export $(RPATH_ENVVAR);

因而这一段脚本执行后将创建一个叫做host-i686-pc-cygwin的子目录,并在此子目录下又建立一个fixincludes的子目录。

接下来将执行gcc-4.1.3/fixincludes/configure脚本,这个脚本将在host-i686-pc-cygwin/fixincludes下创建几个文件:

config.cache

config.h

config.log

config.status

Makefile

mkheaders.almost

stamp-h

1.1.1.1.2       maybe-all-libiberty

这个目标有如下依赖关系:

.PHONY: all-libiberty maybe-all-libiberty

maybe-all-libiberty:

TARGET-libiberty=all

maybe-all-libiberty: all-libiberty

即它将依赖于all-libiberty这个目标。

1.1.1.1.2.1  all-libiberty

这个目标有如下依赖关系:

all-libiberty: configure-libiberty

       @r=`${PWD_COMMAND}`; export r; \

       s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \

       $(HOST_EXPORTS) \

       (cd $(HOST_SUBDIR)/libiberty && \

         $(MAKE) $(FLAGS_TO_PASS)  $(TARGET-libiberty))

即此目标依赖于configure-libiberty,在configure-libiberty中将创建一个叫做host-i686-pc-cygwin/libiberty的子目录,接下来将执行gcc-4.1.3/libiberty/configure脚本,这个脚本将在host-i686-pc-cygwin/libiberty下创建几个用于make的文件。

而在实现此目标的脚本中,将直接进入host-i686-pc-cygwin/libiberty子目录并执行make操作。在这里TARGET-libiberty变量的值为:

TARGET-libiberty=all

因而make之后将在host-i686-pc-cygwin/libiberty子目录下生成一个libiberty.a文件。

对此Makefile的详细分析参见《gcc makefile研究-libiberty.doc

1.1.1.1.2.1.1   configure-libiberty

这是一个最终目标,其执行的脚本如下:

configure-libiberty:

       @r=`${PWD_COMMAND}`; export r; \

       s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \

       test ! -f $(HOST_SUBDIR)/libiberty/Makefile || exit 0; \

       $(SHELL) $(srcdir)/mkinstalldirs $(HOST_SUBDIR)/libiberty ; \

       $(HOST_EXPORTS) \

       echo Configuring in $(HOST_SUBDIR)/libiberty; \

       cd "$(HOST_SUBDIR)/libiberty" || exit 1; \

       case $(srcdir) in \

         /* | [A-Za-z]:[\\/]*) topdir=$(srcdir) ;; \

         *) topdir=`echo $(HOST_SUBDIR)/libiberty/ | \

              sed -e 's,\./,,g' -e 's,[^/]*/,../,g' `$(srcdir) ;; \

       esac; \

       srcdiroption="--srcdir=$${topdir}/libiberty"; \

       libsrcdir="$$s/libiberty"; \

       $(SHELL) $${libsrcdir}/configure \

         $(HOST_CONFIGARGS) --build=${build_alias} --host=${host_alias} \

         --target=${target_alias} $${srcdiroption}  \

         || exit 1      

在这里HOST_SUBDIR定义为:

HOST_SUBDIR = host-i686-pc-cygwin

因而这一段脚本执行后将创建一个叫做host-i686-pc-cygwin/libiberty的子目录,接下来将执行gcc-4.1.3/libiberty/configure脚本,这个脚本将在host-i686-pc-cygwin/libiberty下创建几个文件:

config.cache

config.h

config.log

config.status

Makefile

stamp-h

xhost-mkfrag

testsuite/Makefile

 

1.1.2   all-host: maybe-all-gcc

这个目标的依赖关系为:

.PHONY: all-gcc maybe-all-gcc

maybe-all-gcc:

TARGET-gcc=all

maybe-all-gcc: all-gcc

all-gcc: configure-gcc

       @r=`${PWD_COMMAND}`; export r; \

       s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \

       $(HOST_EXPORTS) \

       (cd $(HOST_SUBDIR)/gcc && \

         $(MAKE) $(FLAGS_TO_PASS) $(EXTRA_GCC_FLAGS) $(TARGET-gcc))

all-gcc: all-libiberty

all-gcc: maybe-all-gmp                        #空目标

all-gcc: maybe-all-intl

all-gcc: maybe-all-mpfr                       #空目标

all-gcc: maybe-all-build-texinfo            #空目标

all-gcc: maybe-all-build-bison        #空目标

all-gcc: maybe-all-build-byacc              #空目标

all-gcc: maybe-all-build-flex                 #空目标

all-gcc: maybe-all-build-libiberty

all-gcc: maybe-all-build-fixincludes

all-gcc: maybe-all-zlib

all-gcc: all-libcpp

all-gcc: all-libdecnumber

all-gcc: maybe-all-libiberty

all-gcc: maybe-all-fixincludes

 

即它依赖于configure-gcc,在configure-gcc中,它将创建host-i686-pc-cygwin/gcc子目录,并执行gcc-4.3.1/gcc/configure脚本,执行完这段脚本后,将在host-i686-pc-cygwin/gcc子目录下生成Makefile

而在上面这段脚本中,就是进入host-i686-pc-cygwin/gcc子目录并进行make操作。这里比较重要的是传递进去的参数:

TARGET-gcc=all

1.1.2.1             configure-gcc

这个目标有如下依赖关系:

configure-gcc: maybe-configure-intl

configure-gcc: maybe-all-binutils                 #空目标

configure-gcc: maybe-all-gas                      #空目标

configure-gcc: maybe-all-ld                        #空目标

configure-gcc:

       @r=`${PWD_COMMAND}`; export r; \

       s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \

       test ! -f $(HOST_SUBDIR)/gcc/Makefile || exit 0; \

       $(SHELL) $(srcdir)/mkinstalldirs $(HOST_SUBDIR)/gcc ; \

       $(HOST_EXPORTS) \

       echo Configuring in $(HOST_SUBDIR)/gcc; \

       cd "$(HOST_SUBDIR)/gcc" || exit 1; \

       case $(srcdir) in \

         /* | [A-Za-z]:[\\/]*) topdir=$(srcdir) ;; \

         *) topdir=`echo $(HOST_SUBDIR)/gcc/ | \

              sed -e 's,\./,,g' -e 's,[^/]*/,../,g' `$(srcdir) ;; \

       esac; \

       srcdiroption="--srcdir=$${topdir}/gcc"; \

       libsrcdir="$$s/gcc"; \

       $(SHELL) $${libsrcdir}/configure \

         $(HOST_CONFIGARGS) --build=${build_alias} --host=${host_alias} \

         --target=${target_alias} $${srcdiroption}  \

         || exit 1

maybe-configure-intl这个依赖项中,它将创建host-i686-pc-cygwin/intl子目录,并执行gcc-4.3.1/intl/configure脚本,执行完这段脚本后,将在host-i686-pc-cygwin/intl子目录下生成Makefile

在这一段要执行的脚本中:

HOST_SUBDIR = host-i686-pc-cygwin

srcdir = .

HOST_CONFIGARGS = --cache-file=./config.cache  '--enable-languages=c,c++,fortran,java,objc' --program-transform-name='s,^,bfin-uclinux-gnu-,'

build_alias=i686-pc-cygwin

target_alias=bfin-uclinux-gnu

所以这一段脚本将创建host-i686-pc-cygwin/gcc子目录,并执行gcc-4.3.1/gcc/configure脚本,执行完这段脚本后,将在host-i686-pc-cygwin/gcc子目录下生成以下几个文件:

.gdbinit

as

auto-host.h

collect-ld

config.cache

config.log

config.status

configargs.h

cstamp-h

gccbug

libaba-mk

Makefile

Make-hooks

nm

ada/Makefile

还创建了以下几个子目录:

build

cp

doc

fortran

java

objc

objcp

treelang

 

1.1.2.1.1       maybe-configure-intl

这个目标的依赖关系为:

.PHONY: configure-intl maybe-configure-intl

maybe-configure-intl:

maybe-configure-intl: configure-intl

configure-intl:

       @r=`${PWD_COMMAND}`; export r; \

       s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \

       test ! -f $(HOST_SUBDIR)/intl/Makefile || exit 0; \

       $(SHELL) $(srcdir)/mkinstalldirs $(HOST_SUBDIR)/intl ; \

       $(HOST_EXPORTS) \

       echo Configuring in $(HOST_SUBDIR)/intl; \

       cd "$(HOST_SUBDIR)/intl" || exit 1; \

       case $(srcdir) in \

         /* | [A-Za-z]:[\\/]*) topdir=$(srcdir) ;; \

         *) topdir=`echo $(HOST_SUBDIR)/intl/ | \

              sed -e 's,\./,,g' -e 's,[^/]*/,../,g' `$(srcdir) ;; \

       esac; \

       srcdiroption="--srcdir=$${topdir}/intl"; \

       libsrcdir="$$s/intl"; \

       $(SHELL) $${libsrcdir}/configure \

         $(HOST_CONFIGARGS) --build=${build_alias} --host=${host_alias} \

         --target=${target_alias} $${srcdiroption}  \

         || exit 1

在这一段要执行的脚本中:

HOST_SUBDIR = host-i686-pc-cygwin

srcdir = .

HOST_CONFIGARGS = --cache-file=./config.cache  '--enable-languages=c,c++,fortran,java,objc' --program-transform-name='s,^,bfin-uclinux-gnu-,'

build_alias=i686-pc-cygwin

target_alias=bfin-uclinux-gnu

所以这一段脚本将创建host-i686-pc-cygwin/intl子目录,并执行gcc-4.3.1/intl/configure脚本,执行完这段脚本后,将在host-i686-pc-cygwin/intl