# Maintainer makefile for Automake.  Requires GNU make.

# Copyright (C) 2012-2024 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
# the Free Software Foundation; either version 2, or (at your option)
# any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <https://www.gnu.org/licenses/>.

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)
endif
include ./Makefile
include $(srcdir)/maintainer/maint.mk
include $(srcdir)/maintainer/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 uses 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
	$(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)
