1#! /bin/sh
2# Print a version string.
3scriptversion=2021-04-11.09; # UTC
4
5# Bootstrap this package from checked-out sources.
6
7# Copyright (C) 2003-2021 Free Software Foundation, Inc.
8
9# This program is free software: you can redistribute it and/or modify
10# it under the terms of the GNU General Public License as published by
11# the Free Software Foundation, either version 3 of the License, or
12# (at your option) any later version.
13
14# This program is distributed in the hope that it will be useful,
15# but WITHOUT ANY WARRANTY; without even the implied warranty of
16# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17# GNU General Public License for more details.
18
19# You should have received a copy of the GNU General Public License
20# along with this program.  If not, see <https://www.gnu.org/licenses/>.
21
22# Originally written by Paul Eggert.  The canonical version of this
23# script is maintained as build-aux/bootstrap in gnulib, however, to
24# be useful to your project, you should place a copy of it under
25# version control in the top-level directory of your project.  The
26# intent is that all customization can be done with a bootstrap.conf
27# file also maintained in your version control; gnulib comes with a
28# template build-aux/bootstrap.conf to get you started.
29
30# Please report bugs or propose patches to bug-gnulib@gnu.org.
31
32nl='
33'
34
35# Ensure file names are sorted consistently across platforms.
36LC_ALL=C
37export LC_ALL
38
39# Ensure that CDPATH is not set.  Otherwise, the output from cd
40# would cause trouble in at least one use below.
41(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
42
43local_gl_dir=gl
44
45# Honor $PERL, but work even if there is none.
46PERL="${PERL-perl}"
47
48me=$0
49
50default_gnulib_url=https://git.savannah.gnu.org/git/gnulib.git
51
52usage() {
53  cat <<EOF
54Usage: $me [OPTION]...
55Bootstrap this package from the checked-out sources.
56
57Options:
58 --gnulib-srcdir=DIRNAME  specify the local directory where gnulib
59                          sources reside.  Use this if you already
60                          have gnulib sources on your machine, and
61                          do not want to waste your bandwidth downloading
62                          them again.  Defaults to \$GNULIB_SRCDIR
63 --bootstrap-sync         if this bootstrap script is not identical to
64                          the version in the local gnulib sources,
65                          update this script, and then restart it with
66                          /bin/sh or the shell \$CONFIG_SHELL
67 --no-bootstrap-sync      do not check whether bootstrap is out of sync
68 --copy                   copy files instead of creating symbolic links
69 --force                  attempt to bootstrap even if the sources seem
70                          not to have been checked out
71 --no-git                 do not use git to update gnulib.  Requires that
72                          --gnulib-srcdir point to a correct gnulib snapshot
73 --skip-po                do not download po files
74EOF
75  bootstrap_print_option_usage_hook
76  cat <<EOF
77If the file $me.conf exists in the same directory as this script, its
78contents are read as shell variables to configure the bootstrap.
79
80For build prerequisites, environment variables like \$AUTOCONF and \$AMTAR
81are honored.
82
83Gnulib sources can be fetched in various ways:
84
85 * If this package is in a git repository with a 'gnulib' submodule
86   configured, then that submodule is initialized and updated and sources
87   are fetched from there.  If \$GNULIB_SRCDIR is set (directly or via
88   --gnulib-srcdir) and is a git repository, then it is used as a reference.
89
90 * Otherwise, if \$GNULIB_SRCDIR is set (directly or via --gnulib-srcdir),
91   then sources are fetched from that local directory.  If it is a git
92   repository and \$GNULIB_REVISION is set, then that revision is checked
93   out.
94
95 * Otherwise, if this package is in a git repository with a 'gnulib'
96   submodule configured, then that submodule is initialized and updated and
97   sources are fetched from there.
98
99 * Otherwise, if the 'gnulib' directory does not exist, Gnulib sources are
100   cloned into that directory using git from \$GNULIB_URL, defaulting to
101   $default_gnulib_url.
102   If \$GNULIB_REVISION is set, then that revision is checked out.
103
104 * Otherwise, the existing Gnulib sources in the 'gnulib' directory are
105   used.  If it is a git repository and \$GNULIB_REVISION is set, then that
106   revision is checked out.
107
108If you maintain a package and want to pin a particular revision of the
109Gnulib sources that has been tested with your package, then there are two
110possible approaches: either configure a 'gnulib' submodule with the
111appropriate revision, or set \$GNULIB_REVISION (and if necessary
112\$GNULIB_URL) in $me.conf.
113
114Running without arguments will suffice in most cases.
115EOF
116}
117
118copyright_year=`echo "$scriptversion" | sed -e 's/[^0-9].*//'`
119copyright="Copyright (C) ${copyright_year} Free Software Foundation, Inc.
120License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>.
121This is free software: you are free to change and redistribute it.
122There is NO WARRANTY, to the extent permitted by law."
123
124# warnf_ FORMAT-STRING ARG1...
125warnf_ ()
126{
127  warnf_format_=$1
128  shift
129  nl='
130'
131  case $* in
132    *$nl*) me_=$(printf "$me"|tr "$nl|" '??')
133       printf "$warnf_format_" "$@" | sed "s|^|$me_: |" ;;
134    *) printf "$me: $warnf_format_" "$@" ;;
135  esac >&2
136}
137
138# warn_ WORD1...
139warn_ ()
140{
141  # If IFS does not start with ' ', set it and emit the warning in a subshell.
142  case $IFS in
143    ' '*) warnf_ '%s\n' "$*";;
144    *)    (IFS=' '; warn_ "$@");;
145  esac
146}
147
148# die WORD1...
149die() { warn_ "$@"; exit 1; }
150
151# Configuration.
152
153# Name of the Makefile.am
154gnulib_mk=gnulib.mk
155
156# List of gnulib modules needed.
157gnulib_modules=
158
159# Any gnulib files needed that are not in modules.
160gnulib_files=
161
162: ${AUTOPOINT=autopoint}
163: ${AUTORECONF=autoreconf}
164
165# A function to be called for each unrecognized option.  Returns 0 if
166# the option in $1 has been processed by the function.  Returns 1 if
167# the option has not been processed by the function.  Override it via
168# your own definition in bootstrap.conf
169
170bootstrap_option_hook() { return 1; }
171
172# A function to be called in order to print the --help information
173# corresponding to user-defined command-line options.
174
175bootstrap_print_option_usage_hook() { :; }
176
177# A function to be called right after gnulib-tool is run.
178# Override it via your own definition in bootstrap.conf.
179bootstrap_post_import_hook() { :; }
180
181# A function to be called after everything else in this script.
182# Override it via your own definition in bootstrap.conf.
183bootstrap_epilogue() { :; }
184
185# The command to download all .po files for a specified domain into a
186# specified directory.  Fill in the first %s with the destination
187# directory and the second with the domain name.
188po_download_command_format=\
189"wget --mirror --level=1 -nd -nv -A.po -P '%s' \
190 https://translationproject.org/latest/%s/"
191
192# Prefer a non-empty tarname (4th argument of AC_INIT if given), else
193# fall back to the package name (1st argument with munging).
194extract_package_name='
195  /^AC_INIT(\[*/{
196     s///
197     /^[^,]*,[^,]*,[^,]*,[ []*\([^][ ,)]\)/{
198       s//\1/
199       s/[],)].*//
200       p
201       q
202     }
203     s/[],)].*//
204     s/^GNU //
205     y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/
206     s/[^abcdefghijklmnopqrstuvwxyz0123456789_]/-/g
207     p
208  }
209'
210package=$(${AUTOCONF:-autoconf} --trace AC_INIT:\$4 configure.ac 2>/dev/null)
211if test -z "$package"; then
212  package=$(sed -n "$extract_package_name" configure.ac) \
213      || die 'cannot find package name in configure.ac'
214fi
215gnulib_name=lib$package
216
217build_aux=build-aux
218source_base=lib
219m4_base=m4
220doc_base=doc
221tests_base=tests
222gnulib_extra_files="
223        build-aux/install-sh
224        build-aux/mdate-sh
225        build-aux/texinfo.tex
226        build-aux/depcomp
227        build-aux/config.guess
228        build-aux/config.sub
229        doc/INSTALL
230"
231
232# Additional gnulib-tool options to use.  Use "\newline" to break lines.
233gnulib_tool_option_extras=
234
235# Other locale categories that need message catalogs.
236EXTRA_LOCALE_CATEGORIES=
237
238# Additional xgettext options to use.  Use "\\\newline" to break lines.
239XGETTEXT_OPTIONS='\\\
240 --flag=_:1:pass-c-format\\\
241 --flag=N_:1:pass-c-format\\\
242 --flag=error:3:c-format --flag=error_at_line:5:c-format\\\
243'
244
245# Package bug report address and copyright holder for gettext files
246COPYRIGHT_HOLDER='Free Software Foundation, Inc.'
247MSGID_BUGS_ADDRESS=bug-$package@gnu.org
248
249# Files we don't want to import.
250excluded_files=
251
252# File that should exist in the top directory of a checked out hierarchy,
253# but not in a distribution tarball.
254checkout_only_file=README-hacking
255
256# Whether to use copies instead of symlinks.
257copy=false
258
259# Set this to '.cvsignore .gitignore' in bootstrap.conf if you want
260# those files to be generated in directories like lib/, m4/, and po/.
261# Or set it to 'auto' to make this script select which to use based
262# on which version control system (if any) is used in the source directory.
263vc_ignore=auto
264
265# Set this to true in bootstrap.conf to enable --bootstrap-sync by
266# default.
267bootstrap_sync=false
268
269# Use git to update gnulib sources
270use_git=true
271
272check_exists() {
273  if test "$1" = "--verbose"; then
274    ($2 --version </dev/null) >/dev/null 2>&1
275    if test $? -ge 126; then
276      # If not found, run with diagnostics as one may be
277      # presented with env variables to set to find the right version
278      ($2 --version </dev/null)
279    fi
280  else
281    ($1 --version </dev/null) >/dev/null 2>&1
282  fi
283
284  test $? -lt 126
285}
286
287# find_tool ENVVAR NAMES...
288# -------------------------
289# Search for a required program.  Use the value of ENVVAR, if set,
290# otherwise find the first of the NAMES that can be run.
291# If found, set ENVVAR to the program name, die otherwise.
292#
293# FIXME: code duplication, see also gnu-web-doc-update.
294find_tool ()
295{
296  find_tool_envvar=$1
297  shift
298  find_tool_names=$@
299  eval "find_tool_res=\$$find_tool_envvar"
300  if test x"$find_tool_res" = x; then
301    for i; do
302      if check_exists $i; then
303        find_tool_res=$i
304        break
305      fi
306    done
307  fi
308  if test x"$find_tool_res" = x; then
309    warn_ "one of these is required: $find_tool_names;"
310    die   "alternatively set $find_tool_envvar to a compatible tool"
311  fi
312  eval "$find_tool_envvar=\$find_tool_res"
313  eval "export $find_tool_envvar"
314}
315
316# Override the default configuration, if necessary.
317# Make sure that bootstrap.conf is sourced from the current directory
318# if we were invoked as "sh bootstrap".
319case "$0" in
320  */*) test -r "$0.conf" && . "$0.conf" ;;
321  *) test -r "$0.conf" && . ./"$0.conf" ;;
322esac
323
324if test "$vc_ignore" = auto; then
325  vc_ignore=
326  test -d .git && vc_ignore=.gitignore
327  test -d CVS && vc_ignore="$vc_ignore .cvsignore"
328fi
329
330if test x"$gnulib_modules$gnulib_files$gnulib_extra_files" = x; then
331  use_gnulib=false
332else
333  use_gnulib=true
334fi
335
336# Translate configuration into internal form.
337
338# Parse options.
339
340for option
341do
342  case $option in
343  --help)
344    usage
345    exit;;
346  --version)
347    set -e
348    echo "bootstrap $scriptversion"
349    echo "$copyright"
350    exit 0
351    ;;
352  --gnulib-srcdir=*)
353    GNULIB_SRCDIR=${option#--gnulib-srcdir=};;
354  --skip-po)
355    SKIP_PO=t;;
356  --force)
357    checkout_only_file=;;
358  --copy)
359    copy=true;;
360  --bootstrap-sync)
361    bootstrap_sync=true;;
362  --no-bootstrap-sync)
363    bootstrap_sync=false;;
364  --no-git)
365    use_git=false;;
366  *)
367    bootstrap_option_hook $option || die "$option: unknown option";;
368  esac
369done
370
371$use_git || test -d "$GNULIB_SRCDIR" \
372  || die "Error: --no-git requires --gnulib-srcdir"
373
374if test -n "$checkout_only_file" && test ! -r "$checkout_only_file"; then
375  die "Bootstrapping from a non-checked-out distribution is risky."
376fi
377
378# Strip blank and comment lines to leave significant entries.
379gitignore_entries() {
380  sed '/^#/d; /^$/d' "$@"
381}
382
383# If $STR is not already on a line by itself in $FILE, insert it at the start.
384# Entries are inserted at the start of the ignore list to ensure existing
385# entries starting with ! are not overridden.  Such entries support
386# whitelisting exceptions after a more generic blacklist pattern.
387insert_if_absent() {
388  file=$1
389  str=$2
390  test -f $file || touch $file
391  test -r $file || die "Error: failed to read ignore file: $file"
392  duplicate_entries=$(gitignore_entries $file | sort | uniq -d)
393  if [ "$duplicate_entries" ] ; then
394    die "Error: Duplicate entries in $file: " $duplicate_entries
395  fi
396  linesold=$(gitignore_entries $file | wc -l)
397  linesnew=$( { echo "$str"; cat $file; } | gitignore_entries | sort -u | wc -l)
398  if [ $linesold != $linesnew ] ; then
399    { echo "$str" | cat - $file > $file.bak && mv $file.bak $file; } \
400      || die "insert_if_absent $file $str: failed"
401  fi
402}
403
404# Adjust $PATTERN for $VC_IGNORE_FILE and insert it with
405# insert_if_absent.
406insert_vc_ignore() {
407  vc_ignore_file="$1"
408  pattern="$2"
409  case $vc_ignore_file in
410  *.gitignore)
411    # A .gitignore entry that does not start with '/' applies
412    # recursively to subdirectories, so prepend '/' to every
413    # .gitignore entry.
414    pattern=$(echo "$pattern" | sed s,^,/,);;
415  esac
416  insert_if_absent "$vc_ignore_file" "$pattern"
417}
418
419# Die if there is no AC_CONFIG_AUX_DIR($build_aux) line in configure.ac.
420found_aux_dir=no
421grep '^[	 ]*AC_CONFIG_AUX_DIR(\['"$build_aux"'\])' configure.ac \
422    >/dev/null && found_aux_dir=yes
423grep '^[	 ]*AC_CONFIG_AUX_DIR('"$build_aux"')' configure.ac \
424    >/dev/null && found_aux_dir=yes
425test $found_aux_dir = yes \
426  || die "configure.ac lacks 'AC_CONFIG_AUX_DIR([$build_aux])'; add it"
427
428# If $build_aux doesn't exist, create it now, otherwise some bits
429# below will malfunction.  If creating it, also mark it as ignored.
430if test ! -d $build_aux; then
431  mkdir $build_aux
432  for dot_ig in x $vc_ignore; do
433    test $dot_ig = x && continue
434    insert_vc_ignore $dot_ig $build_aux
435  done
436fi
437
438# Note this deviates from the version comparison in automake
439# in that it treats 1.5 < 1.5.0, and treats 1.4.4a < 1.4-p3a
440# but this should suffice as we won't be specifying old
441# version formats or redundant trailing .0 in bootstrap.conf.
442# If we did want full compatibility then we should probably
443# use m4_version_compare from autoconf.
444sort_ver() { # sort -V is not generally available
445  ver1="$1"
446  ver2="$2"
447
448  # split on '.' and compare each component
449  i=1
450  while : ; do
451    p1=$(echo "$ver1" | cut -d. -f$i)
452    p2=$(echo "$ver2" | cut -d. -f$i)
453    if [ ! "$p1" ]; then
454      echo "$1 $2"
455      break
456    elif [ ! "$p2" ]; then
457      echo "$2 $1"
458      break
459    elif [ ! "$p1" = "$p2" ]; then
460      if [ "$p1" -gt "$p2" ] 2>/dev/null; then # numeric comparison
461        echo "$2 $1"
462      elif [ "$p2" -gt "$p1" ] 2>/dev/null; then # numeric comparison
463        echo "$1 $2"
464      else # numeric, then lexicographic comparison
465        lp=$(printf "$p1\n$p2\n" | LANG=C sort -n | tail -n1)
466        if [ "$lp" = "$p2" ]; then
467          echo "$1 $2"
468        else
469          echo "$2 $1"
470        fi
471      fi
472      break
473    fi
474    i=$(($i+1))
475  done
476}
477
478get_version_sed='
479# Move version to start of line.
480s/.*[v ]\([0-9]\)/\1/
481
482# Skip lines that do not start with version.
483/^[0-9]/!d
484
485# Remove characters after the version.
486s/[^.a-z0-9-].*//
487
488# The first component must be digits only.
489s/^\([0-9]*\)[a-z-].*/\1/
490
491#the following essentially does s/5.005/5.5/
492s/\.0*\([1-9]\)/.\1/g
493p
494q'
495
496get_version() {
497  app=$1
498
499  $app --version >/dev/null 2>&1 || { $app --version; return 1; }
500
501  $app --version 2>&1 | sed -n "$get_version_sed"
502}
503
504check_versions() {
505  ret=0
506
507  while read app req_ver; do
508    # We only need libtoolize from the libtool package.
509    if test "$app" = libtool; then
510      app=libtoolize
511    fi
512    # Exempt git if --no-git is in effect.
513    if test "$app" = git; then
514      $use_git || continue
515    fi
516    # Honor $APP variables ($TAR, $AUTOCONF, etc.)
517    appvar=$(echo $app | LC_ALL=C tr '[a-z]-' '[A-Z]_')
518    test "$appvar" = TAR && appvar=AMTAR
519    case $appvar in
520        GZIP) ;; # Do not use $GZIP:  it contains gzip options.
521        PERL::*) ;; # Keep perl modules as-is
522        *) eval "app=\${$appvar-$app}" ;;
523    esac
524
525    # Handle the still-experimental Automake-NG programs specially.
526    # They remain named as the mainstream Automake programs ("automake",
527    # and "aclocal") to avoid gratuitous incompatibilities with
528    # pre-existing usages (by, say, autoreconf, or custom autogen.sh
529    # scripts), but correctly identify themselves (as being part of
530    # "GNU automake-ng") when asked their version.
531    case $app in
532      automake-ng|aclocal-ng)
533        app=${app%-ng}
534        ($app --version | grep '(GNU automake-ng)') >/dev/null 2>&1 || {
535          warn_ "Error: '$app' not found or not from Automake-NG"
536          ret=1
537          continue
538        } ;;
539      # Another check is for perl modules.  These can be written as
540      # e.g. perl::XML::XPath in case of XML::XPath module, etc.
541      perl::*)
542        # Extract module name
543        app="${app#perl::}"
544        if ! $PERL -m"$app" -e 'exit 0' >/dev/null 2>&1; then
545          warn_ "Error: perl module '$app' not found"
546          ret=1
547        fi
548        continue
549        ;;
550    esac
551    if [ "$req_ver" = "-" ]; then
552      # Merely require app to exist; not all prereq apps are well-behaved
553      # so we have to rely on $? rather than get_version.
554      if ! check_exists --verbose $app; then
555        warn_ "Error: '$app' not found"
556        ret=1
557      fi
558    else
559      # Require app to produce a new enough version string.
560      inst_ver=$(get_version $app)
561      if [ ! "$inst_ver" ]; then
562        warn_ "Error: '$app' not found"
563        ret=1
564      else
565        latest_ver=$(sort_ver $req_ver $inst_ver | cut -d' ' -f2)
566        if [ ! "$latest_ver" = "$inst_ver" ]; then
567          warnf_ '%s\n'                                        \
568              "Error: '$app' version == $inst_ver is too old"  \
569              "       '$app' version >= $req_ver is required"
570          ret=1
571        fi
572      fi
573    fi
574  done
575
576  return $ret
577}
578
579print_versions() {
580  echo "Program    Min_version"
581  echo "----------------------"
582  printf %s "$buildreq"
583  echo "----------------------"
584  # can't depend on column -t
585}
586
587# Find sha1sum, named gsha1sum on MacPorts, shasum on Mac OS X 10.6.
588# Also find the compatible sha1 utility on the BSDs
589if test x"$SKIP_PO" = x; then
590  find_tool SHA1SUM sha1sum gsha1sum shasum sha1
591fi
592
593use_libtool=0
594# We'd like to use grep -E, to see if any of LT_INIT,
595# AC_PROG_LIBTOOL, AM_PROG_LIBTOOL is used in configure.ac,
596# but that's not portable enough (e.g., for Solaris).
597grep '^[	 ]*A[CM]_PROG_LIBTOOL' configure.ac >/dev/null \
598  && use_libtool=1
599grep '^[	 ]*LT_INIT' configure.ac >/dev/null \
600  && use_libtool=1
601if test $use_libtool = 1; then
602  find_tool LIBTOOLIZE glibtoolize libtoolize
603fi
604
605# gnulib-tool requires at least automake and autoconf.
606# If either is not listed, add it (with minimum version) as a prerequisite.
607case $buildreq in
608  *automake*) ;;
609  *) buildreq="automake 1.9
610$buildreq" ;;
611esac
612case $buildreq in
613  *autoconf*) ;;
614  *) buildreq="autoconf 2.59
615$buildreq" ;;
616esac
617
618# When we can deduce that gnulib-tool will require patch,
619# and when patch is not already listed as a prerequisite, add it, too.
620if test -d "$local_gl_dir" \
621    && ! find "$local_gl_dir" -name '*.diff' -exec false {} +; then
622  case $buildreq in
623    *patch*) ;;
624    *) buildreq="patch -
625$buildreq" ;;
626  esac
627fi
628
629if ! printf "$buildreq" | check_versions; then
630  echo >&2
631  if test -f README-prereq; then
632    die "See README-prereq for how to get the prerequisite programs"
633  else
634    die "Please install the prerequisite programs"
635  fi
636fi
637
638# Warn the user if autom4te appears to be broken; this causes known
639# issues with at least gettext 0.18.3.
640probe=$(echo 'm4_quote([hi])' | autom4te -l M4sugar -t 'm4_quote:$%' -)
641if test "x$probe" != xhi; then
642  warn_ "WARNING: your autom4te wrapper eats stdin;"
643  warn_ "if bootstrap fails, consider upgrading your autotools"
644fi
645
646echo "$0: Bootstrapping from checked-out $package sources..."
647
648# See if we can use gnulib's git-merge-changelog merge driver.
649if $use_git && test -d .git && check_exists git; then
650  if git config merge.merge-changelog.driver >/dev/null ; then
651    :
652  elif check_exists git-merge-changelog; then
653    echo "$0: initializing git-merge-changelog driver"
654    git config merge.merge-changelog.name 'GNU-style ChangeLog merge driver'
655    git config merge.merge-changelog.driver 'git-merge-changelog %O %A %B'
656  else
657    echo "$0: consider installing git-merge-changelog from gnulib"
658  fi
659fi
660
661
662cleanup_gnulib() {
663  status=$?
664  rm -fr "$gnulib_path"
665  exit $status
666}
667
668git_modules_config () {
669  test -f .gitmodules && git config --file .gitmodules "$@"
670}
671
672if $use_gnulib; then
673  if $use_git; then
674    gnulib_path=$(git_modules_config submodule.gnulib.path)
675    test -z "$gnulib_path" && gnulib_path=gnulib
676  fi
677
678  # Get gnulib files.  Populate $GNULIB_SRCDIR, possibly updating a
679  # submodule, for use in the rest of the script.
680
681  case ${GNULIB_SRCDIR--} in
682  -)
683    # Note that $use_git is necessarily true in this case.
684    if git_modules_config submodule.gnulib.url >/dev/null; then
685      echo "$0: getting gnulib files..."
686      git submodule init -- "$gnulib_path" || exit $?
687      git submodule update -- "$gnulib_path" || exit $?
688
689    elif [ ! -d "$gnulib_path" ]; then
690      echo "$0: getting gnulib files..."
691
692      trap cleanup_gnulib 1 2 13 15
693
694      shallow=
695      if test -z "$GNULIB_REVISION"; then
696        git clone -h 2>&1 | grep -- --depth > /dev/null && shallow='--depth 2'
697      fi
698      git clone $shallow ${GNULIB_URL:-$default_gnulib_url} "$gnulib_path" \
699        || cleanup_gnulib
700
701      trap - 1 2 13 15
702    fi
703    GNULIB_SRCDIR=$gnulib_path
704    ;;
705  *)
706    # Use GNULIB_SRCDIR directly or as a reference.
707    if $use_git && test -d "$GNULIB_SRCDIR"/.git && \
708          git_modules_config submodule.gnulib.url >/dev/null; then
709      echo "$0: getting gnulib files..."
710      if git submodule -h|grep -- --reference > /dev/null; then
711        # Prefer the one-liner available in git 1.6.4 or newer.
712        git submodule update --init --reference "$GNULIB_SRCDIR" \
713          "$gnulib_path" || exit $?
714      else
715        # This fallback allows at least git 1.5.5.
716        if test -f "$gnulib_path"/gnulib-tool; then
717          # Since file already exists, assume submodule init already complete.
718          git submodule update -- "$gnulib_path" || exit $?
719        else
720          # Older git can't clone into an empty directory.
721          rmdir "$gnulib_path" 2>/dev/null
722          git clone --reference "$GNULIB_SRCDIR" \
723            "$(git_modules_config submodule.gnulib.url)" "$gnulib_path" \
724            && git submodule init -- "$gnulib_path" \
725            && git submodule update -- "$gnulib_path" \
726            || exit $?
727        fi
728      fi
729      GNULIB_SRCDIR=$gnulib_path
730    fi
731    ;;
732  esac
733
734  if test -d "$GNULIB_SRCDIR"/.git && test -n "$GNULIB_REVISION" \
735     && ! git_modules_config submodule.gnulib.url >/dev/null; then
736    (cd "$GNULIB_SRCDIR" && git checkout "$GNULIB_REVISION") || cleanup_gnulib
737  fi
738
739  # $GNULIB_SRCDIR now points to the version of gnulib to use, and
740  # we no longer need to use git or $gnulib_path below here.
741
742  if $bootstrap_sync; then
743    cmp -s "$0" "$GNULIB_SRCDIR/build-aux/bootstrap" || {
744      echo "$0: updating bootstrap and restarting..."
745      case $(sh -c 'echo "$1"' -- a) in
746        a) ignored=--;;
747        *) ignored=ignored;;
748      esac
749      exec sh -c \
750        'cp "$1" "$2" && shift && exec "${CONFIG_SHELL-/bin/sh}" "$@"' \
751        $ignored "$GNULIB_SRCDIR/build-aux/bootstrap" \
752        "$0" "$@" --no-bootstrap-sync
753    }
754  fi
755
756  gnulib_tool=$GNULIB_SRCDIR/gnulib-tool
757  <$gnulib_tool || exit $?
758fi
759
760# Get translations.
761
762download_po_files() {
763  subdir=$1
764  domain=$2
765  echo "$me: getting translations into $subdir for $domain..."
766  cmd=$(printf "$po_download_command_format" "$subdir" "$domain")
767  eval "$cmd"
768}
769
770# Mirror .po files to $po_dir/.reference and copy only the new
771# or modified ones into $po_dir.  Also update $po_dir/LINGUAS.
772# Note po files that exist locally only are left in $po_dir but will
773# not be included in LINGUAS and hence will not be distributed.
774update_po_files() {
775  # Directory containing primary .po files.
776  # Overwrite them only when we're sure a .po file is new.
777  po_dir=$1
778  domain=$2
779
780  # Mirror *.po files into this dir.
781  # Usually contains *.s1 checksum files.
782  ref_po_dir="$po_dir/.reference"
783
784  test -d $ref_po_dir || mkdir $ref_po_dir || return
785  download_po_files $ref_po_dir $domain \
786    && ls "$ref_po_dir"/*.po 2>/dev/null |
787      sed 's|.*/||; s|\.po$||' > "$po_dir/LINGUAS" || return
788
789  langs=$(cd $ref_po_dir && echo *.po | sed 's/\.po//g')
790  test "$langs" = '*' && langs=x
791  for po in $langs; do
792    case $po in x) continue;; esac
793    new_po="$ref_po_dir/$po.po"
794    cksum_file="$ref_po_dir/$po.s1"
795    if ! test -f "$cksum_file" ||
796        ! test -f "$po_dir/$po.po" ||
797        ! $SHA1SUM -c "$cksum_file" < "$new_po" > /dev/null 2>&1; then
798      echo "$me: updated $po_dir/$po.po..."
799      cp "$new_po" "$po_dir/$po.po" \
800          && $SHA1SUM < "$new_po" > "$cksum_file" || return
801    fi
802  done
803}
804
805case $SKIP_PO in
806'')
807  if test -d po; then
808    update_po_files po $package || exit
809  fi
810
811  if test -d runtime-po; then
812    update_po_files runtime-po $package-runtime || exit
813  fi;;
814esac
815
816symlink_to_dir()
817{
818  src=$1/$2
819  dst=${3-$2}
820
821  test -f "$src" && {
822
823    # If the destination directory doesn't exist, create it.
824    # This is required at least for "lib/uniwidth/cjk.h".
825    dst_dir=$(dirname "$dst")
826    if ! test -d "$dst_dir"; then
827      mkdir -p "$dst_dir"
828
829      # If we've just created a directory like lib/uniwidth,
830      # tell version control system(s) it's ignorable.
831      # FIXME: for now, this does only one level
832      parent=$(dirname "$dst_dir")
833      for dot_ig in x $vc_ignore; do
834        test $dot_ig = x && continue
835        ig=$parent/$dot_ig
836        insert_vc_ignore $ig "${dst_dir##*/}"
837      done
838    fi
839
840    if $copy; then
841      {
842        test ! -h "$dst" || {
843          echo "$me: rm -f $dst" &&
844          rm -f "$dst"
845        }
846      } &&
847      test -f "$dst" &&
848      cmp -s "$src" "$dst" || {
849        echo "$me: cp -fp $src $dst" &&
850        cp -fp "$src" "$dst"
851      }
852    else
853      # Leave any existing symlink alone, if it already points to the source,
854      # so that broken build tools that care about symlink times
855      # aren't confused into doing unnecessary builds.  Conversely, if the
856      # existing symlink's timestamp is older than the source, make it afresh,
857      # so that broken tools aren't confused into skipping needed builds.  See
858      # <https://lists.gnu.org/r/bug-gnulib/2011-05/msg00326.html>.
859      test -h "$dst" &&
860      src_ls=$(ls -diL "$src" 2>/dev/null) && set $src_ls && src_i=$1 &&
861      dst_ls=$(ls -diL "$dst" 2>/dev/null) && set $dst_ls && dst_i=$1 &&
862      test "$src_i" = "$dst_i" &&
863      both_ls=$(ls -dt "$src" "$dst") &&
864      test "X$both_ls" = "X$dst$nl$src" || {
865        dot_dots=
866        case $src in
867        /*) ;;
868        *)
869          case /$dst/ in
870          *//* | */../* | */./* | /*/*/*/*/*/)
871             die "invalid symlink calculation: $src -> $dst";;
872          /*/*/*/*/)    dot_dots=../../../;;
873          /*/*/*/)      dot_dots=../../;;
874          /*/*/)        dot_dots=../;;
875          esac;;
876        esac
877
878        echo "$me: ln -fs $dot_dots$src $dst" &&
879        ln -fs "$dot_dots$src" "$dst"
880      }
881    fi
882  }
883}
884
885version_controlled_file() {
886  parent=$1
887  file=$2
888  if test -d .git; then
889    git rm -n "$file" > /dev/null 2>&1
890  elif test -d .svn; then
891    svn log -r HEAD "$file" > /dev/null 2>&1
892  elif test -d CVS; then
893    grep -F "/${file##*/}/" "$parent/CVS/Entries" 2>/dev/null |
894             grep '^/[^/]*/[0-9]' > /dev/null
895  else
896    warn_ "no version control for $file?"
897    false
898  fi
899}
900
901# NOTE: we have to be careful to run both autopoint and libtoolize
902# before gnulib-tool, since gnulib-tool is likely to provide newer
903# versions of files "installed" by these two programs.
904# Then, *after* gnulib-tool (see below), we have to be careful to
905# run autoreconf in such a way that it does not run either of these
906# two just-pre-run programs.
907
908# Import from gettext.
909with_gettext=yes
910grep '^[	 ]*AM_GNU_GETTEXT_VERSION(' configure.ac >/dev/null || \
911    with_gettext=no
912
913if test $with_gettext = yes || test $use_libtool = 1; then
914
915  tempbase=.bootstrap$$
916  trap "rm -f $tempbase.0 $tempbase.1" 1 2 13 15
917
918  > $tempbase.0 > $tempbase.1 &&
919  find . ! -type d -print | sort > $tempbase.0 || exit
920
921  if test $with_gettext = yes; then
922    # Released autopoint has the tendency to install macros that have been
923    # obsoleted in current gnulib, so run this before gnulib-tool.
924    echo "$0: $AUTOPOINT --force"
925    $AUTOPOINT --force || exit
926  fi
927
928  # Autoreconf runs aclocal before libtoolize, which causes spurious
929  # warnings if the initial aclocal is confused by the libtoolized
930  # (or worse out-of-date) macro directory.
931  # libtoolize 1.9b added the --install option; but we support back
932  # to libtoolize 1.5.22, where the install action was default.
933  if test $use_libtool = 1; then
934    install=
935    case $($LIBTOOLIZE --help) in
936      *--install*) install=--install ;;
937    esac
938    echo "running: $LIBTOOLIZE $install --copy"
939    $LIBTOOLIZE $install --copy
940  fi
941
942  find . ! -type d -print | sort >$tempbase.1
943  old_IFS=$IFS
944  IFS=$nl
945  for file in $(comm -13 $tempbase.0 $tempbase.1); do
946    IFS=$old_IFS
947    parent=${file%/*}
948    version_controlled_file "$parent" "$file" || {
949      for dot_ig in x $vc_ignore; do
950        test $dot_ig = x && continue
951        ig=$parent/$dot_ig
952        insert_vc_ignore "$ig" "${file##*/}"
953      done
954    }
955  done
956  IFS=$old_IFS
957
958  rm -f $tempbase.0 $tempbase.1
959  trap - 1 2 13 15
960fi
961
962# Import from gnulib.
963
964if $use_gnulib; then
965  gnulib_tool_options="\
966   --no-changelog\
967   --aux-dir=$build_aux\
968   --doc-base=$doc_base\
969   --lib=$gnulib_name\
970   --m4-base=$m4_base/\
971   --source-base=$source_base/\
972   --tests-base=$tests_base\
973   --local-dir=$local_gl_dir\
974   $gnulib_tool_option_extras\
975  "
976  if test $use_libtool = 1; then
977    case "$gnulib_tool_options " in
978      *' --libtool '*) ;;
979      *) gnulib_tool_options="$gnulib_tool_options --libtool" ;;
980    esac
981  fi
982  echo "$0: $gnulib_tool $gnulib_tool_options --import ..."
983  $gnulib_tool $gnulib_tool_options --import $gnulib_modules \
984    || die "gnulib-tool failed"
985
986  for file in $gnulib_files; do
987    symlink_to_dir "$GNULIB_SRCDIR" $file \
988      || die "failed to symlink $file"
989  done
990fi
991
992bootstrap_post_import_hook \
993  || die "bootstrap_post_import_hook failed"
994
995# Don't proceed if there are uninitialized submodules.  In particular,
996# the next step will remove dangling links, which might be links into
997# uninitialized submodules.
998#
999# Uninitialized submodules are listed with an initial dash.
1000if $use_git && git submodule | grep '^-' >/dev/null; then
1001  die "some git submodules are not initialized. "     \
1002      "Run 'git submodule update --init' and bootstrap again."
1003fi
1004
1005# Remove any dangling symlink matching "*.m4" or "*.[ch]" in some
1006# gnulib-populated directories.  Such .m4 files would cause aclocal to fail.
1007# The following requires GNU find 4.2.3 or newer.  Considering the usual
1008# portability constraints of this script, that may seem a very demanding
1009# requirement, but it should be ok.  Ignore any failure, which is fine,
1010# since this is only a convenience to help developers avoid the relatively
1011# unusual case in which a symlinked-to .m4 file is git-removed from gnulib
1012# between successive runs of this script.
1013find "$m4_base" "$source_base" \
1014  -depth \( -name '*.m4' -o -name '*.[ch]' \) \
1015  -type l -xtype l -delete > /dev/null 2>&1
1016
1017# Invoke autoreconf with --force --install to ensure upgrades of tools
1018# such as ylwrap.
1019AUTORECONFFLAGS="--verbose --install --force -I $m4_base $ACLOCAL_FLAGS"
1020
1021# Some systems (RHEL 5) are using ancient autotools, for which the
1022# --no-recursive option had not been invented.  Detect that lack and
1023# omit the option when it's not supported.  FIXME in 2017: remove this
1024# hack when RHEL 5 autotools are updated, or when they become irrelevant.
1025case $($AUTORECONF --help) in
1026  *--no-recursive*) AUTORECONFFLAGS="$AUTORECONFFLAGS --no-recursive";;
1027esac
1028
1029# Tell autoreconf not to invoke autopoint or libtoolize; they were run above.
1030echo "running: AUTOPOINT=true LIBTOOLIZE=true $AUTORECONF $AUTORECONFFLAGS"
1031AUTOPOINT=true LIBTOOLIZE=true $AUTORECONF $AUTORECONFFLAGS \
1032  || die "autoreconf failed"
1033
1034# Get some extra files from gnulib, overriding existing files.
1035for file in $gnulib_extra_files; do
1036  case $file in
1037  */INSTALL) dst=INSTALL;;
1038  build-aux/*) dst=$build_aux/${file#build-aux/};;
1039  *) dst=$file;;
1040  esac
1041  symlink_to_dir "$GNULIB_SRCDIR" $file $dst \
1042    || die "failed to symlink $file"
1043done
1044
1045if test $with_gettext = yes; then
1046  # Create gettext configuration.
1047  echo "$0: Creating po/Makevars from po/Makevars.template ..."
1048  rm -f po/Makevars
1049  sed '
1050    /^EXTRA_LOCALE_CATEGORIES *=/s/=.*/= '"$EXTRA_LOCALE_CATEGORIES"'/
1051    /^COPYRIGHT_HOLDER *=/s/=.*/= '"$COPYRIGHT_HOLDER"'/
1052    /^MSGID_BUGS_ADDRESS *=/s|=.*|= '"$MSGID_BUGS_ADDRESS"'|
1053    /^XGETTEXT_OPTIONS *=/{
1054      s/$/ \\/
1055      a\
1056          '"$XGETTEXT_OPTIONS"' $${end_of_xgettext_options+}
1057    }
1058  ' po/Makevars.template >po/Makevars \
1059    || die 'cannot generate po/Makevars'
1060
1061  # If the 'gettext' module is in use, grab the latest Makefile.in.in.
1062  # If only the 'gettext-h' module is in use, assume autopoint already
1063  # put the correct version of this file into place.
1064  case $gnulib_modules in
1065  *gettext-h*) ;;
1066  *gettext*)
1067    cp $GNULIB_SRCDIR/build-aux/po/Makefile.in.in po/Makefile.in.in \
1068      || die "cannot create po/Makefile.in.in"
1069    ;;
1070  esac
1071
1072  if test -d runtime-po; then
1073    # Similarly for runtime-po/Makevars, but not quite the same.
1074    rm -f runtime-po/Makevars
1075    sed '
1076      /^DOMAIN *=.*/s/=.*/= '"$package"'-runtime/
1077      /^subdir *=.*/s/=.*/= runtime-po/
1078      /^MSGID_BUGS_ADDRESS *=/s/=.*/= bug-'"$package"'@gnu.org/
1079      /^XGETTEXT_OPTIONS *=/{
1080        s/$/ \\/
1081        a\
1082            '"$XGETTEXT_OPTIONS_RUNTIME"' $${end_of_xgettext_options+}
1083      }
1084    ' po/Makevars.template >runtime-po/Makevars \
1085    || die 'cannot generate runtime-po/Makevars'
1086
1087    # Copy identical files from po to runtime-po.
1088    (cd po && cp -p Makefile.in.in *-quot *.header *.sed *.sin ../runtime-po)
1089  fi
1090fi
1091
1092bootstrap_epilogue
1093
1094echo "$0: done.  Now you can run './configure'."
1095
1096# Local variables:
1097# eval: (add-hook 'before-save-hook 'time-stamp)
1098# time-stamp-start: "scriptversion="
1099# time-stamp-format: "%:y-%02m-%02d.%02H"
1100# time-stamp-time-zone: "UTC0"
1101# time-stamp-end: "; # UTC"
1102# End:
1103