#! /bin/sh
# Bootstrap this package from checked-out sources.

# Copyright (C) 2003-2022 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 3 of the License, 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/>.

# Originally written by Paul Eggert.  The canonical version of this
# script is maintained as top/bootstrap in gnulib. However, to be
# useful to your package, you should place a copy of it under version
# control in the top-level directory of your package.  The intent is
# that all customization can be done with a bootstrap.conf file also
# maintained in your version control; gnulib comes with a template
# build-aux/bootstrap.conf to get you started.

# Please report bugs or propose patches to bug-gnulib@gnu.org.

scriptversion=2022-07-29.23; # UTC

me="$0"
medir=`dirname "$me"`

# Read the function library and the configuration.
. "$medir"/bootstrap-funclib.sh

usage() {
  cat <<EOF
Usage: $me [OPTION]...
Bootstrap this package from the checked-out sources.

Optional environment variables:
  GNULIB_SRCDIR            Specifies the local directory where gnulib
                           sources reside.  Use this if you already
                           have gnulib sources on your machine, and
                           do not want to waste your bandwidth downloading
                           them again.
  GNULIB_URL               Cloneable URL of the gnulib repository.

Options:
  --gnulib-srcdir=DIRNAME  specify the local directory where gnulib
                           sources reside.  Use this if you already
                           have gnulib sources on your machine, and
                           you want to use these sources.  Defaults
                           to \$GNULIB_SRCDIR
  --gnulib-refdir=DIRNAME  specify the local directory where a gnulib
                           repository (with a .git subdirectory) resides.
                           Use this if you already have gnulib sources
                           and history on your machine, and do not want
                           to waste your bandwidth downloading them again.
                           Defaults to \$GNULIB_REFDIR
  --bootstrap-sync         if this bootstrap script is not identical to
                           the version in the local gnulib sources,
                           update this script, and then restart it with
                           /bin/sh or the shell \$CONFIG_SHELL
  --no-bootstrap-sync      do not check whether bootstrap is out of sync
  --copy                   copy files instead of creating symbolic links
  --force                  attempt to bootstrap even if the sources seem
                           not to have been checked out
  --no-git                 do not use git to update gnulib.  Requires that
                           \$GNULIB_SRCDIR or the --gnulib-srcdir option
                           points to a gnulib repository with the correct
                           revision
  --skip-po                do not download po files
EOF
  bootstrap_print_option_usage_hook
  cat <<EOF
If the file bootstrap.conf exists in the same directory as this script, its
contents are read as shell variables to configure the bootstrap.

For build prerequisites, environment variables like \$AUTOCONF and \$AMTAR
are honored.

Gnulib sources can be fetched in various ways:

 * If the environment variable GNULIB_SRCDIR is set (either as an
   environment variable or via the --gnulib-srcdir option), then sources
   are fetched from that local directory.  If it is a git repository and
   the configuration variable GNULIB_REVISION is set in bootstrap.conf,
   then that revision is checked out.

 * Otherwise, if this package is in a git repository with a 'gnulib'
   submodule configured, then that submodule is initialized and updated
   and sources are fetched from there.  If GNULIB_REFDIR is set (either
   as an environment variable or via the --gnulib-refdir option) and is
   a git repository, then it is used as a reference.

 * Otherwise, if the 'gnulib' directory does not exist, Gnulib sources
   are cloned into that directory using git from \$GNULIB_URL, defaulting
   to $default_gnulib_url.
   If the configuration variable GNULIB_REVISION is set in bootstrap.conf,
   then that revision is checked out.

 * Otherwise, the existing Gnulib sources in the 'gnulib' directory are
   used.  If it is a git repository and the configuration variable
   GNULIB_REVISION is set in bootstrap.conf, then that revision is
   checked out.

If you maintain a package and want to pin a particular revision of the
Gnulib sources that has been tested with your package, then there are
two possible approaches: either configure a 'gnulib' submodule with the
appropriate revision, or set GNULIB_REVISION (and if necessary
GNULIB_URL) in bootstrap.conf.

Running without arguments will suffice in most cases.
EOF
}

# Parse options.

# Whether to use copies instead of symlinks.
copy=false

# Use git to update gnulib sources
use_git=true

for option
do
  case $option in
  --help)
    usage
    exit;;
  --version)
    set -e
    echo "bootstrap $scriptversion"
    echo "$copyright"
    exit 0
    ;;
  --gnulib-srcdir=*)
    GNULIB_SRCDIR=${option#--gnulib-srcdir=};;
  --gnulib-refdir=*)
    GNULIB_REFDIR=${option#--gnulib-refdir=};;
  --skip-po)
    SKIP_PO=t;;
  --force)
    checkout_only_file=;;
  --copy)
    copy=true;;
  --bootstrap-sync)
    bootstrap_sync=true;;
  --no-bootstrap-sync)
    bootstrap_sync=false;;
  --no-git)
    use_git=false;;
  *)
    bootstrap_option_hook $option || die "$option: unknown option";;
  esac
done

$use_git || test -n "$GNULIB_SRCDIR" \
  || die "Error: --no-git requires \$GNULIB_SRCDIR environment variable or --gnulib-srcdir option"
test -z "$GNULIB_SRCDIR" || test -d "$GNULIB_SRCDIR" \
  || die "Error: \$GNULIB_SRCDIR environment variable or --gnulib-srcdir option is specified, but does not denote a directory"

if test -n "$checkout_only_file" && test ! -r "$checkout_only_file"; then
  die "Bootstrapping from a non-checked-out distribution is risky."
fi

check_build_prerequisites $use_git

if ! test -f "$medir"/bootstrap-funclib.sh; then
  # We have only completed the first phase of an upgrade from a bootstrap
  # version < 2022-07-24. Need to do the second phase now.
  bootstrap_sync=true
fi

if $bootstrap_sync; then
  prepare_GNULIB_SRCDIR
  upgrade_bootstrap
  # Since we have now upgraded if needed, no need to try it a second time below.
  bootstrap_sync=false
fi

echo "$0: Bootstrapping from checked-out $package sources..."

# Pass GNULIB_SRCDIR to autopull.sh and autogen.sh.
export GNULIB_SRCDIR

# Pass GNULIB_REFDIR to autopull.sh.
export GNULIB_REFDIR

if $use_git || test -z "$SKIP_PO"; then
  "$medir"/autopull.sh \
      `if $bootstrap_sync; then echo ' --bootstrap-sync'; else echo ' --no-bootstrap-sync'; fi` \
      `if test -z "$checkout_only_file"; then echo ' --force'; fi` \
      `if ! $use_git; then echo ' --no-git'; fi` \
      `if test -n "$SKIP_PO"; then echo ' --skip-po'; fi` \
    || die "autopull.sh failed."
fi

"$medir"/autogen.sh \
    `if $copy; then echo ' --copy'; fi` \
    `if test -z "$checkout_only_file"; then echo ' --force'; fi` \
  || die "autogen.sh failed."

# ----------------------------------------------------------------------------

# Local Variables:
# eval: (add-hook 'before-save-hook 'time-stamp)
# time-stamp-start: "scriptversion="
# time-stamp-format: "%:y-%02m-%02d.%02H"
# time-stamp-time-zone: "UTC0"
# time-stamp-end: "; # UTC"
# End:
