# Maintainer makefile for Automake. Requires GNU make.
-# Copyright (C) 2012 Free Software Foundation, Inc.
+# Copyright (C) 2012-2013 Free Software Foundation, Inc.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
-# If the user runs GNU make but has not yet run ./configure,
-# give them an helpful diagnostic instead of a cryptic error.
-am--Makefile := $(wildcard Makefile)
-ifeq ($(am--Makefile),)
+ifeq ($(filter bootstrap,$(MAKECMDGOALS)),)
+
+ifeq ($(wildcard Makefile),)
+ # Any target but 'bootstrap' specified in an unconfigured tree
+ # is an error, even when the user is running GNU make.
$(warning There seems to be no Makefile in this directory.)
$(warning You must run ./configure before running 'make'.)
$(error Fatal Error)
-else
- include ./Makefile
- include $(srcdir)/syntax-checks.mk
endif
+include ./Makefile
+include $(srcdir)/maint.mk
+include $(srcdir)/syntax-checks.mk
+
+else # ! bootstrap in $(MAKECMDGOALS)
+
+other-targets := $(filter-out bootstrap,$(MAKECMDGOALS))
+config-status := $(wildcard ./config.status)
+
+BOOTSTRAP_SHELL ?= /bin/sh
+export BOOTSTRAP_SHELL
+
+# Allow the user (or more likely the developer) to ask for a bootstrap
+# of the package.
+#
+# Two issues that must be kept in mind in the implementation below:
+#
+# [1] "make bootstrap" can be invoked before 'configure' is run (and in
+# fact, even before it is created, if we are bootstrapping from a
+# freshly-cloned checkout).
+#
+# [2] When re-bootstrapping an already configured tree, we must ensure
+# that the automatic remake rules for Makefile and company do not
+# kick in, because the tree might be in an inconsistent state (e.g.,
+# we have just switched from 'maint' to 'master', and have the built
+# 'automake' script left from 'maint', but the files 'lib/am/*.am'
+# are from 'master': if 'automake' gets run and used those files --
+# boom!).
+
+ifdef config-status # Bootstrap from an already-configured tree.
+ # We need the definition of $(srcdir) in the 'bootstrap' rule
+ # below.
+ srcdir := $(shell echo @srcdir@ | $(config-status) --file=-)
+ ifndef srcdir
+ $(error Could not obtain $$(srcdir) from $(config-status))
+ endif
+ # Also, if we are re-bootstrapping an already-configured tree, we
+ # want to re-configure it with the same pre-existing configuration.
+ old-configure-flags := $(shell $(config-status) --config)
+else # Assume we are bootstrapping from an unconfigured srcdir.
+ srcdir := .
+ old-configure-flags :=
+endif
+
+configure-flags := $(old-configure-flags) $(BOOTSTRAP_CONFIGURE_FLAGS)
+
+.PHONY: bootstrap
+bootstrap:
+ cd $(srcdir) && $(SHELL) ./bootstrap.sh
+ $(srcdir)/configure $(configure-flags)
+ $(MAKE) clean
+ $(MAKE) check TESTS=t/get-sysconf
+
+# Ensure that all the specified targets but 'bootstrap' (if any) are
+# run with a properly re-bootstrapped tree.
+ifdef other-targets
+$(other-targets): restart
+.PHONY: $(other-targets) restart
+restart: bootstrap; $(MAKE) $(AM_MAKEFLAGS) $(other-targets)
+endif
+
+endif # ! bootstrap in $(MAKECMDGOALS)