![]() |
|
||||||||||||||
| | 首页 | 新闻 | 文库 | 方案 | 技术 | 独家 | 座谈 | 下载 | 图库 | 开发板 | 仿真器 | 邮购 | VIP会员 | 芯片代购 | 客户评价 | | ||
|
||
|
|||||
| 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-fixincludesall-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-fixincludes和maybe-all-libiberty,maybe-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- 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- 而在实现此目标的脚本中,将直接进入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- 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- 而在上面这段脚本中,就是进入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- 在这一段要执行的脚本中: 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- .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- | |||||