1#! /bin/sh
2
3# Bootstrap an Autotooled package from checked-out sources.
4# Written by Gary V. Vaughan, 2010
5# Inspired by a script written by Paul Eggert.
6
7# This is free software.  There is NO warranty; not even for
8# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
9#
10# Copyright (C) 2010-2019 Bootstrap Authors
11#
12# This file is dual licensed under the terms of the MIT license
13# <https://opensource.org/license/MIT>, and GPL version 3 or later
14# <http://www.gnu.org/licenses/gpl-2.0.html>.  You must apply one of
15# these licenses when using or redistributing this software or any of
16# the files within it.  See the URLs above, or the file `LICENSE`
17# included in the Bootstrap distribution for the full license texts.
18
19# You should place a copy of this script under version control in the
20# top-level directory of your project.  The intent is that all
21# customization can be done with a `bootstrap.conf` file also maintained
22# in your version control.
23
24# Please report bugs or propose patches to:
25# <https://github.com/gnulib-modules/bootstrap/issues>
26
27
28## ------ ##
29## Usage. ##
30## ------ ##
31
32# Most GNUish projects do not keep all of the generated Autotool
33# files under version control, but running all of the right tools
34# with the right arguments, in the correct order to regenerate
35# all of those files in readiness for configuration and building
36# can be surprisingly involved!  Many projects have a 'bootstrap'
37# script under version control to invoke Autotools and perform
38# other assorted book-keeping with version numbers and the like.
39#
40# This bootstrap script aims to probe the configure.ac and top
41# Makefile.am of your project to automatically determine what
42# the correct ordering and arguments are and then run the tools for
43# you.  In order to use it, you can generate an initial standalone
44# script with:
45#
46#   gl/build-aux/inline-source gl/build-aux/bootstrap.in > bootstrap
47#
48# You should then store than script in version control for other
49# developers in you project.  It will give you instructions about
50# how to keep it up to date if the sources change.
51#
52# See gl/doc/bootstrap.texi for documentation on how to write
53# a bootstrap.conf to customize it for your project's
54# idiosyncracies.
55
56
57## ================================================================== ##
58##                                                                    ##
59##     DO NOT EDIT THIS FILE, CUSTOMIZE IT USING A BOOTSTRAP.CONF     ##
60##                                                                    ##
61## ================================================================== ##
62
63## ------------------------------- ##
64## User overridable command paths. ##
65## ------------------------------- ##
66
67# All uppercase denotes values stored in the environment.  These
68# variables should generally be overridden by the user - however, we do
69# set them to 'true' in some parts of this script to prevent them being
70# called at the wrong time by other tools that we call ('autoreconf',
71# for example).
72#
73# We also allow 'LIBTOOLIZE', 'M4', 'SHA1SUM' and some others to be
74# overridden, and export the result for child processes, but they are
75# handled by the function 'func_find_tool' and not defaulted in this
76# section.
77
78: ${ACLOCAL="aclocal"}
79: ${AUTOCONF="autoconf"}
80: ${AUTOHEADER="autoheader"}
81: ${AUTOM4TE="autom4te"}
82: ${AUTOHEADER="autoheader"}
83: ${AUTOMAKE="automake"}
84: ${AUTOPOINT="autopoint"}
85: ${AUTORECONF="autoreconf"}
86: ${CMP="cmp"}
87: ${CONFIG_SHELL="/bin/sh"}
88: ${DIFF="diff"}
89: ${GIT="git"}
90: ${LN_S="ln -s"}
91: ${RM="rm"}
92
93export ACLOCAL
94export AUTOCONF
95export AUTOHEADER
96export AUTOM4TE
97export AUTOHEADER
98export AUTOMAKE
99export AUTOPOINT
100export AUTORECONF
101export CONFIG_SHELL
102
103
104## -------------- ##
105## Configuration. ##
106## -------------- ##
107
108# A newline delimited list of triples of programs (that respond to
109# --version), the minimum version numbers required (or just '-' in the
110# version field if any version will be sufficient) and homepage URLs
111# to help locate missing packages.
112buildreq=
113
114# Name of a file containing instructions on installing missing packages
115# required in 'buildreq'.
116buildreq_readme=README-hacking
117
118# These are extracted from AC_INIT in configure.ac, though you can
119# override those values in 'bootstrap.conf' if you prefer.
120build_aux=
121macro_dir=
122package=
123package_name=
124package_version=
125package_bugreport=
126
127# These are extracted from 'gnulib-cache.m4', or else fall-back
128# automatically on the gnulib defaults; unless you set the values
129# manually in 'bootstrap.conf'.
130doc_base=
131gnulib_mk=
132gnulib_name=
133local_gl_path=
134source_base=
135tests_base=
136
137# The list of gnulib modules required at 'gnulib-tool' time.  If you
138# check 'gnulib-cache.m4' into your repository, then this list will be
139# extracted automatically.
140gnulib_modules=
141
142# Extra gnulib files that are not in modules, which override files of
143# the same name installed by other bootstrap tools.
144gnulib_non_module_files="
145        build-aux/compile
146        build-aux/install-sh
147        build-aux/mdate-sh
148        build-aux/texinfo.tex
149        build-aux/depcomp
150        build-aux/config.guess
151        build-aux/config.sub
152        doc/INSTALL
153"
154
155# Relative path to the local gnulib submodule, and url to the upstream
156# git repository. If you have a gnulib entry in your .gitmodules file,
157# these values are ignored.
158gnulib_path=
159gnulib_url=
160
161# Date from which to clone github, to avoid a full clone.
162gnulib_clone_since=
163
164# Additional gnulib-tool options to use.
165gnulib_tool_options="
166        --no-changelog
167"
168
169# bootstrap removes any macro-files that are not included by aclocal.m4,
170# except for files listed in this variable that are always kept.
171gnulib_precious="
172        gnulib-tool.m4
173"
174
175# When truncating long commands for display, always allow at least this
176# many characters before truncating.
177min_cmd_len=160
178
179# The command to download all .po files for a specified domain into
180# a specified directory.  Fill in the first %s is the domain name, and
181# the second with the destination directory.  Use rsync's -L and -r
182# options because the latest/%s directory and the .po files within are
183# all symlinks.
184po_download_command_format=\
185"rsync --delete --exclude '*.s1' -Lrtvz \
186'translationproject.org::tp/latest/%s/' '%s'"
187
188# Other locale categories that need message catalogs.
189extra_locale_categories=
190
191# Additional xgettext options to use.  Gnulib might provide you with an
192# extensive list of additional options to append to this, but gettext
193# 0.16.1 and newer appends them automaticaly, so you can safely ignore
194# the complaints from 'gnulib-tool' if your $configure_ac states:
195#
196#    AM_GNU_GETTEXT_VERSION([0.16.1])
197xgettext_options="
198        --flag=_:1:pass-c-format
199        --flag=N_:1:pass-c-format
200"
201
202# Package copyright holder for gettext files.  Defaults to FSF if unset.
203copyright_holder=
204
205# File that should exist in the top directory of a checked out hierarchy,
206# but not in a distribution tarball.
207checkout_only_file=
208
209# Whether to use copies instead of symlinks by default (if set to true,
210# the --copy option has no effect).
211copy=false
212
213# Set this to ".cvsignore .gitignore" in 'bootstrap.conf' if you want
214# those files to be generated in directories like 'lib/', 'm4/', and 'po/',
215# or set it to "auto" to make this script select what to use based
216# on what version control system (if any) is used in the source directory.
217# Or set it to "none" to ignore VCS ignore files entirely.  Default is
218# "auto".
219vc_ignore=
220
221
222## ------------------- ##
223## External Libraries. ##
224## ------------------- ##
225
226# Source required external libraries:
227. `echo "$0" |${SED-sed} 's|[^/]*$||'`"funclib.sh"
228. `echo "$0" |${SED-sed} 's|[^/]*$||'`"options-parser"
229. `echo "$0" |${SED-sed} 's|[^/]*$||'`"extract-trace"
230
231# Set a version string for *this* script.
232scriptversion=2019-03-22.11; # UTC
233
234
235## ------------------- ##
236## Hookable functions. ##
237## ------------------- ##
238
239# After 'bootstrap.conf' has been sourced, execution proceeds by calling
240# 'func_bootstrap'.  Wherever a function is decorated with
241# 'func_hookable func_name', you will find a matching 'func_run_hooks
242# func_name', which executes all functions added with 'func_add_hook
243# func_name my_func'.
244#
245# You might notice that many of these functions begin with a series of
246# '$require_foo' lines.  See the docu-comments at the start of the
247# 'Resource management' section for a description of what these are.
248
249
250# func_bootstrap [ARG]...
251# -----------------------
252# All the functions called inside func_bootstrap are hookable. See the
253# the individual implementations for details.
254func_bootstrap ()
255{
256    $debug_cmd
257
258    # Save the current positional parameters to prevent them being
259    # corrupted by calls to 'set' in 'func_init'.
260    func_quote eval ${1+"$@"}
261    _G_saved_positional_parameters=$func_quote_result
262
263    # Initialisation.
264    func_init
265
266    # Option processing.
267    eval func_options "$_G_saved_positional_parameters"
268
269    # Post-option preparation.
270    func_prep
271
272    # Reconfigure the package.
273    func_reconfigure
274
275    # Ensure .version is up-to-date.
276    func_update_dotversion
277
278    # Finalisation.
279    func_fini
280}
281
282
283# func_init
284# ---------
285# Any early initialisations can be hooked to this function.  Consider
286# whether you can hook onto 'func_prep' instead, because if you hook
287# any slow to execute code in here, it will also add to the time before
288# './bootstrap --version' can respond.
289func_hookable func_init
290func_init ()
291{
292    $debug_cmd
293
294    func_run_hooks func_init
295}
296
297
298# func_prep
299# ---------
300# Function to perform preparation for remaining bootstrap process. If
301# your hooked code relies on the outcome of 'func_options' hook it here
302# rather than to 'func_init'.
303#
304# All the functions called inside func_prep are hookable. See the
305# individual implementations for details.
306func_hookable func_prep
307func_prep ()
308{
309    $debug_cmd
310
311    $require_buildtools_uptodate
312    $require_checkout_only_file
313
314    $require_gnulib_merge_changelog
315
316    # Report the results of SED and GREP searches from funclib.sh.
317    func_verbose "GREP='$GREP'"
318    func_verbose "SED='$SED'"
319
320    # fetch update files from the translation project
321    func_update_translations
322
323    func_run_hooks func_prep
324}
325
326
327# func_update_translations
328# ------------------------
329# Update package po files and translations.
330func_hookable func_update_translations
331func_update_translations ()
332{
333    $debug_cmd
334
335    $opt_skip_po || {
336      test -d po && {
337        $require_package
338
339        func_update_po_files po $package || exit $?
340      }
341
342      func_run_hooks func_update_translations
343    }
344}
345
346
347# func_reconfigure
348# ----------------
349# Reconfigure the current package by running the appropriate autotools in a
350# suitable order.
351func_hookable func_reconfigure
352func_reconfigure ()
353{
354    $debug_cmd
355
356    $require_automake_options
357
358    # Automake (without 'foreign' option) requires that NEWS & README exist.
359    case " $automake_options " in
360      " foreign ") ;;
361      *)
362        func_ensure_NEWS
363        func_ensure_README
364        ;;
365    esac
366
367    # Ensure ChangeLog presence.
368    if test -n "$gnulib_modules"; then
369      func_ifcontains "$gnulib_modules" gitlog-to-changelog \
370        func_ensure_changelog
371    else
372      $require_gnulib_cache
373      if $SED -n '/^gl_MODULES(\[/,/^])$/p' $gnulib_cache 2>/dev/null |
374         func_grep_q gitlog-to-changelog
375      then
376        func_ensure_changelog
377      fi
378    fi
379
380    # Released 'autopoint' has the tendency to install macros that have
381    # been obsoleted in current 'gnulib', so run this before 'gnulib-tool'.
382    func_autopoint
383
384    # Autoreconf runs 'aclocal' before 'libtoolize', which causes spurious
385    # warnings if the initial 'aclocal' is confused by the libtoolized
386    # (or worse: out-of-date) macro directory.
387    func_libtoolize
388
389    # If you need to do anything after 'gnulib-tool' is done, but before
390    # 'autoreconf' runs, you don't need to override this whole function,
391    # because 'func_gnulib_tool' is hookable.
392    func_gnulib_tool
393
394    func_autoreconf
395
396    func_run_hooks func_reconfigure
397}
398
399
400# func_gnulib_tool
401# ----------------
402# Run 'gnulib-tool' to fetch gnulib modules into the current package.
403#
404# It's assumed that since you are using gnulib's 'bootstrap' script,
405# you're also using gnulib elsewhere in your package.  If not, then
406# you can replace this function in 'bootstrap.conf' with:
407#
408#   func_gnulib_tool () { :; }
409#
410# (although the function returns immediately if $gnulib_tool is set to
411# true in any case).
412func_hookable func_gnulib_tool
413func_gnulib_tool ()
414{
415    $debug_cmd
416
417    $require_gnulib_tool
418    $require_libtoolize
419
420    test true = "$gnulib_tool" || {
421      $require_gnulib_git_submodules
422
423      # bootstrap.conf written for gnulib bootstrap expects
424      # gnulib_tool_option_extras to which --no-changelog is appended,
425      # but libtool bootstrap expects you to append to gnulib_tool_options
426      # so that you can override the --no-changelog default: make sure we
427      # support both styles so users can migrate between them easily.
428      gnulib_tool_all_options="$gnulib_tool_options $gnulib_tool_option_extras"
429
430      if test -n "$gnulib_modules"; then
431        $require_gnulib_cache
432        $require_gnulib_tool_base_options
433
434        gnulib_mode=--import
435
436        # Try not to pick up any stale values from 'gnulib-cache.m4'.
437        rm -f "$gnulib_cache"
438
439        test -n "$gnulib_tool_base_options" \
440            && func_append_uniq gnulib_tool_all_options " $gnulib_tool_base_options"
441        test -n "$gnulib_mk" \
442            && func_append_uniq gnulib_tool_all_options " --makefile-name=$gnulib_mk"
443        test -n "$tests_base" && {
444          func_append_uniq gnulib_tool_all_options " --tests-base=$tests_base"
445          func_append_uniq gnulib_tool_all_options " --with-tests"
446        }
447      else
448
449        # 'gnulib_modules' and others are cached in 'gnulib-cache.m4':
450        # Use 'gnulib --update' to fetch gnulib modules.
451        gnulib_mode=--update
452      fi
453
454      # Add a sensible default libtool option to gnulib_tool_options.
455      # The embedded echo is to squash whitespace before globbing.
456      case `echo " "$gnulib_tool_all_options" "` in
457        *" --no-libtool "*|*" --libtool "*) ;;
458        *)  if test true = "$LIBTOOLIZE"; then
459              func_append_uniq gnulib_tool_all_options " --no-libtool"
460            else
461              func_append_uniq gnulib_tool_all_options " --libtool"
462            fi
463            ;;
464      esac
465
466      $opt_copy || func_append_uniq gnulib_tool_all_options " --symlink"
467
468      func_append_uniq gnulib_tool_all_options " $gnulib_mode"
469      func_append gnulib_tool_all_options " $gnulib_modules"
470
471      # The embedded echo is to squash whitespace before display.
472      gnulib_cmd=`echo $gnulib_tool $gnulib_tool_all_options`
473
474      func_show_eval "$gnulib_cmd" 'exit $?'
475
476      # Use 'gnulib-tool --copy-file' to install non-module files.
477      func_install_gnulib_non_module_files
478    }
479
480    func_run_hooks func_gnulib_tool
481}
482
483
484# func_fini
485# ---------
486# Function to perform all finalisation for the bootstrap process.
487func_hookable func_fini
488func_fini ()
489{
490    $debug_cmd
491
492    func_gettext_configuration
493    func_clean_dangling_symlinks
494    func_clean_unused_macros
495    func_skip_po_recommendation
496
497    func_run_hooks func_fini
498
499    $require_bootstrap_uptodate
500
501    func_echo "Done.  Now you can run './configure'."
502}
503
504
505# func_gettext_configuration
506# --------------------------
507# Edit configuration values into po/Makevars.
508func_hookable func_gettext_configuration
509func_gettext_configuration ()
510{
511    $debug_cmd
512
513    $require_autopoint
514
515    test true = "$AUTOPOINT" || {
516      $require_copyright_holder
517      $require_extra_locale_categories
518      $require_package_bugreport
519
520      # Escape xgettext options for sed Makevars generation below.
521      # We have to delete blank lines in a separate script so that we don't
522      # append \\\ to the penultimate line, and then delete the last empty
523      # line, which messes up the variable substitution later in this
524      # function.  Note that adding a literal \\\ requires double escaping
525      # here, once for the execution subshell, and again for the assignment,
526      # which is why there are actually 12 (!!) backslashes in the script.
527      _G_xgettext_options=`echo "$xgettext_options$nl" |$SED '/^$/d' |$SED '
528          $b
529          s|$| \\\\\\\\\\\\|'`
530
531      # Create gettext configuration.
532      func_echo "Creating po/Makevars from po/Makevars.template ..."
533      $RM -f po/Makevars
534      $SED '
535        /^EXTRA_LOCALE_CATEGORIES *=/s|=.*|= '"$extra_locale_categories"'|
536        /^COPYRIGHT_HOLDER *=/s|=.*|= '"$copyright_holder"'|
537        /^MSGID_BUGS_ADDRESS *=/s|=.*|= '"$package_bugreport"'|
538        /^XGETTEXT_OPTIONS *=/{
539          s|$| \\|
540          a\
541             '"$_G_xgettext_options"' \\\
542             $${end_of_xgettext_options+}
543        }
544        s/ *$//
545      ' po/Makevars.template >po/Makevars || exit 1
546    }
547
548    func_run_hooks func_gettext_configuration
549}
550
551
552
553## --------------- ##
554## Core functions. ##
555## --------------- ##
556
557# This section contains the main functions called from the 'Hookable
558# functions' (shown above), and are the ones you're  most likely
559# to want to replace with your own implementations in 'bootstrap.conf'.
560
561
562# func_autopoint
563# --------------
564# If this package uses gettext, then run 'autopoint'.
565func_autopoint ()
566{
567    $debug_cmd
568
569    $require_autopoint
570
571    test true = "$AUTOPOINT" \
572        || func_show_eval "$AUTOPOINT --force" 'exit $?'
573}
574
575
576# func_libtoolize
577# ---------------
578# If this package uses libtool, then run 'libtoolize'.
579func_libtoolize ()
580{
581    $debug_cmd
582
583    $require_libtoolize
584
585    test true = "$LIBTOOLIZE" || {
586      _G_libtoolize_options=
587      $opt_copy && func_append _G_libtoolize_options " --copy"
588      $opt_force && func_append _G_libtoolize_options " --force"
589      $opt_verbose || func_append _G_libtoolize_options " --quiet"
590      func_show_eval "$LIBTOOLIZE$_G_libtoolize_options" 'exit $?'
591    }
592}
593
594
595# func_gnulib_tool_copy_file SRC DEST
596# -----------------------------------
597# Copy SRC, a path relative to the gnulib sub-tree, to DEST, a path
598# relative to the top-level source directory using gnulib-tool so that
599# any patches or replacements in $local_gl_path are applied.
600func_gnulib_tool_copy_file ()
601{
602    $debug_cmd
603
604    $require_gnulib_tool
605    $require_patch
606
607    if test true = "$gnulib_tool"; then
608      # If gnulib-tool is not available (e.g. bootstrapping in a
609      # distribution tarball), make sure that at least we have some
610      # version of the required file already in place.
611      test -f "$2" || func_fatal_error "\
612Can't find, copy or download '$2', a required
613gnulib supplied file, please provide the location of a
614complete 'gnulib' tree by setting 'gnulib_path' in your
615'bootstrap.conf' or with the '--gnulib-srcdir' option -
616or else specify the location of your 'git' binary by
617setting 'GIT' in the environment so that a fresh
618'gnulib' submodule can be cloned."
619    else
620      $require_gnulib_copy_cmd
621
622      $gnulib_copy_cmd $1 $2 2>/dev/null || {
623        $require_gnulib_path
624
625        func_error "'$gnulib_path/$1' does not exist"
626        return 1
627      }
628    fi
629}
630
631
632# func_install_gnulib_non_module_files
633# ------------------------------------
634# Get additional non-module files from gnulib, overriding existing files.
635func_install_gnulib_non_module_files ()
636{
637    $debug_cmd
638
639    $require_build_aux
640    $require_gnulib_tool
641
642    test -n "$gnulib_non_module_files" && {
643      maybe_exit_cmd=:
644
645      for file in $gnulib_non_module_files; do
646        case $file in
647          */COPYING*) dest=COPYING;;
648          */INSTALL) dest=INSTALL;;
649	  build-aux/missing) dest=
650            func_warning settings "\
651Please remove build-aux/missing from gnulib_module_files in
652'bootstrap.conf', as it may clash with Automake's version."
653            ;;
654          build-aux/*) dest=$build_aux/`expr "$file" : 'build-aux/\(.*\)'`;;
655          *) dest=$file;;
656        esac
657
658        # Be sure to show all copying errors before bailing out
659	test -z "$dest" \
660	    || func_gnulib_tool_copy_file "$file" "$dest" \
661	    || maybe_exit_cmd="exit $EXIT_FAILURE"
662      done
663
664      $maybe_exit_cmd
665    }
666}
667
668
669# func_ensure_changelog
670# ---------------------
671# Even with 'gitlog-to-changelog' generated ChangeLogs, automake
672# will not run to completion with no ChangeLog file.
673func_ensure_changelog ()
674{
675    $debug_cmd
676
677    test -f ChangeLog && mv -f ChangeLog ChangeLog~
678
679    cat >ChangeLog <<'EOT'
680## ---------------------- ##
681## DO NOT EDIT THIS FILE! ##
682## ---------------------- ##
683
684ChangeLog is generated by gitlog-to-changelog.
685EOT
686
687    _G_message="creating dummy 'ChangeLog'"
688    test -f ChangeLog~ \
689      && func_append _G_message ' (backup in ChangeLog~)'
690    func_verbose "$_G_message"
691
692    return 0
693}
694
695
696# func_ensure_NEWS
697# ----------------
698# Without AM_INIT_AUTOMAKE([foreign]), automake will not run to
699# completion with no NEWS file, even though NEWS.md or NEWS.txt
700# is often preferable.
701func_ensure_NEWS ()
702{
703    $debug_cmd
704
705    test -f NEWS || {
706      _G_NEWS=
707      for _G_news in NEWS.txt NEWS.md NEWS.rst; do
708        test -f "$_G_news" && break
709      done
710
711      test -f "$_G_news" && $LN_S $_G_news NEWS
712      func_verbose "$LN_S $_G_news NEWS"
713    }
714
715    return 0
716}
717
718
719# func_ensure_README
720# ------------------
721# Without AM_INIT_AUTOMAKE([foreign]), automake will not run to
722# completion with no README file, even though README.md or README.txt
723# is often preferable.
724func_ensure_README ()
725{
726    $debug_cmd
727
728    test -f README || {
729      _G_README=
730      for _G_readme in README.txt README.md README.rst; do
731        test -f "$_G_readme" && break
732      done
733
734      test -f "$_G_readme" && $LN_S $_G_readme README
735      func_verbose "$LN_S $_G_readme README"
736    }
737
738    return 0
739}
740
741
742# func_autoreconf [SUBDIR]
743# ------------------------
744# Being careful not to re-run 'autopoint' or 'libtoolize', and not to
745# try to run 'autopoint', 'libtoolize' or 'autoheader' on packages that
746# don't use them, defer to 'autoreconf' for execution of the remaining
747# autotools to bootstrap this package.
748#
749# Projects with multiple trees to reconfigure can hook another call to
750# this function onto func_reconfigure:
751#
752#    my_autoreconf_foo ()
753#    {
754#        func_autoreconf foo
755#    }
756#    func_add_hook func_reconfigure my_autoreconf_foo
757func_autoreconf ()
758{
759    $debug_cmd
760
761    $require_autoheader
762    $require_build_aux  # automake and others put files in here
763    $require_macro_dir  # aclocal and others put files in here
764
765    # We ran these manually already, and autoreconf won't exec ':'
766    save_AUTOPOINT=$AUTOPOINT; AUTOPOINT=true
767    save_LIBTOOLIZE=$LIBTOOLIZE; LIBTOOLIZE=true
768
769    _G_autoreconf_options=
770    $opt_copy || func_append _G_autoreconf_options " --symlink"
771    $opt_force && func_append _G_autoreconf_options " --force"
772    $opt_verbose && func_append _G_autoreconf_options " --verbose"
773    func_show_eval "$AUTORECONF$_G_autoreconf_options --install${1+ $1}" 'exit $?'
774
775    AUTOPOINT=$save_AUTOPOINT
776    LIBTOOLIZE=$save_LIBTOOLIZE
777}
778
779
780# func_check_configuration VARNAME [CONFIGURE_MACRO]
781# --------------------------------------------------
782# Exit with a suitable diagnostic for an important configuration change
783# that needs to be made before bootstrap can run correctly.
784func_check_configuration ()
785{
786    $debug_cmd
787
788    $require_configure_ac
789
790    eval 'test -n "$'$1'"' || {
791      _G_error_msg="please set '$1' in 'bootstrap.conf'"
792      if test -n "$configure_ac" && test -n "$2"; then
793        func_append _G_error_msg "
794or add the following (or similar) to your '$configure_ac':
795$2"
796      fi
797
798      func_fatal_error "$_G_error_msg"
799    }
800}
801
802
803# func_clean_dangling_symlinks
804# ----------------------------
805# Remove any dangling symlink matching "*.m4" or "*.[ch]" in some
806# gnulib-populated directories. Such .m4 files would cause aclocal to
807# fail.  The following requires GNU find 4.2.3 or newer. Considering
808# the usual portability constraints of this script, that may seem a very
809# demanding requirement, but it should be ok.  Ignore any failure,
810# which is fine, since this is only a convenience to help developers
811# avoid the relatively unusual case where a symlinked-to .m4 file is
812# git-removed from gnulib between successive runs of this script.
813func_clean_dangling_symlinks ()
814{
815    $debug_cmd
816
817    $require_macro_dir
818    $require_source_base
819
820    func_verbose "cleaning dangling symlinks"
821
822    find "$macro_dir" "$source_base" \
823        -depth \( -name '*.m4' -o -name '*.[ch]' \) \
824        -type l -xtype l -delete > /dev/null 2>&1
825}
826
827
828# func_clean_unused_macros
829# ------------------------
830# Autopoint can result in over-zealously adding macros into $macro_dir
831# even though they are not actually used, for example tests to help
832# build the 'intl' directory even though you have specified
833# 'AM_GNU_GETTEXT([external])' in your configure.ac.  This function
834# looks removes any macro files that can be found in gnulib,  but
835# are not 'm4_include'd by 'aclocal.m4'.
836func_clean_unused_macros ()
837{
838    $debug_cmd
839
840    $require_gnulib_path
841    $require_macro_dir
842
843    test -n "$gnulib_path" && test -f aclocal.m4 && {
844      aclocal_m4s=`find . -name aclocal.m4 -print`
845
846      # We use 'ls|grep' instead of 'ls *.m4' to avoid exceeding
847      # command line length limits in some shells.
848      for file in `cd "$macro_dir" && ls -1 |$GREP '\.m4$'`; do
849
850	# Remove a macro file when aclocal.m4 does not m4_include it...
851        func_grep_q 'm4_include([[]'$macro_dir/$file'])' $aclocal_m4s \
852            || test ! -f "$gnulib_path/m4/$file" || {
853
854              # ...and there is an identical file in gnulib...
855              if func_cmp_s "$gnulib_path/m4/$file" "$macro_dir/$file"; then
856
857                # ...and it's not in the precious list ('echo' is needed
858                # here to squash whitespace for the match expression).
859                case " "`echo $gnulib_precious`" " in
860                  *" $file "*) ;;
861                  *) rm -f "$macro_dir/$file"
862                     func_verbose \
863                       "removing unused gnulib file '$macro_dir/$file'"
864                esac
865              fi
866        }
867      done
868    }
869}
870
871
872# func_skip_po_recommendation
873# ---------------------------
874# If there is a po directory, and '--skip-po' wasn't passed, let the
875# user know that they can use '--skip-po' on subsequent invocations.
876func_skip_po_recommendation ()
877{
878    $debug_cmd
879
880    test ! -d po \
881        || $opt_skip_po \
882        || func_warning recommend "\
883If your pofiles are up-to-date, you can rerun bootstrap
884as '$progname --skip-po' to avoid redownloading."
885}
886
887
888# func_update_dotversion
889# ----------------------
890# Even with 'gitlog-to-changelog' generated ChangeLogs, automake
891# will not run to completion with no ChangeLog file.
892func_update_dotversion ()
893{
894    $debug_cmd
895
896    test -f "$build_aux/git-version-gen" && {
897      _G_message="updating .version"
898      test -f .version && {
899        mv .version .version~
900	func_append _G_message " (backup in .version~)"
901      }
902      func_verbose "updating .version"
903
904      $build_aux/git-version-gen dummy-arg > .version
905    }
906}
907
908
909
910## -------------------- ##
911## Resource management. ##
912## -------------------- ##
913
914# This section contains definitions for functions that each ensure a
915# particular resource (a file, or a non-empty configuration variable for
916# example) is available, and if appropriate to extract default values
917# from pertinent package files.  Where a variable already has a non-
918# empty value (as set by the package's 'bootstrap.conf'), that value is
919# used in preference to deriving the default. Call them using their
920# associated 'require_*' variable to ensure that they are executed, at
921# most, once.
922
923
924# require_gnulib_git_submodules
925# -----------------------------
926# Initialize all git modules from $gnulib_git_submodules before we
927# run 'gnulib-tool'.
928require_gnulib_git_submodules=func_require_gnulib_git_submodules
929func_require_gnulib_git_submodules ()
930{
931    test -n "$gnulib_git_submodules" && {
932      for _G_submodule in $gnulib_git_submodules
933      do
934        func_show_eval "git submodule init -- $_G_submodule" \
935            && func_show_eval "git submodule update -- $_G_submodule" \
936            || func_fatal_error "Unable to init git module '$_G_submodule'."
937      done
938    }
939
940    require_gnulib_git_submodules=:
941}
942
943
944# require_checkout_only_file
945# --------------------------
946# Bail out  if this package only bootstraps properly from a repository
947# checkout.
948require_checkout_only_file=func_require_checkout_only_file
949func_require_checkout_only_file ()
950{
951    $debug_cmd
952
953    $opt_force || {
954      test -n "$checkout_only_file" && test ! -f "$checkout_only_file" \
955          && func_fatal_error "\
956Bootstrapping from a non-checked-out distribution is risky.
957If you wish to bootstrap anyway, use the '--force' option."
958    }
959
960    require_checkout_only_file=:
961}
962
963
964# require_aclocal_amflags
965# -----------------------
966# Ensure '$aclocal_amflags' has a sensible default, extracted from
967# 'Makefile.am' if necessary.
968require_aclocal_amflags=func_require_aclocal_amflags
969func_require_aclocal_amflags ()
970{
971    $debug_cmd
972
973    $require_makefile_am
974
975    _G_sed_extract_aclocal_amflags='s|#.*$||
976        /^[	 ]*ACLOCAL_AMFLAGS[	 ]*=/ {
977            s|^.*=[	 ]*\(.*\)|aclocal_amflags="\1"|
978            p
979        }'
980
981    _G_aclocal_flags_cmd=`$SED -n "$_G_sed_extract_aclocal_amflags" \
982        "$makefile_am"`
983    eval "$_G_aclocal_flags_cmd"
984
985    func_verbose "ACLOCAL_AMFLAGS='$aclocal_amflags'"
986
987    require_aclocal_amflags=:
988}
989
990
991# require_autoheader
992# ------------------
993# Skip autoheader if it's not needed.
994require_autoheader=func_require_autoheader
995func_require_autoheader ()
996{
997    $debug_cmd
998
999    test true = "$AUTOHEADER" || {
1000      func_extract_trace AC_CONFIG_HEADERS
1001      test -n "$func_extract_trace_result" \
1002	  || func_extract_trace AC_CONFIG_HEADER
1003
1004      test -n "$func_extract_trace_result" || {
1005        AUTOHEADER=true
1006
1007        func_verbose "export AUTOHEADER='$AUTOHEADER'"
1008
1009        # Make sure the search result is visible to subshells
1010        export AUTOHEADER
1011      }
1012    }
1013
1014    require_autoheader=:
1015}
1016
1017
1018# require_automake_options
1019# ------------------------
1020# Extract options from AM_AUTOMAKE_INIT.
1021require_automake_options=func_require_automake_options
1022func_require_automake_options ()
1023{
1024    $debug_cmd
1025
1026    func_extract_trace AM_INIT_AUTOMAKE
1027    automake_options=$func_extract_trace_result
1028
1029    require_automake_options=:
1030}
1031
1032
1033# require_autopoint
1034# -----------------
1035# Skip autopoint if it's not needed.
1036require_autopoint=func_require_autopoint
1037func_require_autopoint ()
1038{
1039    $debug_cmd
1040
1041    test true = "$AUTOPOINT" || {
1042      func_extract_trace AM_GNU_GETTEXT_VERSION
1043
1044      test -n "$func_extract_trace_result" || {
1045        AUTOPOINT=true
1046
1047        func_verbose "export AUTOPOINT='$AUTOPOINT'"
1048
1049        # Make sure the search result is visible to subshells
1050        export AUTOPOINT
1051      }
1052    }
1053
1054    require_autopoint=:
1055}
1056
1057
1058# require_bootstrap_uptodate
1059# --------------------------
1060# Complain if the version of bootstrap in the gnulib directory differs
1061# from the one we are running.
1062require_bootstrap_uptodate=func_require_bootstrap_uptodate
1063func_require_bootstrap_uptodate ()
1064{
1065    $debug_cmd
1066
1067    $require_build_aux
1068
1069    _G_bootstrap_sources="
1070      $build_aux/bootstrap.in
1071      $build_aux/extract-trace
1072      $build_aux/funclib.sh
1073      $build_aux/options-parser
1074    "
1075
1076    _G_missing_bootstrap_sources=false
1077    for _G_src in $_G_bootstrap_sources; do
1078      test -f "$_G_src" || _G_missing_bootstrap_sources=:
1079    done
1080
1081    if $_G_missing_bootstrap_sources; then
1082      func_warning upgrade "\
1083Please add bootstrap to your gnulib_modules list in
1084'bootstrap.conf', so that I can tell you when there are
1085updates available."
1086    else
1087      rm -f bootstrap.new
1088      $build_aux/inline-source $build_aux/bootstrap.in > bootstrap.new
1089
1090      if func_cmp_s "$progpath" bootstrap.new; then
1091        rm -f bootstrap.new
1092	func_verbose "bootstrap script up to date"
1093      else
1094        chmod 555 bootstrap.new
1095        func_warning upgrade "\
1096An updated bootstrap script has been generated for you in
1097'bootstrap.new'.  After you've verified that you want
1098the changes, you can update with:
1099    mv -f bootstrap.new $progname
1100    ./$progname
1101
1102Or you can disable this check permanently by adding the
1103following to 'bootstrap.conf':
1104    require_bootstrap_uptodate=:"
1105      fi
1106    fi
1107
1108    require_bootstrap_uptodate=:
1109}
1110
1111
1112# require_build_aux
1113# -----------------
1114# Ensure that '$build_aux' is set, and if it doesn't already point to an
1115# existing directory, create one.
1116require_build_aux=func_require_build_aux
1117func_require_build_aux ()
1118{
1119    $debug_cmd
1120
1121    test -n "$build_aux" || {
1122      func_extract_trace_first AC_CONFIG_AUX_DIR
1123      build_aux=$func_extract_trace_first_result
1124      func_check_configuration build_aux \
1125          "AC_CONFIG_AUX_DIR([name of a directory for build scripts])"
1126
1127      func_verbose "build_aux='$build_aux'"
1128    }
1129
1130    $require_vc_ignore_files
1131
1132    # If the build_aux directory doesn't exist, create it now, and mark it
1133    # as ignored for the VCS.
1134    if test ! -d "$build_aux"; then
1135      func_show_eval "mkdir '$build_aux'"
1136
1137      test -n "$vc_ignore_files" \
1138          || func_insert_if_absent "$build_aux" $vc_ignore_files
1139    fi
1140
1141    require_build_aux=:
1142}
1143
1144
1145# require_buildreq_autobuild
1146# --------------------------
1147# Try to find whether the bootstrap requires autobuild.
1148require_buildreq_autobuild=func_require_buildreq_autobuild
1149func_require_buildreq_autobuild ()
1150{
1151    $debug_cmd
1152
1153    $require_macro_dir
1154
1155    test -f "$macro_dir/autobuild.m4" \
1156        || printf '%s\n' "$buildreq" |func_grep_q '^[	 ]*autobuild' \
1157        || {
1158      func_extract_trace AB_INIT
1159      test -n "$func_extract_trace_result" && {
1160        func_append buildreq 'autobuild - http://josefsson.org/autobuild/
1161'
1162        func_verbose "auto-adding 'autobuild' to build requirements"
1163      }
1164    }
1165
1166    require_buildreq_autobuild=:
1167}
1168
1169
1170# require_buildreq_autoconf
1171# require_buildreq_autopoint
1172# require_buildreq_libtoolize
1173# ---------------------------
1174# Try to find the minimum compatible version of autoconf/libtool
1175# required to bootstrap successfully, and add it to '$buildreq'.
1176for tool in autoconf libtoolize autopoint; do
1177  b=$tool
1178  v=require_buildreq_${tool}
1179  f=func_$v
1180  case $tool in
1181    autoconf) m=AC_PREREQ ;;
1182    libtoolize) m=LT_PREREQ; b=libtool ;;
1183    autopoint) m=AM_GNU_GETTEXT_VERSION b=gettext ;;
1184  esac
1185
1186  eval $v'='$f'
1187  '$f' ()
1188  {
1189    $debug_cmd
1190
1191    # The following is ignored if undefined, but might be necessary
1192    # in order for `func_find_tool` to run.
1193    ${require_'$tool'-:}
1194
1195    printf '\''%s\n'\'' "$buildreq" |func_grep_q '\''^[	 ]*'$tool\'' || {
1196      func_extract_trace '$m'
1197      _G_version=$func_extract_trace_result
1198      test -n "$_G_version" && {
1199        func_append buildreq "\
1200            '$tool' $_G_version http://www.gnu.org/s/'$b'
1201"
1202        func_verbose \
1203            "auto-adding '\'$tool'-$_G_version'\'' to build requirements"
1204      }
1205    }
1206
1207    '$v'=:
1208  }
1209'
1210done
1211
1212
1213# require_buildreq_automake
1214# -------------------------
1215# Try to find the minimum compatible version of automake required to
1216# bootstrap successfully, and add it to '$buildreq'.
1217require_buildreq_automake=func_require_buildreq_automake
1218func_require_buildreq_automake ()
1219{
1220    $debug_cmd
1221
1222    # if automake is not already listed in $buildreq...
1223    printf '%s\n' "$buildreq" |func_grep_q automake || {
1224      func_extract_trace AM_INIT_AUTOMAKE
1225
1226      # ...and AM_INIT_AUTOMAKE is declared...
1227      test -n "$func_extract_trace_result" && {
1228        automake_version=`$ECHO "$func_extract_trace_result" \
1229           |$SED -e 's|[^0-9]*||' -e 's| .*$||'`
1230        test -n "$automake_version" || automake_version=-
1231
1232        func_append buildreq "\
1233            automake $automake_version http://www.gnu.org/s/automake
1234"
1235        func_verbose \
1236            "auto-adding 'automake-$automake_version' to build requirements"
1237      }
1238    }
1239
1240    require_buildreq_automake=:
1241}
1242
1243
1244# require_buildreq_patch
1245# ----------------------
1246# Automatically add a patch build-requirement if there are diff files
1247# in $local_gl_path.
1248require_buildreq_patch=func_require_buildreq_patch
1249func_require_buildreq_patch ()
1250{
1251    $debug_cmd
1252
1253    $require_local_gl_path
1254
1255    # This ensures PATCH is set appropriately by the time
1256    # func_check_versions enforces $buildreq.
1257    $require_patch
1258
1259    # If patch is not already listed in $buildreq...
1260    printf '%s\n' "$buildreq" |func_grep_q '^[	 ]*patch' || {
1261      eval "set dummy $local_gl_path_quoted" ; shift
1262
1263      for _G_dir
1264      do
1265        # The ugly find invocation is necessary to exit with non-zero
1266        # status for old find binaries that don't support -exec fully.
1267        if test ! -d "$_G_dir" \
1268            || find "$_G_dir" -name "*.diff" -exec false {} \; ; then :
1269        else
1270          func_append buildreq "patch - http://www.gnu.org/s/patch$nl"
1271          break
1272        fi
1273      done
1274    }
1275
1276    require_buildreq_patch=:
1277}
1278
1279
1280# require_buildtools_uptodate
1281# ---------------------------
1282# Ensure all the packages listed in BUILDREQS are available on the build
1283# machine at the minimum versions or better.
1284require_buildtools_uptodate=func_require_buildtools_uptodate
1285func_require_buildtools_uptodate ()
1286{
1287    $debug_cmd
1288
1289    $require_buildreq_autobuild
1290    $require_buildreq_autoconf
1291    $require_buildreq_automake
1292    $require_buildreq_libtoolize
1293    $require_buildreq_autopoint
1294    $require_buildreq_patch
1295
1296    test -n "$buildreq" && {
1297      _G_error_hdr=
1298
1299      func_check_versions $buildreq
1300      $func_check_versions_result || {
1301        test -n "$buildreq_readme" \
1302            && test -f "$buildreq_readme" \
1303            && _G_error_hdr="\
1304$buildreq_readme explains how to obtain these prerequisite programs:
1305"
1306        func_strtable 0 11 12 36 \
1307            "Program" "Min_version" "Homepage" $buildreq
1308        func_fatal_error "$_G_error_hdr$func_strtable_result"
1309      }
1310    }
1311
1312    require_buildtools_uptodate=:
1313}
1314
1315
1316# require_copyright_holder
1317# ------------------------
1318# Ensure there is a sensible non-empty default value in '$copyright_holder'.
1319require_copyright_holder=func_require_copyright_holder
1320func_require_copyright_holder ()
1321{
1322    $debug_cmd
1323
1324    test -n "$copyright_holder" || {
1325      copyright_holder='Free Software Foundation, Inc.'
1326      func_warning settings "\
1327Please set copyright_holder explicitly in 'bootstrap.conf';
1328defaulting to '$copyright_holder'."
1329    }
1330
1331    require_copyright_holder=:
1332}
1333
1334
1335# require_doc_base
1336# ----------------
1337# Ensure doc_base has a sensible value, extracted from 'gnulib-cache.m4'
1338# if possible, otherwise letting 'gnulib-tool' pick a default.
1339require_doc_base=func_require_doc_base
1340func_require_doc_base ()
1341{
1342    $debug_cmd
1343
1344    $require_gnulib_cache
1345
1346    test -f "$gnulib_cache" && test -z "$doc_base" && {
1347      func_extract_trace_first "gl_DOC_BASE" "$gnulib_cache"
1348      doc_base=$func_extract_trace_first_result
1349
1350      test -n "$doc_base" && func_verbose "doc_base='$doc_base'"
1351    }
1352
1353    require_doc_base=:
1354}
1355
1356
1357# require_dotgitmodules
1358# ---------------------
1359# Ensure we have a '.gitmodules' file, with appropriate 'gnulib' settings.
1360require_dotgitmodules=func_require_dotgitmodules
1361func_require_dotgitmodules ()
1362{
1363    $debug_cmd
1364
1365    $require_git
1366
1367    test true = "$GIT" || {
1368      # A gnulib entry in .gitmodules always takes precedence.
1369      _G_path=`$GIT config --file .gitmodules submodule.gnulib.path 2>/dev/null`
1370
1371      test -n "$_G_path" || {
1372        $require_vc_ignore_files
1373
1374        func_verbose "creating '.gitmodules'"
1375
1376        # If the .gitmodules file doesn't exist, create it now, and mark
1377        # it as ignored for the VCS.
1378        test -n "$gnulib_path" || gnulib_path=gnulib
1379        test -n "$gnulib_url"  || gnulib_url=git://git.sv.gnu.org/gnulib
1380
1381        {
1382          echo '[submodule "gnulib"]'
1383          echo "	path = $gnulib_path"
1384          echo "	url = $gnulib_url"
1385        } >> .gitmodules
1386
1387        test -n "$vc_ignore_files" \
1388          || func_insert_if_absent ".gitmodules" $vc_ignore_files
1389      }
1390    }
1391
1392    require_dotgitmodules=:
1393}
1394
1395
1396# require_extra_locale_categories
1397# -------------------------------
1398# Ensure there is a default value in '$extra_locale_categories'
1399require_extra_locale_categories=func_require_extra_locale_categories
1400func_require_extra_locale_categories ()
1401{
1402    $debug_cmd
1403
1404    # Defaults to empty, so run with whatever value may have been set in
1405    # 'bootstrap.conf'.
1406    require_extra_locale_categories=:
1407}
1408
1409
1410# require_git
1411# -----------
1412# Ignore git if it's not available, or we're not in a git checkout tree.
1413require_git=func_require_git
1414func_require_git ()
1415{
1416    $debug_cmd
1417
1418    $opt_skip_git && GIT=true
1419
1420    test true = "$GIT" || {
1421      if test -d .git/.; then
1422        ($GIT --version) >/dev/null 2>&1 || GIT=true
1423      fi
1424    }
1425
1426    func_verbose "GIT='$GIT'"
1427
1428    require_git=:
1429}
1430
1431
1432# require_gnulib_cache
1433# --------------------
1434# Ensure there is a non-empty default for '$gnulib_cache', and that it
1435# names an existing file.
1436require_gnulib_cache=func_require_gnulib_cache
1437func_require_gnulib_cache ()
1438{
1439    $debug_cmd
1440
1441    $require_macro_dir
1442
1443    test -n "$gnulib_cache" \
1444      || gnulib_cache=$macro_dir/gnulib-cache.m4
1445
1446    func_verbose "found '$gnulib_cache'"
1447
1448    require_gnulib_cache=:
1449}
1450
1451
1452# require_gnulib_copy_cmd
1453# -----------------------
1454# Only calculate the options for copying files with gnulib once.
1455require_gnulib_copy_cmd=func_require_gnulib_copy_cmd
1456func_require_gnulib_copy_cmd ()
1457{
1458    $debug_cmd
1459
1460    $require_gnulib_tool
1461    $require_gnulib_tool_base_options
1462
1463    gnulib_copy_cmd="$gnulib_tool $gnulib_tool_base_options --copy-file"
1464    $opt_copy || func_append gnulib_copy_cmd " --symlink"
1465    $opt_quiet || func_append gnulib_copy_cmd " --verbose"
1466
1467    require_gnulib_copy_cmd=:
1468}
1469
1470
1471# require_gnulib_merge_changelog
1472# ------------------------------
1473# See if we can use gnulib's git-merge-changelog merge driver.
1474require_gnulib_merge_changelog=func_require_gnulib_merge_changelog
1475func_require_gnulib_merge_changelog ()
1476{
1477    $debug_cmd
1478
1479    test -f ChangeLog && {
1480      $require_git
1481
1482      func_grep_q '^\(/\|\)ChangeLog$' .gitignore || test true = "$GIT" || {
1483        if $GIT config merge.merge-changelog.driver >/dev/null; then
1484          :
1485        elif (git-merge-changelog --version) >/dev/null 2>&1; then
1486          func_echo "initializing git-merge-changelog driver"
1487          $GIT config merge.merge-changelog.name 'GNU-style ChangeLog merge driver'
1488          $GIT config merge.merge-changelog.driver 'git-merge-changelog %O %A %B'
1489        else
1490          func_warning recommend \
1491              "Consider installing git-merge-changelog from gnulib."
1492        fi
1493      }
1494    }
1495
1496    require_gnulib_merge_changelog=:
1497}
1498
1499
1500# require_gnulib_mk
1501# -----------------
1502# Ensure gnulib_mk has a sensible value, extracted from 'gnulib-cache.m4'
1503# if possible, otherwise letting 'gnulib-tool' pick a default.
1504require_gnulib_mk=func_require_gnulib_mk
1505func_require_gnulib_mk ()
1506{
1507    $debug_cmd
1508
1509    $require_gnulib_cache
1510
1511    test -f "$gnulib_cache" && test -z "$gnulib_mk" && {
1512      func_extract_trace_first "gl_MAKEFILE_NAME" "$gnulib_cache"
1513      gnulib_mk=$func_extract_trace_first_result
1514
1515      test -n "$gnulib_mk" && func_verbose "gnulib_mk='$gnulib_mk'"
1516    }
1517
1518    require_gnulib_mk=:
1519}
1520
1521
1522# require_gnulib_name
1523# -------------------
1524# Ensure gnulib_name has a sensible value, extracted from 'gnulib-cache.m4'
1525# if possible, otherwise letting 'gnulib-tool' pick a default.
1526require_gnulib_name=func_require_gnulib_name
1527func_require_gnulib_name ()
1528{
1529    $debug_cmd
1530
1531    $require_gnulib_cache
1532
1533    test -f "$gnulib_cache" && test -z "$gnulib_name" && {
1534      func_extract_trace_first "gl_LIB" "$gnulib_cache"
1535      gnulib_name=$func_extract_trace_first_result
1536
1537      test -n "$gnulib_name" && func_verbose "gnulib_name='$gnulib_name'"
1538    }
1539
1540    require_gnulib_name=:
1541}
1542
1543
1544# require_gnulib_path
1545# require_gnulib_url
1546# -------------------
1547# Ensure 'gnulib_path' and 'gnulib_url' are set.
1548require_gnulib_path=func_require_dotgitmodules_parameters
1549require_gnulib_url=func_require_dotgitmodules_parameters
1550func_require_dotgitmodules_parameters ()
1551{
1552    $debug_cmd
1553
1554    $require_git
1555
1556    test true = "$GIT" && {
1557      # If we can't find git (or if the user specified '--skip-git'),
1558      # then use an existing gnulib directory specified with
1559      # '--gnulib-srcdir' if possible.
1560      test -n "$gnulib_path" \
1561          || test ! -x "$opt_gnulib_srcdir/gnulib-tool" \
1562          || gnulib_path=$opt_gnulib_srcdir
1563    }
1564
1565
1566    $require_dotgitmodules
1567
1568    test -f .gitmodules && {
1569      # Extract the parameters with sed, since git may be missing
1570      test -n "$gnulib_path" \
1571        || gnulib_path=`$SED -e '/^.submodule "gnulib".$/,${
1572                                   /[	 ]*path *= */{
1573			             s|[   ]*||g;s|^[^=]*=||;p
1574			           }
1575		                 }
1576				 d' .gitmodules |$SED 1q`
1577      test -n "$gnulib_url" \
1578        || gnulib_url=`$SED -e '/^.submodule "gnulib".$/,${
1579                                  /[	 ]*url *= */{
1580			            s|[   ]*||g;s|^[^=]*=||;p
1581			          }
1582		                }
1583				d' .gitmodules |$SED 1q`
1584
1585      func_verbose "gnulib_path='$gnulib_path'"
1586      func_verbose "gnulib_url='$gnulib_url'"
1587    }
1588
1589    require_gnulib_path=:
1590    require_gnulib_url=:
1591}
1592
1593
1594# require_gnulib_submodule
1595# ------------------------
1596# Ensure that there is a current gnulib submodule at '$gnulib_path'.
1597require_gnulib_submodule=func_require_gnulib_submodule
1598func_require_gnulib_submodule ()
1599{
1600    $debug_cmd
1601
1602    $require_git
1603
1604    if test true = "$GIT"; then
1605      func_warning recommend \
1606          "No 'git' found; imported gnulib modules may be outdated."
1607    else
1608      $require_gnulib_path
1609      $require_gnulib_url
1610
1611      if test -f .gitmodules && test -f "$gnulib_path/gnulib-tool"; then
1612        : All present and correct.
1613
1614      elif test -n "$opt_gnulib_srcdir"; then
1615        # Older git can't clone into an empty directory.
1616        rmdir "$gnulib_path" 2>/dev/null
1617        func_show_eval "$GIT clone --reference '$opt_gnulib_srcdir' \
1618                '$gnulib_url' '$gnulib_path'" \
1619            || func_fatal_error "Unable to fetch gnulib submodule."
1620
1621      # Without --gnulib-srcdir, and no existing checked out submodule, we
1622      # create a new shallow clone of the remote gnulib repository.
1623      else
1624        trap func_cleanup_gnulib 1 2 13 15
1625
1626        shallow=
1627        test -n "$gnulib_clone_since" && \
1628            $GIT clone -h 2>&1 |func_grep_q -- --shallow-since \
1629            && shallow="--shallow-since=$gnulib_clone_since"
1630
1631        func_show_eval "$GIT clone $shallow '$gnulib_url' '$gnulib_path'" \
1632          func_cleanup_gnulib
1633
1634	# FIXME: Solaris /bin/sh will try to execute '-' if any of
1635	#        these signals are caught after this.
1636        trap - 1 2 13 15
1637      fi
1638
1639      # Make sure we've checked out the correct revision of gnulib.
1640      func_show_eval "$GIT submodule init -- $gnulib_path" \
1641          && func_show_eval "$GIT submodule update -- $gnulib_path" \
1642          ||  func_fatal_error "Unable to update gnulib submodule."
1643    fi
1644
1645    require_gnulib_submodule=:
1646}
1647
1648
1649# require_gnulib_tool
1650# -------------------
1651# Ensure that '$gnulib_tool' is set, and points to an executable file,
1652# or else fall back to using the binary 'true' if the main gnulib
1653# files appear to have been imported already.
1654require_gnulib_tool=func_require_gnulib_tool
1655func_require_gnulib_tool ()
1656{
1657    $debug_cmd
1658
1659    test true = "$gnulib_tool" || {
1660      $require_gnulib_submodule
1661      $require_gnulib_path
1662
1663      test -n "$gnulib_tool" \
1664        || gnulib_tool=$gnulib_path/gnulib-tool
1665
1666      test -x "$gnulib_tool" || {
1667        gnulib_tool=true
1668        func_warning recommend \
1669            "No 'gnulib-tool' found; gnulib modules may be missing."
1670      }
1671
1672      test true = "$gnulib_tool" \
1673          || func_verbose "found '$gnulib_tool'"
1674    }
1675
1676    require_gnulib_tool=:
1677}
1678
1679
1680# require_gnulib_tool_base_options
1681# --------------------------------
1682# Ensure that '$gnulib_tool_base_options' contains all the base options
1683# required according to user configuration from bootstrap.conf.
1684require_gnulib_tool_base_options=func_require_gnulib_tool_base_options
1685func_require_gnulib_tool_base_options ()
1686{
1687    $debug_cmd
1688
1689    $require_gnulib_tool
1690
1691    gnulib_tool_base_options=
1692
1693    test true = "$gnulib_tool" || {
1694      # 'gnulib_modules' and others are maintained in 'bootstrap.conf':
1695      # Use 'gnulib --import' to fetch gnulib modules.
1696      $require_build_aux
1697      test -n "$build_aux" \
1698          && func_append_uniq gnulib_tool_base_options " --aux-dir=$build_aux"
1699      $require_macro_dir
1700      test -n "$macro_dir" \
1701          && func_append_uniq gnulib_tool_base_options " --m4-base=$macro_dir"
1702      $require_doc_base
1703      test -n "$doc_base" \
1704          && func_append_uniq gnulib_tool_base_options " --doc-base=$doc_base"
1705      $require_gnulib_name
1706      test -n "$gnulib_name" \
1707          && func_append_uniq gnulib_tool_base_options " --lib=$gnulib_name"
1708      $require_local_gl_path
1709      test -n "$local_gl_path" && {
1710        eval "set dummy $local_gl_path_quoted" ; shift
1711        for _G_dir
1712        do
1713          func_append_uniq gnulib_tool_base_options " --local-dir=$_G_dir"
1714        done
1715      }
1716      $require_source_base
1717      test -n "$source_base" \
1718          && func_append_uniq gnulib_tool_base_options " --source-base=$source_base"
1719    }
1720
1721    require_gnulib_tool_base_options=:
1722}
1723
1724
1725# require_libtoolize
1726# ------------------
1727# Skip libtoolize if it's not needed.
1728require_libtoolize=func_require_libtoolize
1729func_require_libtoolize ()
1730{
1731    $debug_cmd
1732
1733    # Unless we're not searching for libtool use by this package, set
1734    # LIBTOOLIZE to true if none of 'LT_INIT', 'AC_PROG_LIBTOOL' and
1735    # 'AM_PROG_LIBTOOL' are used in configure.
1736    test true = "$LIBTOOLIZE" || {
1737      func_extract_trace LT_INIT
1738      test -n "$func_extract_trace_result" || func_extract_trace AC_PROG_LIBTOOL
1739      test -n "$func_extract_trace_result" || func_extract_trace AM_PROG_LIBTOOL
1740      test -n "$func_extract_trace_result" || LIBTOOLIZE=true
1741    }
1742
1743    test -n "$LIBTOOLIZE" || {
1744      # Find libtoolize, named glibtoolize in Mac Ports, but prefer
1745      # user-installed libtoolize to ancient glibtoolize shipped by
1746      # Apple with Mac OS X when Mac Ports is not installed.
1747      func_find_tool LIBTOOLIZE libtoolize glibtoolize
1748    }
1749
1750    test -n "$LIBTOOLIZE" || func_fatal_error "\
1751Please install GNU Libtool, or 'export LIBTOOLIZE=/path/to/libtoolize'."
1752
1753    func_verbose "export LIBTOOLIZE='$LIBTOOLIZE'"
1754
1755    # Make sure the search result is visible to subshells
1756    export LIBTOOLIZE
1757
1758    require_libtoolize=:
1759}
1760
1761
1762# require_local_gl_path
1763# ---------------------
1764# Ensure local_gl_path has a sensible value, extracted from 'gnulib-cache.m4' if
1765# possible, otherwise letting 'gnulib-tool' pick a default.
1766require_local_gl_path=func_require_local_gl_path
1767func_require_local_gl_path ()
1768{
1769    $debug_cmd
1770
1771    $require_gnulib_cache
1772
1773    # Compat with older bootstrap versions.
1774    test -n "$local_gl_dir" && {
1775      func_warning settings "\
1776Please use 'local_gl_path' instead of 'local_gl_dir' in your
1777'bootstrap.conf' file."
1778      local_gl_path=$local_gl_dir
1779      local_gl_dir=
1780    }
1781
1782    test -f "$gnulib_cache" && test -z "$local_gl_path" && {
1783      func_extract_trace_first "gl_LOCAL_DIR" "$gnulib_cache"
1784      local_gl_path=$func_extract_trace_first_result
1785      test -n "$local_gl_path" && func_verbose "local_gl_path='$local_gl_path'"
1786    }
1787
1788    test -z "$local_gl_path_quoted" && test -n "$local_gl_path" && {
1789      save_IFS=$IFS
1790      set dummy
1791      # Don't use PATH_SEPARATOR here, gnulib must be fixed to store only ':' as
1792      # path separator into gnulib-cache.m4 (consistency reasons among systems).
1793      IFS=:
1794      for _G_dir in $local_gl_path
1795      do
1796        set "$@" "$_G_dir"
1797      done
1798      shift
1799      IFS=$save_IFS
1800      func_quote eval "$@"
1801      local_gl_path_quoted=$func_quote_result
1802    }
1803
1804    require_local_gl_path=:
1805}
1806
1807
1808# require_macro_dir
1809# -----------------
1810# Ensure that '$macro_dir' is set, and if it doesn't already point to an
1811# existing directory, create one.
1812require_macro_dir=func_require_macro_dir
1813func_require_macro_dir ()
1814{
1815    $debug_cmd
1816
1817    # Sometimes this is stored in 'configure.ac'.
1818    test -n "$macro_dir" || {
1819      # AC_CONFIG_MACRO_DIRS takes a space delimited list of directories,
1820      # but we only care about the first one in bootstrap.
1821      func_extract_trace_first AC_CONFIG_MACRO_DIRS
1822      macro_dir=`expr "x$func_extract_trace_first_result" : 'x\([^	 ]*\)'`
1823    }
1824    test -n "$macro_dir" || {
1825      func_extract_trace_first AC_CONFIG_MACRO_DIR
1826      macro_dir=$func_extract_trace_first_result
1827    }
1828
1829    # Otherwise we might find it in 'Makefile.am'.
1830    test -n "$macro_dir" || {
1831      $require_aclocal_amflags
1832
1833      # Take the argument following the first '-I', if any.
1834      _G_minus_I_seen=false
1835      for _G_arg in $aclocal_amflags; do
1836        case $_G_minus_I_seen,$_G_arg in
1837          :,*)   macro_dir=$_G_arg; break ;;
1838          *,-I)  _G_minus_I_seen=: ;;
1839          *,-I*) macro_dir=`expr x$_G_arg : 'x-I\(.*\)$'`; break ;;
1840        esac
1841      done
1842    }
1843
1844    func_verbose "macro_dir='$macro_dir'"
1845
1846    func_check_configuration macro_dir \
1847        "AC_CONFIG_MACRO_DIRS([name of a directory for configure m4 files])"
1848
1849    $require_vc_ignore_files
1850
1851    # If the macro_dir directory doesn't exist, create it now, and mark it
1852    # as ignored for the VCS.
1853    if test ! -d "$macro_dir"; then
1854      mkdir "$macro_dir" || func_permissions_error "$macro_dir"
1855
1856      test -n "$vc_ignore_files" \
1857        || func_insert_if_absent "$macro_dir" $vc_ignore_files
1858    fi
1859
1860    require_macro_dir=:
1861}
1862
1863
1864# require_makefile_am
1865# -------------------
1866# Ensure there is a 'Makefile.am' in the current directory.
1867require_makefile_am=func_require_makefile_am
1868func_require_makefile_am ()
1869{
1870    $debug_cmd
1871
1872    test -n "$makefile_am" \
1873      || makefile_am=Makefile.am
1874
1875    <"$makefile_am"
1876
1877    func_verbose "found '$makefile_am'"
1878
1879    require_makefile_am=:
1880}
1881
1882
1883# require_package
1884# ---------------
1885# Ensure that '$package' contains a sensible default value.
1886require_package=func_require_package
1887func_require_package ()
1888{
1889    $debug_cmd
1890
1891    test -n "$package" || {
1892      $require_package_name
1893
1894      package=`echo "$package_name" \
1895        |$SED -e 's/GNU //' \
1896	      -e 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'`
1897    }
1898
1899    func_verbose "package='$package'"
1900
1901    require_package=:
1902}
1903
1904
1905# require_package_bugreport
1906# -------------------------
1907# Ensure that this has a sensible value, extracted from 'configure.ac'
1908# if appropriate (and possible!).
1909require_package_bugreport=func_require_package_bugreport
1910func_require_package_bugreport ()
1911{
1912    $debug_cmd
1913
1914    func_extract_trace AC_INIT
1915
1916    save_ifs=$IFS
1917    IFS=:
1918    set dummy $func_extract_trace_result
1919    IFS=$save_ifs
1920    shift
1921
1922    test -n "$package_bugreport" || package_bugreport=$3
1923    func_check_configuration package_bugreport \
1924      "AC_INIT([$package_name], [$package_version], [bug-$package@gnu.org])"
1925    func_verbose "package_bugreport='$package_bugreport'"
1926
1927    require_package_bugreport=:
1928}
1929
1930
1931# require_package_name
1932# --------------------
1933# Ensure that this has a sensible value, extracted from 'configure.ac'
1934# if appropriate (and possible!).
1935require_package_name=func_require_package_name
1936func_require_package_name ()
1937{
1938    $debug_cmd
1939
1940    func_extract_trace AC_INIT
1941
1942    save_ifs=$IFS
1943    IFS=:
1944    set dummy $func_extract_trace_result
1945    IFS=$save_ifs
1946    shift
1947
1948    test -n "$package_name" || package_name=$1
1949    func_check_configuration package_name \
1950      "AC_INIT([name of your package], [package version number])"
1951    func_verbose "package_name='$package_name'"
1952
1953    require_package_name=:
1954}
1955
1956
1957# require_package_version
1958# -----------------------
1959# Ensure that this has a sensible value, extracted from 'configure.ac'
1960# if appropriate (and possible!).  While we might have set all the
1961# parameters extracted from AC_INIT at once, 'package_version' in
1962# particular is not necessarily available as early as the others, since
1963# 'git-version-gen' is often involved, and until then we can't rely on
1964# getting a correct version number from an AC_INIT extraction.
1965require_package_version=func_require_package_version
1966func_require_package_version ()
1967{
1968    $debug_cmd
1969
1970    func_extract_trace AC_INIT
1971
1972    save_ifs=$IFS
1973    IFS=:
1974    set dummy $func_extract_trace_result
1975    IFS=$save_ifs
1976    shift
1977
1978    test -n "$package_version" || package_version=$2
1979    test -n "$package_version" || {
1980      # The embedded echo is to squash whitespace before globbing.
1981      case " "`echo $gnulib_modules`" " in
1982	*" git-version-gen "*)
1983	  func_fatal_error "\
1984cannot \$require_package_version in bootstrap.conf before
1985func_gnulib_tool has installed the 'git-version-gen' script."
1986	  ;;
1987	*)
1988          func_check_configuration package_version \
1989            "AC_INIT([name of your package], [package version number])"
1990	  ;;
1991      esac
1992    }
1993    func_verbose "package_version='$package_version'"
1994
1995    require_package_version=:
1996}
1997
1998
1999# require_patch
2000# -------------
2001# Find patch, according to the PATCH environment variable, or else
2002# searching the user's PATH.
2003require_patch=func_require_patch
2004func_require_patch ()
2005{
2006    $debug_cmd
2007
2008    test -n "$PATCH" || {
2009      # Find a patch program, preferring gpatch, which is usually better
2010      # than the vendor patch.
2011      func_find_tool PATCH gpatch patch
2012    }
2013
2014    test -n "$PATCH" || func_fatal_error "\
2015Please install GNU Patch, or 'export PATCH=/path/to/gnu/patch'."
2016
2017    func_verbose "export PATCH='$PATCH'"
2018
2019    # Make sure the search result is visible to subshells
2020    export PATCH
2021
2022    require_patch=:
2023}
2024
2025
2026# require_source_base
2027# -------------------
2028# Ensure that source_base has a sensible value, extracted from
2029# 'gnulib-cache.m4' if possible.
2030require_source_base=func_require_source_base
2031func_require_source_base ()
2032{
2033    $debug_cmd
2034
2035    $require_gnulib_cache
2036
2037    test -f "$gnulib_cache" && test -z "$source_base" && {
2038      func_extract_trace_first "gl_SOURCE_BASE" "$gnulib_cache"
2039
2040      source_base=$func_extract_trace_first_result
2041
2042      func_verbose "source_base='$source_base'"
2043    }
2044
2045    require_source_base=:
2046}
2047
2048
2049# require_vc_ignore_files
2050# -----------------------
2051# Ensure that '$vc_ignore' has been processed to list VCS ignore files
2052# in '$vc_ignore_files'
2053require_vc_ignore_files=func_require_vc_ignore_files
2054func_require_vc_ignore_files ()
2055{
2056    $debug_cmd
2057
2058    test -n "$vc_ignore" || vc_ignore=auto
2059
2060    if test auto = "$vc_ignore" && test -z "$vc_ignore_files"; then
2061      vc_ignore_files=
2062      test -d .git && vc_ignore_files=.gitignore
2063      test -d CVS && vc_ignore_files="$vc_ignore_files .cvsignore"
2064    else
2065      vc_ignore_files=$vc_ignore
2066    fi
2067
2068    func_verbose "vc_ignore_files='$vc_ignore_files'"
2069
2070    require_vc_ignore_files=:
2071}
2072
2073
2074## ----------------- ##
2075## Helper functions. ##
2076## ----------------- ##
2077
2078# This section contains the helper functions used by the rest of 'bootstrap'.
2079
2080# func_len STRING
2081# ---------------
2082# STRING may not start with a hyphen.
2083if (eval 'x=123; test x${#x} = "x3"') 2>/dev/null
2084then
2085  # This is an XSI compatible shell, allowing a faster implementation...
2086  eval 'func_len ()
2087  {
2088    $debug_cmd
2089
2090    func_len_result=${#1}
2091  }'
2092else
2093  # ...otherwise fall back to using expr, which is often a shell builtin.
2094  func_len ()
2095  {
2096    $debug_cmd
2097
2098    func_len_result=`expr "$1" : ".*" 2>/dev/null || echo 0`
2099  }
2100fi
2101
2102
2103# func_cmp_s FILE1 FILE2
2104# ----------------------
2105# Return non-zero exit status unless FILE1 and FILE2 are identical, without
2106# any output at all, even error messages.
2107func_cmp_s ()
2108{
2109    $debug_cmd
2110
2111    # This function relies on non-zero exit status, which will cause the
2112    # program to exit when running in 'set -e' mode.
2113    $CMP "$@" >/dev/null 2>&1
2114}
2115
2116
2117# func_grep_q EXPRESSION [FILENAME..]
2118# -----------------------------------
2119# Check whether EXPRESSION matches any line of any listed FILENAME,
2120# without any output at all, even error messages.
2121func_grep_q ()
2122{
2123    $debug_cmd
2124
2125    # This function relies on non-zero exit status, which will cause the
2126    # program to exit when running in 'set -e' mode.
2127    $GREP "$@" >/dev/null 2>&1
2128}
2129
2130
2131# func_ifcontains LIST MEMBER YES-CMD [NO-CMD]
2132# --------------------------------------------
2133# If whitespace-separated LIST contains MEMBER then execute YES-CMD,
2134# otherwise if NO-CMD was given, execute that.
2135func_ifcontains ()
2136{
2137    $debug_cmd
2138
2139    _G_wslist=$1
2140    _G_member=$2
2141    _G_yes_cmd=$3
2142    _G_no_cmd=${4-":"}
2143
2144    _G_found=false
2145    for _G_item in $_G_wslist; do
2146      test "x$_G_item" = "x$_G_member" && {
2147        _G_found=:
2148	break
2149      }
2150    done
2151    if $_G_found; then
2152      eval "$_G_yes_cmd"
2153      _G_status=$?
2154    else
2155      eval "$_G_no_cmd"
2156      _G_status=$?
2157    fi
2158
2159    test 0 -eq "$_G_status" || exit $_G_status
2160}
2161
2162
2163# func_strpad STR WIDTH CHAR
2164# --------------------------
2165# Trim STR, or pad with CHAR to force a total length of WIDTH.
2166func_strpad ()
2167{
2168    $debug_cmd
2169
2170    _G_width=`expr "$2" - 1`
2171    func_strpad_result=`$ECHO "$1" |$SED '
2172        :a
2173        s|^.\{0,'"$_G_width"'\}$|&'"$3"'|
2174        ta
2175    '`
2176}
2177
2178
2179# func_strrpad STR WIDTH CHAR
2180# ---------------------------
2181# Trim STR, or right-justify-pad with CHAR to force a total length of
2182# WIDTH.
2183func_strrpad ()
2184{
2185    $debug_cmd
2186
2187    _G_width=`expr "$2" - 1`
2188    func_strrpad_result=`$ECHO "$1" |$SED '
2189        :a
2190        s|^.\{0,'"$_G_width"'\}$|'"$3"'&|
2191        ta
2192    '`
2193}
2194
2195
2196# func_strrow INDENT FIELD WIDTH [FIELDn WIDTHn]...
2197# -------------------------------------------------
2198# Return a string containing each FIELD left justified to WIDTH, with
2199# the whole thing indented by INDENT spaces.  This function is used to
2200# render one row of aligned columns for a table by func_strtable().
2201func_strrow ()
2202{
2203    $debug_cmd
2204
2205    func_strrow_linelen=$1; shift
2206
2207    _G_row=
2208    while test $# -gt 0; do
2209      func_strrow_linelen=`expr $func_strrow_linelen + $2`
2210      func_strpad "$1" $2 " "
2211      func_append _G_row "$func_strpad_result"
2212      shift; shift
2213    done
2214
2215    func_strrpad "$_G_row" $func_strrow_linelen " "
2216    func_strrow_result=$func_strrpad_result
2217}
2218
2219
2220# func_strtable INDENT WIDTH1...WIDTHn HEADER1...HEADERn FIELD1...FIELDn
2221# ----------------------------------------------------------------------
2222# Generate a string of newline-separated rows arranged in lined-up
2223# columns of the given WIDTHs, with the entire table indented by INDENT
2224# spaces.  The number of columns is determined by the number of integer
2225# valued WIDTH arguments following INDENT.  The next set (i.e. a number
2226# of arguments equal to the number of WIDTH arguments) of fields are
2227# treated as the table's column HEADERs, and are separated from the
2228# remainder of the table by an indented row of '-' characters. Remaining
2229# arguments are each aligned below the next available header, wrapping
2230# to a new row as necessary.  Finally another row of '-' characters is
2231# added to mark the end of the table.
2232#
2233# For example an unindented 3 column table with 2 rows of data would be
2234# generated by this call:
2235#
2236#    func_strtable 3 20 10 25 \
2237#        Header1 Header2 Header3 \
2238#        Row1Col1 Row1Col2 Row1Col3 \
2239#        Row2Col1 Row2Col2 Row2Col3
2240#
2241# returning the following string:
2242#
2243# "   Header1             Header2   Header3
2244#     -------------------------------------------------------
2245#     Row1Col1            Row1Col2  Row1Col3
2246#     Row2Col1            Row2Col2  Row2Col3
2247#     -------------------------------------------------------"
2248func_strtable ()
2249{
2250    $debug_cmd
2251
2252    # Save the indent value, we'll need it for each row we render.
2253    _G_indent=$1; shift
2254
2255    # Collect remaining numeric args into a list for reuse between
2256    # members of each row when we call func_strrow later.
2257    _G_widths=$1; shift
2258    while test 0 -lt `expr "$1" : '[1-9][0-9]*$'`; do
2259      func_append _G_widths " $1"; shift
2260    done
2261
2262    # Extract the same number of positional parameters as there are
2263    # width elements - we'll do the header rows separately so that
2264    # we can insert a divider line.
2265    _G_header=$_G_indent
2266    for _G_width in $_G_widths; do
2267      func_append _G_header " $1 $_G_width"; shift
2268    done
2269    func_strrow $_G_header
2270
2271    # Strip off the indent, and make a divider with '-' chars, then
2272    # reindent.
2273    _G_divider=`$ECHO "$func_strrow_result" \
2274        |$SED 's|[^ ]|-|g
2275            :a
2276            s|- |--|g
2277            ta
2278        '`
2279
2280    # Append the header and divider to the running result.
2281    func_append func_strtable_result "\
2282$func_strrow_result
2283$_G_divider
2284"
2285
2286    # The remaining rows are zipped between the width values we
2287    # unwound earlier just like the header row above.
2288    while test $# -gt 0; do
2289      _G_row=$_G_indent
2290      for _G_width in $_G_widths; do
2291        func_append _G_row " $1 $_G_width"; shift
2292      done
2293      func_strrow $_G_row
2294      func_append func_strtable_result "\
2295$func_strrow_result
2296"
2297    done
2298
2299    # Mark the end of the table with a final divider line.
2300    func_append func_strtable_result "$_G_divider"
2301}
2302
2303
2304# func_internal_error ARG...
2305# --------------------------
2306# Echo program name prefixed message to standard error, and exit.
2307func_internal_error ()
2308{
2309    func_fatal_error "\
2310INTERNAL: " ${1+"$@"} "
2311          Please report this bug to 'bug-gnulib@gnu.org'
2312          in as much detail as possible."
2313}
2314
2315
2316# func_permissions_error FILE-OR-DIRECTORY
2317# ----------------------------------------
2318# Echo program name prefixed permissions error message to standard
2319# error, and exit.
2320func_permissions_error ()
2321{
2322    $debug_cmd
2323
2324    func_fatal_error "Failed to create '$1', check permissions."
2325}
2326
2327
2328# func_show_eval CMD [FAIL_EXP]
2329# -----------------------------
2330# Unless opt_silent is true, then output CMD.  Then, if opt_dryrun is
2331# not true, evaluate CMD.  If the evaluation of CMD fails, and FAIL_EXP
2332# is given, then evaluate it.
2333func_show_eval ()
2334{
2335    $debug_cmd
2336
2337    $require_term_colors
2338
2339    _G_cmd=$1
2340    _G_fail_exp=${2-':'}
2341
2342    ${opt_silent-'false'} || {
2343      func_quote eval $_G_cmd
2344      eval func_truncate_cmd $func_quote_result
2345      func_echo "running: $tc_bold$func_truncate_cmd_result$tc_reset"
2346    }
2347
2348    ${opt_dry_run-'false'} || {
2349      eval "$_G_cmd"
2350      _G_status=$?
2351      test 0 -eq "$_G_status" || eval "(exit $_G_status); $_G_fail_exp"
2352    }
2353}
2354
2355
2356# func_truncate_cmd CMD [ARG]...
2357# ------------------------------
2358# For unreasonably long commands (such as a gnulib-tool invocation with
2359# the full module list for import), truncate CMD after the second non-
2360# option ARG.
2361func_truncate_cmd ()
2362{
2363    $debug_cmd
2364
2365    _G_last_arg_opt_p=false
2366    func_truncate_cmd_result=
2367
2368    set dummy "$@"; shift
2369
2370    while test $# -gt 0; do
2371      _G_opt=$1; shift
2372
2373      test -n "$func_truncate_cmd_result" \
2374          && func_append func_truncate_cmd_result ' '
2375      func_append func_truncate_cmd_result "$_G_opt"
2376
2377      func_len "x$func_truncate_cmd_result"
2378
2379      case $_G_opt in
2380        -*) _G_last_arg_opt_p=: ;;
2381        *)  $_G_last_arg_opt_p \
2382                || test "$min_cmd_len" -gt "$func_len_result" \
2383                || break
2384            _G_last_arg_opt_p=false
2385            ;;
2386      esac
2387    done
2388
2389    test $# -gt 0 && func_append func_truncate_cmd_result "..."
2390}
2391
2392
2393# func_gitignore_entries FILE...
2394# ------------------------------
2395# Strip blank and comment lines to leave significant entries.
2396func_gitignore_entries ()
2397{
2398    $debug_cmd
2399
2400    $SED -e '/^#/d' -e '/^$/d' "$@"
2401}
2402
2403
2404# func_insert_if_absent STR FILE...
2405# ---------------------------------
2406# If $STR is not already on a line by itself in $FILE, insert it, at the
2407# start.  Entries are inserted at the start of the ignore list to ensure
2408# existing entries starting with ! are not overridden.  Such entries
2409# support whilelisting exceptions after a more generic blacklist pattern.
2410# sorting the new contents of the file and replacing $FILE with the result.
2411func_insert_if_absent ()
2412{
2413    $debug_cmd
2414
2415    str=$1
2416    shift
2417
2418    for file
2419    do
2420      test -f "$file" || touch "$file"
2421
2422      duplicate_entries=`func_gitignore_entries "$file" |sort |uniq -d`
2423      test -n "$duplicate_entries" \
2424          && func_error "duplicate entries in $file: " $duplicate_entries
2425
2426      func_grep_q "^$str\$" "$file" \
2427          || func_verbose "inserting '$str' into '$file'"
2428
2429      linesold=`func_gitignore_entries "$file" |wc -l`
2430      linesnew=`{ $ECHO "$str"; cat "$file"; } \
2431                |func_gitignore_entries |sort -u |wc -l`
2432      test "$linesold" -eq "$linesnew" \
2433        || { $SED "1i\\$nl$str$nl" "$file" >"$file"T && mv "$file"T "$file"; } \
2434        || func_permissions_error "$file"
2435    done
2436}
2437
2438
2439# func_get_version APP
2440# --------------------
2441# echo the version number (if any) of APP, which is looked up along your
2442# PATH.
2443func_get_version ()
2444{
2445    $debug_cmd
2446
2447    _G_app=$1
2448
2449    # Rather than uncomment the sed script in-situ, strip the comments
2450    # programatically before passing the result to $SED for evaluation.
2451    sed_get_version=`$ECHO '# extract version within line
2452          s|.*[v ]\{1,\}\([0-9]\{1,\}\.[.a-z0-9-]*\).*|\1|
2453          t done
2454
2455          # extract version at start of line
2456          s|^\([0-9]\{1,\}\.[.a-z0-9-]*\).*|\1|
2457          t done
2458
2459          d
2460
2461          :done
2462          # the following essentially does s|5.005|5.5|
2463          s|\.0*\([1-9]\)|.\1|g
2464          p
2465          q' \
2466    |$SED '/^[	 ]*#.*$/d'`
2467
2468    func_tool_version_output $_G_app >/dev/null
2469    _G_status=$?
2470
2471    test 0 -ne "$_G_status" \
2472      || $_G_app --version 2>&1 |$SED -n "$sed_get_version"
2473
2474    (exit $_G_status)
2475}
2476
2477
2478# func_check_tool APP
2479# -------------------
2480# Search PATH for an executable at APP.
2481func_check_tool ()
2482{
2483    $debug_cmd
2484
2485    func_check_tool_result=
2486
2487    case $1 in
2488    *[\\/]*)
2489      test -x "$1" && func_check_tool_result=$1
2490      ;;
2491    *)
2492      save_IFS=$IFS
2493      IFS=${PATH_SEPARATOR-:}
2494      for _G_check_tool_path in $PATH; do
2495        IFS=$save_IFS
2496	if test -x "$_G_check_tool_path/$1"; then
2497	  func_check_tool_result=$_G_check_tool_path/$1
2498	  break
2499	fi
2500      done
2501      IFS=$save_IFS
2502      ;;
2503    esac
2504}
2505
2506
2507# func_check_versions APP1 VER1 URL1 ...[APPN VERN URLN]
2508# ------------------------------------------------------
2509func_check_versions ()
2510{
2511    $debug_cmd
2512
2513    func_check_versions_result=:
2514
2515    while test $# -gt 0; do
2516      _G_app=$1; shift
2517      _G_reqver=$1; shift
2518      _G_url=$1; shift
2519
2520      # Diagnose bad buildreq formatting.
2521      case $_G_url in
2522      [a-z]*://*) ;; # looks like a url
2523      *) func_fatal_error "\
2524'$_G_url' from the buildreq table in
2525'bootstrap.conf' does not look like the URL for downloading
2526$_G_app. Please ensure that buildreq is a strict newline
2527delimited list of triples; 'program min-version url'."
2528        ;;
2529      esac
2530
2531      # Honor $APP variables ($TAR, $AUTOCONF, etc.)
2532      _G_appvar=`echo $_G_app |tr '[a-z]' '[A-Z]'`
2533      test TAR = "$_G_appvar" && _G_appvar=AMTAR
2534      eval "_G_app=\${$_G_appvar-$_G_app}"
2535
2536      # Fail if no version specified, but the program can't be found.
2537      if test x- = "x$_G_reqver"; then
2538        func_check_tool $_G_app
2539	if test -z "$func_check_tool_result"; then
2540	  func_error "Prerequisite '$_G_app' not not found. Please install it, or
2541'export $_G_appvar=/path/to/$_G_app'."
2542          func_check_versions_result=false
2543	else
2544	  func_verbose "found '$func_check_tool_result' for $_G_appvar."
2545	fi
2546      else
2547        _G_instver=`func_get_version $_G_app`
2548
2549        # Fail if --version didn't work.
2550        if test -z "$_G_instver"; then
2551          func_error "Prerequisite '$_G_app' not found. Please install it, or
2552'export $_G_appvar=/path/to/$_G_app'."
2553          func_check_versions_result=false
2554
2555        # Fail if a newer version than what we have is required.
2556        else
2557          func_verbose "found '$_G_app' version $_G_instver."
2558
2559	  case $_G_reqver in
2560            =*)
2561              # If $buildreq version starts with '=', version must
2562	      # match the installed program exactly.
2563	      test "x$_G_reqver" = "x=$_G_instver" || {
2564	        func_error "\
2565  '$_G_app' version == $_G_instver is too old
2566  'exactly $_G_app-$_G_reqver is required"
2567                func_check_versions_result=false
2568              }
2569	      ;;
2570	    *)
2571              # Otherwise, anything that is not older is a match.
2572              func_lt_ver "$_G_reqver" "$_G_instver" || {
2573                func_error "\
2574  '$_G_app' version == $_G_instver is too old
2575  '$_G_app' version >= $_G_reqver is required"
2576            func_check_versions_result=false
2577              }
2578	      ;;
2579	  esac
2580        fi
2581      fi
2582    done
2583}
2584
2585
2586# func_cleanup_gnulib
2587# -------------------
2588# Recursively delete everything below the path in the global variable
2589# GNULIB_PATH.
2590func_cleanup_gnulib ()
2591{
2592    $debug_cmd
2593
2594    _G_status=$?
2595    $RM -fr "$gnulib_path"
2596    exit $_G_status
2597}
2598
2599
2600# func_download_po_files SUBDIR DOMAIN
2601# ------------------------------------
2602func_download_po_files ()
2603{
2604    $debug_cmd
2605
2606    func_echo "getting translations into $1 for $2..."
2607    _G_cmd=`printf "$po_download_command_format" "$2" "$1"`
2608    eval "$_G_cmd"
2609}
2610
2611
2612# func_update_po_files PO_DIR DOMAIN
2613# ----------------------------------
2614# Mirror .po files to $po_dir/.reference and copy only the new
2615# or modified ones into $po_dir.  Also update $po_dir/LINGUAS.
2616# Note po files that exist locally only are left in $po_dir but will
2617# not be included in LINGUAS and hence will not be distributed.
2618func_update_po_files ()
2619{
2620    $debug_cmd
2621
2622    # Directory containing primary .po files.
2623    # Overwrite them only when we're sure a .po file is new.
2624    _G_po_dir=$1
2625    _G_domain=$2
2626
2627    # Mirror *.po files into this dir.
2628    # Usually contains *.s1 checksum files.
2629    _G_ref_po_dir=$_G_po_dir/.reference
2630
2631    test -d "$_G_ref_po_dir" || mkdir $_G_ref_po_dir || return
2632    func_download_po_files $_G_ref_po_dir $_G_domain \
2633      && ls "$_G_ref_po_dir"/*.po 2>/dev/null \
2634         |$SED -e 's|.*/||' -e 's|\.po$||' > "$_G_po_dir/LINGUAS" || return
2635
2636    # Find sha1sum, named gsha1sum on MacPorts, and shasum on MacOS 10.6+.
2637    func_find_tool SHA1SUM sha1sum gsha1sum shasum sha1
2638
2639    test -n "$SHA1SUM" || func_fatal_error "\
2640Please install GNU Coreutils, or 'export SHA1SUM=/path/to/sha1sum'."
2641
2642    _G_langs=`cd $_G_ref_po_dir && echo *.po|$SED 's|\.po||g'`
2643    test '*' = "$_G_langs" && _G_langs=x
2644    for _G_po in $_G_langs; do
2645      case $_G_po in x) continue;; esac
2646      _G_new_po=$_G_ref_po_dir/$_G_po.po
2647      _G_cksum_file=$_G_ref_po_dir/$_G_po.s1
2648      if ! test -f "$_G_cksum_file" ||
2649          ! test -f "$_G_po_dir/$_G_po.po" ||
2650          ! $SHA1SUM -c "$_G_cksum_file" \
2651              < "$_G_new_po" > /dev/null; then
2652        echo "updated $_G_po_dir/$_G_po.po..."
2653        cp "$_G_new_po" "$_G_po_dir/$_G_po.po" \
2654          && $SHA1SUM < "$_G_new_po" > "$_G_cksum_file" || return
2655      fi
2656    done
2657}
2658
2659
2660
2661## --------------- ##
2662## Option parsing. ##
2663## --------------- ##
2664
2665# Hook in the functions to make sure our own options are parsed during
2666# the option parsing loop.
2667
2668usage='$progpath [OPTION]...'
2669
2670# Short help message in response to '-h'.  Add to this in 'bootstrap.conf'
2671# if you accept any additional options.
2672usage_message="Common Bootstrap Options:
2673   -c, --copy         copy files instead of creating symbolic links.
2674       --debug        enable verbose shell tracing
2675   -n, --dry-run      print commands rather than running them
2676   -f, --force        attempt to bootstrap even if the sources seem not
2677                      to have been checked out.
2678       --gnulib-srcdir=DIRNAME
2679                      specify a local directory where gnulib sources
2680                      reside. Use this if you already have the gnulib
2681                      sources on your machine, and don't want to waste
2682                      your bandwidth downloading them again.  Defaults to
2683                      \$GNULIB_SRCDIR.
2684       --no-warnings  equivalent to '-Wnone'
2685       --skip-git     do not fetch files from remote repositories
2686       --skip-po      do not download po files.
2687   -v, --verbose      verbosely report processing
2688       --version      print version information and exit
2689   -W, --warnings=CATEGORY
2690                      report the warnings falling in CATEGORY [all]
2691   -h, --help         print short or long help message and exit
2692"
2693
2694# Additional text appended to 'usage_message' in response to '--help'.
2695long_help_message=$long_help_message"
2696       'recommend'    show warnings about missing recommended packages
2697       'settings'     show warnings about missing '$progname.conf' settings
2698       'upgrade'      show warnings about out-dated files
2699
2700If the file '$progname.conf' exists in the same directory as this
2701script, its contents are read as shell variables to configure the
2702bootstrap.
2703
2704For build prerequisites, environment variables like \$AUTOCONF and
2705\$AMTAR are honored.
2706
2707Running without arguments will suffice in most cases.
2708"
2709
2710# Warning categories used by 'bootstrap', append others if you use them
2711# in your 'bootstrap.conf'.
2712warning_categories='recommend settings upgrade'
2713
2714
2715# bootstrap_options_prep [ARG]...
2716# -------------------------------
2717# Preparation for options parsed by Bootstrap.
2718bootstrap_options_prep ()
2719{
2720    $debug_cmd
2721
2722    # Option defaults:
2723    opt_copy=${copy-'false'}
2724    opt_dry_run=false
2725    opt_force=false
2726    opt_gnulib_srcdir=$GNULIB_SRCDIR
2727    opt_skip_git=false
2728    opt_skip_po=false
2729
2730    # Pass back the list of options we consumed.
2731    func_quote eval ${1+"$@"}
2732    bootstrap_options_prep_result=$func_quote_result
2733}
2734func_add_hook func_options_prep bootstrap_options_prep
2735
2736
2737# bootstrap_parse_options [ARG]...
2738# --------------------------------
2739# Provide handling for Bootstrap specific options.
2740bootstrap_parse_options ()
2741{
2742    $debug_cmd
2743
2744    # Perform our own loop to consume as many options as possible in
2745    # each iteration.
2746    while test $# -gt 0; do
2747      _G_opt=$1
2748      shift
2749      case $_G_opt in
2750        --dry-run|--dryrun|-n)
2751                      opt_dry_run=: ;;
2752        --copy|-c)    opt_copy=: ;;
2753        --force|-f)   opt_force=: ;;
2754
2755        --gnulib-srcdir)
2756                      test $# = 0 && func_missing_arg $_G_opt && break
2757                      opt_gnulib_srcdir=$1
2758                      shift
2759                      ;;
2760
2761        --skip-git|--no-git)
2762                      opt_skip_git=:
2763                      ;;
2764
2765        --skip-po|--no-po)
2766                      opt_skip_po=:
2767                      ;;
2768
2769        # Separate non-argument short options:
2770        -c*|-f*|-n*)
2771                      func_split_short_opt "$_G_opt"
2772                      set dummy "$func_split_short_opt_name" \
2773                          "-$func_split_short_opt_arg" ${1+"$@"}
2774                      shift
2775                      ;;
2776
2777        *)            set dummy "$_G_opt" ${1+"$@"}; shift; break ;;
2778      esac
2779    done
2780
2781    # save modified positional parameters for caller
2782    func_quote eval ${1+"$@"}
2783    bootstrap_parse_options_result=$func_quote_result
2784}
2785func_add_hook func_parse_options bootstrap_parse_options
2786
2787
2788# bootstrap_validate_options [ARG]...
2789# -----------------------------------
2790# Perform any sanity checks on option settings and/or unconsumed
2791# arguments.
2792bootstrap_validate_options ()
2793{
2794    $debug_cmd
2795
2796    # Validate options.
2797    test $# -gt 0 \
2798        && func_fatal_help "too many arguments"
2799
2800    # Pass back the (empty) list of unconsumed options.
2801    func_quote eval ${1+"$@"}
2802    bootstrap_validate_options_result=$func_quote_result
2803}
2804func_add_hook func_validate_options bootstrap_validate_options
2805
2806
2807## -------------------------------------------------- ##
2808## Source package customisations in 'bootstrap.conf'. ##
2809## -------------------------------------------------- ##
2810
2811# Override the default configuration, if necessary.
2812# Make sure that bootstrap.conf is sourced from the current directory
2813# if we were invoked as "sh bootstrap".
2814case $0 in
2815  */*) test -r "$0.conf" && . "$0.conf" ;;
2816  *) test -r "$0.conf" && . ./"$0.conf" ;;
2817esac
2818
2819
2820## ------------------------------- ##
2821## Actually perform the bootstrap. ##
2822## ------------------------------- ##
2823
2824func_bootstrap ${1+"$@"}
2825
2826# The End.
2827exit ${exit_status-$EXIT_SUCCESS}
2828
2829# Local variables:
2830# mode: shell-script
2831# sh-indentation: 2
2832# eval: (add-hook 'before-save-hook 'time-stamp)
2833# time-stamp-pattern: "500/scriptversion=%:y-%02m-%02d.%02H; # UTC"
2834# time-stamp-time-zone: "UTC"
2835# End:
2836