Skip to content

Commit

Permalink
build: avoid infinite autogen loop
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
ebblake committed Oct 1, 2012
1 parent 9e9ea3e commit c5f1622
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 9 deletions.
2 changes: 1 addition & 1 deletion .gnulib
Submodule .gnulib updated from 440a1d to b49383
11 changes: 11 additions & 0 deletions autogen.sh
Original file line number Diff line number Diff line change
Expand Up @@ -63,11 +63,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; }
Expand Down
16 changes: 8 additions & 8 deletions cfg.mk
Original file line number Diff line number Diff line change
Expand Up @@ -700,10 +700,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.
Expand All @@ -718,13 +725,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

Expand Down

0 comments on commit c5f1622

Please sign in to comment.