From: Eric Blake Date: Mon, 1 Oct 2012 15:10:20 +0000 (-0600) Subject: build: avoid infinite autogen loop X-Git-Tag: v0.9.11.10~7 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=f4d50d0596e253facf9f24b1d7becac1cfdf6467;p=thirdparty%2Flibvirt.git build: avoid infinite autogen loop Several people have reported that if the .gnulib submodule is dirty, then 'make' will go into an infinite loop attempting to rerun bootstrap, because that never cleans up the dirty submodule. By default, we should halt and make the user investigate, but if the user doesn't know why or care that the submodule is dirty, I also added the ability to 'make CLEAN_SUBMODULE=1' to get things going again. Also, while testing this, I noticed that when a submodule update was needed, 'make' would first run autoreconf, then bootstrap (which reruns autoreconf); adding a strategic dependency allows for less work. * .gnulib: Update to latest, for maint.mk improvements. * cfg.mk (_autogen): Also hook maint.mk, to run before autoreconf. * autogen.sh (bootstrap): Refuse to run if gnulib is dirty, unless user requests discarding gnulib changes. (cherry picked from commit c5f162200c32a078fd68507f26a15f84f7d65e9e) Conflicts: .gnulib --- diff --git a/autogen.sh b/autogen.sh index 53db06f7e3..0232ca8ebe 100755 --- a/autogen.sh +++ b/autogen.sh @@ -59,11 +59,22 @@ bootstrap_hash() if test -d .git; then curr_status=.git-module-status t=$(bootstrap_hash; git diff .gnulib) + case $t:${CLEAN_SUBMODULE+set} in + *:set) ;; + *-dirty*) + echo "error: gnulib submodule is dirty, please investigate" 2>&1 + echo "set env-var CLEAN_SUBMODULE to discard gnulib changes" 2>&1 + exit 1 ;; + esac if test "$t" = "$(cat $curr_status 2>/dev/null)" \ && test -f "po/Makevars"; then # good, it's up to date, all we need is autoreconf autoreconf -if else + if test ${CLEAN_SUBMODULE+set}; then + echo cleaning up submodules... + git submodule foreach 'git clean -dfqx && git reset --hard' + fi echo running bootstrap$no_git... ./bootstrap$no_git --bootstrap-sync && bootstrap_hash > $curr_status \ || { echo "Failed to bootstrap, please investigate."; exit 1; } diff --git a/cfg.mk b/cfg.mk index 5d2f7748ea..3958145404 100644 --- a/cfg.mk +++ b/cfg.mk @@ -709,10 +709,17 @@ ifeq (0,$(MAKELEVEL)) _clean_requested = $(filter %clean,$(MAKECMDGOALS)) ifeq (1,$(_update_required)$(_clean_requested)) $(info INFO: gnulib update required; running ./autogen.sh first) -Makefile: _autogen +maint.mk Makefile: _autogen endif endif +# It is necessary to call autogen any time gnulib changes. Autogen +# reruns configure, then we regenerate all Makefiles at once. +.PHONY: _autogen +_autogen: + $(srcdir)/autogen.sh + ./config.status + # Give credit where due: # Ensure that each commit author email address (possibly mapped via # git log's .mailmap) appears in our AUTHORS file. @@ -727,13 +734,6 @@ sc_check_author_list: && echo '$(ME): committer(s) not listed in AUTHORS' >&2; \ test $$fail = 0 -# It is necessary to call autogen any time gnulib changes. Autogen -# reruns configure, then we regenerate all Makefiles at once. -.PHONY: _autogen -_autogen: - $(srcdir)/autogen.sh - ./config.status - # regenerate HACKING as part of the syntax-check syntax-check: $(top_srcdir)/HACKING