+@endif gcc
+
+# ---------------------
+# GCC bootstrap support
+# ---------------------
+
+# We track the current stage (the one in 'gcc') in the stage_current file.
+# stage_last instead tracks the stage that was built last. These targets
+# are dummy when toplevel bootstrap is not active.
+
+.PHONY: unstage
+unstage:
+@if gcc-bootstrap
+ @[ -f stage_current ] || $(MAKE) `cat stage_last`-start
+@endif gcc-bootstrap
+
+.PHONY: stage
+stage:
+@if gcc-bootstrap
+ @$(MAKE) `cat stage_current`-end
+@endif gcc-bootstrap
+
+# We name the build directories for the various stages "stage1-gcc",
+# "stage2-gcc","stage3-gcc", etc.
+
+# Since the 'compare' process will fail (on debugging information) if any
+# directory names are different, we need to link the gcc directory for
+# the previous stage to a constant name ('gcc-prev'), and to make the name of
+# the build directories constant as well. For the latter, we use naked names
+# like 'gcc', because the scripts in that directory assume it. We use
+# mv on platforms where symlinks to directories do not work or are not
+# reliable.
+
+# At the end of the bootstrap, a symlink to 'stage3-gcc' named 'gcc' must
+# be kept, so that libraries can find it. Ick!
+
+# It would be best to preinstall gcc into a staging area (and in the
+# future, gather there all prebootstrap packages). This would allow
+# assemblers and linkers can be bootstrapped as well as the compiler
+# (both in a combined tree, or separately). This however requires some
+# change to the gcc driver, again in order to avoid comparison failures.
+
+# Bugs: This is crippled when doing parallel make, the `make all-host'
+# and `make all-target' phases can be parallelized.
+
+
+# 'touch' doesn't work right on some platforms.
+STAMP = echo timestamp >
+
+# Only build the C compiler for stage1, because that is the only one that
+# we can guarantee will build with the native compiler, and also it is the
+# only thing useful for building stage2. STAGE1_CFLAGS (via CFLAGS),
+# MAKEINFO and MAKEINFOFLAGS are explicitly passed here to make them
+# overrideable (for a bootstrap build stage1 also builds gcc.info).
+
+STAGE1_CFLAGS=@stage1_cflags@
+STAGE1_LANGUAGES=@stage1_languages@
+
+# We only want to compare .o files, so set this!
+objext = .o
+
+# Flags to pass to stage2 and later makes.
+POSTSTAGE1_FLAGS_TO_PASS = \
+ CC="$${CC}" CC_FOR_BUILD="$${CC_FOR_BUILD}" \
+ STAGE_PREFIX=$$r/stage[+prev+]-gcc/ \
+ CFLAGS="$(BOOT_CFLAGS)" \
+ ADAC="\$$(CC)"
+
+# For stage 1:
+# * We force-disable intermodule optimizations, even if
+# --enable-intermodule was passed, since the installed compiler probably
+# can't handle them. Luckily, autoconf always respects
+# the last argument when conflicting --enable arguments are passed.
+# * Likewise, we force-disable coverage flags, since the installed compiler
+# probably has never heard of them.
+# * We build only C (and possibly Ada).
+
+[+ FOR bootstrap-stage +]
+.PHONY: stage[+id+]-start stage[+id+]-end
+
+stage[+id+]-start::
+ @[ -f stage_current ] && $(MAKE) `cat stage_current`-end || : ; \
+ echo stage[+id+] > stage_current ; \
+ echo stage[+id+] > stage_last; \
+ $(mkinstalldirs) $(HOST_SUBDIR)[+
+ FOR host_modules +][+ IF bootstrap +]
+@if [+ module +]
+ @cd $(HOST_SUBDIR); [ -d stage[+id+]-[+module+] ] || \
+ mkdir stage[+id+]-[+module+]; \
+ set stage[+id+]-[+module+] [+module+] ; \
+ @CREATE_LINK_TO_DIR@ [+ IF prev +] ; \
+ set stage[+prev+]-[+module+] prev-[+module+] ; \
+ @CREATE_LINK_TO_DIR@ [+ ENDIF prev +]
+@endif [+ module +][+ ENDIF bootstrap +][+ ENDFOR host_modules +]
+
+stage[+id+]-end::
+ @rm -f stage_current[+ FOR host_modules +][+ IF bootstrap +]
+@if [+ module +]
+ @cd $(HOST_SUBDIR); set [+module+] stage[+id+]-[+module+] ; \
+ @UNDO_LINK_TO_DIR@ [+ IF prev +] ; \
+ set prev-[+module+] stage[+prev+]-[+module+] ; \
+ @UNDO_LINK_TO_DIR@ [+ ENDIF prev +]
+@endif [+ module +][+ ENDIF bootstrap +][+ ENDFOR host_modules +]
+
+# Bubble a bugfix through all the stages up to stage [+id+]. They
+# are remade, but not reconfigured. The next stage (if any) will not
+# be reconfigured as well.
+.PHONY: stage[+id+]-bubble
+stage[+id+]-bubble:: [+ IF prev +]stage[+prev+]-bubble[+ ENDIF +][+IF lean +]
+ @bootstrap_lean@-rm -rf stage[+lean+]-* ; $(STAMP) stage[+lean+]-lean[+ ENDIF lean +]
+ @if test -f stage[+id+]-lean [+
+ IF prev +]|| test -f stage[+prev+]-lean [+ ENDIF prev +] ; then \
+ echo Skipping rebuild of stage[+id+] ; \
+ else \
+ $(MAKE) $(RECURSE_FLAGS_TO_PASS) NOTPARALLEL= all-stage[+id+]; \
+ fi
+
+.PHONY: all-stage[+id+] clean-stage[+id+]
+all-stage[+id+]: [+ FOR host_modules +][+ IF bootstrap +]\
+ maybe-all-stage[+id+]-[+module+][+
+ENDIF bootstrap+] [+ ENDFOR host_modules +]
+
+do-clean: clean-stage[+id+]
+clean-stage[+id+]: [+ FOR host_modules +][+ IF bootstrap +]\
+ maybe-clean-stage[+id+]-[+module+][+
+ENDIF bootstrap+] [+ ENDFOR host_modules +]
+
+[+ FOR host_modules +][+ IF bootstrap +]
+.PHONY: configure-stage[+id+]-[+module+] maybe-configure-stage[+id+]-[+module+]
+.PHONY: all-stage[+id+]-[+module+] maybe-all-stage[+id+]-[+module+]
+.PHONY: clean-stage[+id+]-[+module+] maybe-clean-stage[+id+]-[+module+]
+
+maybe-configure-stage[+id+]-[+module+]:
+maybe-all-stage[+id+]-[+module+]:
+maybe-clean-stage[+id+]-[+module+]:
+
+@if [+module+]-bootstrap
+maybe-configure-stage[+id+]-[+module+]: configure-stage[+id+]-[+module+]
+configure-stage[+id+]-[+module+]:
+ @$(MAKE) stage[+id+]-start
+ @[ -f [+module+]/Makefile ] && exit 0 || : ; \
+ r=`${PWD_COMMAND}`; export r; \
+ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; [+ IF prev +] \
+ $(STAGE_HOST_EXPORTS) [+ ELSE prev +] \
+ $(HOST_EXPORTS) [+ ENDIF prev +] \
+ echo Configuring stage [+id+] in [+module+] ; \
+ cd $(HOST_SUBDIR)/[+module+] || exit 1; \
+ case $(srcdir) in \
+ /* | [A-Za-z]:[\\/]*) topdir=$(srcdir) ;; \
+ *) topdir=`echo $(HOST_SUBDIR)/[+module+]/ | \
+ sed -e 's,\./,,g' -e 's,[^/]*/,../,g' `$(srcdir) ;; \
+ esac; \
+ srcdiroption="--srcdir=$${topdir}/[+module+]"; \
+ libsrcdir="$$s/[+module+]"; \
+ $(SHELL) $${libsrcdir}/configure \
+ $(HOST_CONFIGARGS) $${srcdiroption} \
+ [+stage_configure_flags+] [+extra_configure_flags+]
+
+maybe-all-stage[+id+]-[+module+]: all-stage[+id+]-[+module+]
+all-stage[+id+]-[+module+]: configure-stage[+id+]-[+module+]
+ @$(MAKE) stage[+id+]-start
+ @r=`${PWD_COMMAND}`; export r; \
+ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; [+ IF prev +] \
+ $(STAGE_HOST_EXPORTS) [+ ELSE prev +] \
+ $(HOST_EXPORTS) [+ ENDIF prev +] \
+ cd $(HOST_SUBDIR)/[+module+] && \
+ $(MAKE) $(FLAGS_TO_PASS) [+ IF prev +] \
+ $(POSTSTAGE1_FLAGS_TO_PASS) [+ ENDIF prev +] \
+ [+stage_make_flags+] [+extra_make_flags+]
+
+maybe-clean-stage[+id+]-[+module+]: clean-stage[+id+]-[+module+]
+clean-stage[+id+]-[+module+]:
+ @[ -f [+module+]/Makefile ] || [ -f stage[+id+]-[+module+]/Makefile ] \
+ || exit 0 ; \
+ [ -f [+module+]/Makefile ] || $(MAKE) stage[+id+]-start ; \
+ cd $(HOST_SUBDIR)/[+module+] && \
+ $(MAKE) $(FLAGS_TO_PASS) [+ IF prev +] \
+ $(POSTSTAGE1_FLAGS_TO_PASS) [+ ENDIF prev +] \
+ [+stage_make_flags+] [+extra_make_flags+] clean
+@endif [+module+]-bootstrap
+
+[+ ENDIF bootstrap +][+ ENDFOR host_modules +]
+
+# FIXME: Will not need to be conditional when toplevel bootstrap is the
+# only possibility, but now it conflicts with no-bootstrap rules
+@if gcc-bootstrap
+[+ IF compare-target +]
+[+compare-target+]:
+ @if test -f stage[+prev+]-lean; then \
+ echo Cannot compare object files as stage [+prev+] was deleted. ; \
+ exit 0 ; \
+ fi; \
+ [ -f stage_current ] && $(MAKE) `cat stage_current`-end || : ; \
+ @r=`${PWD_COMMAND}`; export r; \
+ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \
+ rm -f .bad_compare ; \
+ cd stage[+id+]-gcc; \
+ files=`find . -name "*$(objext)" -print` ; \
+ cd .. ; \
+ for file in $${files} ; do \
+ f1=$$r/stage[+prev+]-gcc/$$file; f2=$$r/stage[+id+]-gcc/$$file; \
+ @do_compare@ > /dev/null 2>&1; \
+ test $$? -eq 1 && echo $$file differs >> .bad_compare || true; \
+ done ; \
+ if [ -f .bad_compare ]; then \
+ echo "Bootstrap comparison failure!"; \
+ cat .bad_compare; \
+ exit 1; \
+ else \
+ true; \
+ fi ; \
+ $(STAMP) [+compare-target+][+ IF prev +]
+ @bootstrap_lean@-rm -rf stage[+prev+]-* ; $(STAMP) stage[+prev+]-lean[+ ENDIF prev +]
+[+ ENDIF compare-target +]
+
+[+ IF bootstrap-target +]
+.PHONY: [+bootstrap-target+]
+[+bootstrap-target+]: stage[+id+]-bubble [+compare-target+] all
+[+ ENDIF bootstrap-target +]
+
+# Rules to wipe a stage and all the following ones, also used for cleanstrap
+[+ IF prev +]distclean-stage[+prev+]:: distclean-stage[+id+] [+ ENDIF prev +]
+.PHONY: distclean-stage[+id+]
+distclean-stage[+id+]::
+ [ -f stage_current ] && $(MAKE) `cat stage_current`-end || :
+ rm -rf stage[+id+]-* [+
+ IF compare-target +][+compare-target+] [+ ENDIF compare-target +]
+
+[+ IF cleanstrap-target +]
+.PHONY: [+cleanstrap-target+]
+[+cleanstrap-target+]: distclean [+bootstrap-target+]
+[+ ENDIF cleanstrap-target +]
+@endif gcc-bootstrap
+
+[+ ENDFOR bootstrap-stage +]
+
+stagefeedback-start::
+ @r=`${PWD_COMMAND}`; export r; \
+ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \
+ cd stageprofile-gcc && \
+ { find . -type d | sort | sed 's,.*,$(SHELL) '"$$s"'/mkinstalldirs "../gcc/&",' | $(SHELL); } && \
+ { find . -name '*.*da' | sed 's,.*,$(LN) -f "&" "../gcc/&",' | $(SHELL); }
+
+# FIXME: Will not need to be conditional when toplevel bootstrap is the
+# only possibility, but now it conflicts with no-bootstrap rules
+@if gcc-bootstrap
+profiledbootstrap:
+ @r=`${PWD_COMMAND}`; export r; \
+ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \
+ $(SET_LIB_PATH) \
+ $(HOST_EXPORTS) \
+ echo "Bootstrapping the compiler"; \
+ $(MAKE) stageprofile-bubble distclean-stagefeedback
+ @r=`${PWD_COMMAND}`; export r; \
+ s=`cd $(srcdir); ${PWD_COMMAND}` ; export s; \
+ $(SET_LIB_PATH) \
+ echo "Building runtime libraries and training compiler"; \
+ $(MAKE) $(BASE_FLAGS_TO_PASS) $(RECURSE_FLAGS) all
+ @r=`${PWD_COMMAND}`; export r; \
+ s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \
+ $(SET_LIB_PATH) \
+ $(HOST_EXPORTS) \
+ echo "Building feedback based compiler"; \
+ $(MAKE) stagefeedback-bubble stagefeedback-end
+@endif gcc-bootstrap
+
+@if gcc-bootstrap
+NOTPARALLEL = .NOTPARALLEL
+$(NOTPARALLEL):
+do-distclean: distclean-stage1
+@endif gcc-bootstrap