From d5393524f6f01ba02d7b61800288070184335960 Mon Sep 17 00:00:00 2001 From: "Gary V. Vaughan" Date: Thu, 3 Nov 2011 15:23:45 +0700 Subject: [PATCH] bootstrap: split into reusable parts. * bootstrap: Bourne shell has no scoping, so be extremely careful with namespaces, functions in `^func_' and `^require_'; private variables in `^_G_', and public variables all well documented by comments. * libltdl/config/extract-trace: New file, containing the minimum of code previously in bootstrap plus a little glue to make the GNU M4 based autotools tracing function (as opposed to the kludgy sed extraction currently used everywhere else) a standalone script that can be executed or sourced. * libltdl/config/options-parser: New file, containing the pluggable options parser code shared between the other two. * bootstrap.conf: Adjust. * Makefile.am (EXTRA_DIST): Be sure to distribute the new extract-trace and options-parser scripts. (install-data-local): And install them where libtoolize can find them. Signed-off-by: Gary V. Vaughan --- Makefile.am | 10 +- bootstrap | 1411 +++++++++------------------------ bootstrap.conf | 4 +- libltdl/config/extract-trace | 407 ++++++++++ libltdl/config/options-parser | 790 ++++++++++++++++++ 5 files changed, 1571 insertions(+), 1051 deletions(-) create mode 100755 libltdl/config/extract-trace create mode 100644 libltdl/config/options-parser diff --git a/Makefile.am b/Makefile.am index 3c9e39d2..5e57bfe4 100644 --- a/Makefile.am +++ b/Makefile.am @@ -92,14 +92,17 @@ CLEANFILES += libtool libtoolize ## and dependencies with `$(srcdir)' consistently. configure_ac = $(srcdir)/configure.ac config_status = $(top_builddir)/config.status +extract_trace = $(srcdir)/$(aux_dir)/extract-trace libtoolize_in = $(srcdir)/libtoolize.in ltmain_sh = $(srcdir)/$(aux_dir)/ltmain.sh libtool_m4 = $(srcdir)/$(macro_dir)/libtool.m4 ltversion_in = $(srcdir)/$(macro_dir)/ltversion.in ltversion_m4 = $(srcdir)/$(macro_dir)/ltversion.m4 +options_parser = $(srcdir)/$(aux_dir)/options-parser -EXTRA_DIST += $(libtoolize_in) $(libtoolize_m4sh) $(ltmain_m4sh) \ - $(ltmain_sh) $(ltversion_in) $(ltversion_m4) +EXTRA_DIST += $(extract_trace) $(libtoolize_in) $(libtoolize_m4sh) \ + $(ltmain_m4sh) $(ltmain_sh) $(ltversion_in) \ + $(ltversion_m4) $(options_parser) ## These are the replacements that need to be made at bootstrap time, ## because they must be static in distributed files, and not accidentally @@ -479,7 +482,8 @@ install-data-local: $(lt_Makefile_in) $(INSTALL_DATA) "$(srcdir)/$(macro_dir)/$$f" "$(DESTDIR)$(aclocaldir)/$$f"; \ done ## install the helper scripts - @list='$(pkgaux_scripts)' && for p in $$list; do \ + @list='config/extract-trace config/options-parser $(pkgaux_scripts)' && \ + for p in $$list; do \ d=`echo "$(DESTDIR)$(pkgdatadir)/$$p" |$(SED) 's,[^/]*$$,,'`; \ test -d "$$d" || $(mkinstalldirs) "$$d"; \ echo " $(INSTALL_SCRIPT) '$(srcdir)/$(ltdl_dir)/$$p' '$(DESTDIR)$(pkgdatadir)/$$p'"; \ diff --git a/bootstrap b/bootstrap index ecfa39b7..7e6fb4b6 100755 --- a/bootstrap +++ b/bootstrap @@ -1,6 +1,11 @@ #! /bin/sh -# Print a version string. -scriptversion=2011-10-22.09; # UTC + +# Source required external libraries. +. `echo "$0" |${SED-sed} 's,[^/]*$,,'`"libltdl/config/options-parser" +. `echo "$0" |${SED-sed} 's,[^/]*$,,'`"libltdl/config/extract-trace" + +# Set a version string for *this* script. +scriptversion=2011-11-04.05; # UTC # Bootstrap this package from checked-out sources. # Written by Gary V. Vaughan, 2010 @@ -8,6 +13,8 @@ scriptversion=2011-10-22.09; # UTC # Copyright (C) 2010, 2011 Free Software Foundation, Inc. # This is free software; see the source for copying conditions. There is NO # warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# +##### PLEASE CHECK `--version' WORKS AFTER EDITING THE ABOVE COPYRIGHT ##### # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -49,9 +56,10 @@ scriptversion=2011-10-22.09; # UTC # called at the wrong time by other tools that we call (`autoreconf', # for example). # -# We also allow `LIBTOOLIZE' and `M4' to be overridden, and export the -# result for child processes, but they are handled by the function -# `func_find_tool' and not defaulted in this section. +# We also allow `LIBTOOLIZE', `M4', `SHA1SUM' and some others to be +# overridden, and export the result for child processes, but they are +# handled by the function `func_find_tool' and not defaulted in this +# section. : ${ACLOCAL="aclocal"} : ${AUTOCONF="autoconf"} @@ -87,53 +95,6 @@ export CONFIG_SHELL ## Configuration. ## ## -------------- ## -# Short help message in response to `-h'. Add to this in `bootstrap.conf' -# if you accept any additional options. -usage_message="Bootstrap this package from the checked-out sources. - -Common Bootstrap Options: - -c, --copy copy files instead of creating symbolic links. - --debug enable verbose shell tracing - -n, --dry-run print commands rather than running them - -f, --force attempt to bootstrap even if the sources seem not to have - been checked out. - --gnulib-srcdir=DIRNAME - specify a local directory where gnulib sources reside. - Use this if you already have the gnulib sources on your - machine, and don't want to waste your bandwidth - downloading them again. Defaults to \$GNULIB_SRCDIR. - --skip-git do not fetch files from remote repositories - --skip-po do not download po files. - -v, --verbose verbosely report processing - --version print version information and exit - -W, --warnings=CATEGORY - report the warnings falling in CATEGORY [all] - -h, --help print short or long help message and exit -" - -# Warning categories used by `bootstrap', append others if you use them -# in your `bootstrap.conf'. -warning_categories="recommend settings upgrade" - -# Additional text appended to `usage_message' in response to `--help'. -long_help_message=" -Warning categories include: - \`all' show all warnings - \`none' turn off all the warnings - \`error' warnings are treated as fatal errors - \`recommend' show warnings about missing recommended packages - \`settings' show warnings about missing \`bootstrap.conf' settings - \`upgrade' show warnings about out-dated files - -If the file $progpath.conf exists in the same directory as this script, its -contents are read as shell variables to configure the bootstrap. - -For build prerequisites, environment variables like \$AUTOCONF and \$AMTAR -are honored. - -Running without arguments will suffice in most cases. -" - # A newline delimited list of triples of programs (that respond to # --version), the minimum version numbers required (or just `-' in the # version field if any version will be sufficient) and homepage URLs @@ -246,150 +207,15 @@ copy=false vc_ignore= -## -------------------- ## -## Shell normalisation. ## -## -------------------- ## - -# Be more Bourne compatible -DUALCASE=1; export DUALCASE # for MKS sh -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : - emulate sh - NULLCMD=: - # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which - # is contrary to our usage. Disable this feature. - alias -g '${1+"$@"}'='"$@"' - setopt NO_GLOB_SUBST -else - case `(set -o) 2>/dev/null` in *posix*) set -o posix ;; esac -fi - -# NLS nuisances. -LANGUAGE=C -export LANGUAGE - -# Ensure file names are sorted consistently across platforms. -LC_ALL=C -export LC_ALL - -# CDPATH. -(unset CDPATH) >/dev/null 2>&1 && unset CDPATH - -# FIXME: check that $SED accepts comments, or bail out with a pointer -# to GNU sed - - -## ------------------------- ## -## Hook function management. ## -## ------------------------- ## - -# This section contains functions for adding, removing, and running hooks -# to the main code. A hook is just a named list of of function, that can -# be run in order later on. - - -# func_append VAR VALUE -# --------------------- -# Append VALUE onto the existing contents of VAR. -if (eval 'x=a; x+=" b"; test "x$x" = "xa b"') 2>/dev/null -then - # This is an XSI compatible shell, allowing a faster implementation... - eval 'func_append () - { - $debug_cmd - - eval "$1+=\$2" - }' -else - # ...otherwise fall back to using expr, which is often a shell builtin. - func_append () - { - $debug_cmd - - eval "$1=\$$1\$2" - } -fi - - -# func_hookable FUNC_NAME -# ----------------------- -# Declare that FUNC_NAME will run hooks added with -# `func_add_hook FUNC_NAME ...'. -func_hookable () -{ - $debug_cmd - - func_append hookable_funcs " $1" -} - - -# func_add_hook FUNC_NAME HOOK_FUNC -# --------------------------------- -# Request that FUNC_NAME call HOOK_FUNC before it returns. FUNC_NAME must -# first have been declared "hookable" by a coll to `func_hookable'. -func_add_hook () -{ - $debug_cmd - - case " $hookable_funcs " in - *" $1 "*) ;; - *) func_fatal_error "error: \`$1' does not accept hook functions." ;; - esac - - eval func_append ${1}_hooks '" $2"' -} - - -# func_remove_hook FUNC_NAME HOOK_FUNC -# ------------------------------------ -# Remove HOOK_FUNC from the list of functions called by FUNC_NAME. -func_remove_hook () -{ - $debug_cmd - - eval ${1}_hooks='`echo "\$'$1'_hooks" |$SED "s| '$2'||"`' -} - - -# func_run_hooks FUNC_NAME [ARG]... -# --------------------------------- -# Run all hook functions registered to FUNC_NAME. -# It is assumed that the list of hook functions contains nothing more -# than a whitespace-delimited list of legal shell function names, and -# no effort is wasted trying to catch shell meta-characters or preserve -# whitespace. -func_run_hooks () -{ - $debug_cmd - - case " $hookable_funcs " in - *" $1 "*) ;; - *) func_fatal_error "error: \`$1' does not support hook funcions.n" ;; - esac - - eval hook_funcs="\$$1_hooks" - - # shift away the first argument (FUNC_NAME) - shift - func_run_hooks_result=$* - - for hook_func in $hook_funcs; do - eval $hook_func '"$@"' - - # store returned options list back into positional - # parameters for next `cmd' execution. - set dummy $func_run_hooks_result; shift - done -} - - ## ------------------- ## ## Hookable functions. ## ## ------------------- ## # After `bootstrap.conf' has been sourced, execution proceeds by calling -# `func_bootstrap'. Where a function is decorated with `func_hookable -# func_name', you will find a matching `func_run_hooks func_name' which -# executes all functions added with `func_add_hook func_name my_func'. +# `func_bootstrap'. Wherever a function is decorated with +# `func_hookable func_name', you will find a matching `func_run_hooks +# func_name' which executes all functions added with `func_add_hook +# func_name my_func'. # # You might notice that many of these functions begin with a series of # `$require_foo' lines. See the docu-comments at the start of the @@ -407,13 +233,13 @@ func_bootstrap () # Save the current positional parameters to prevent them being # corrupted by calls to `set' in `func_init'. func_quote_for_eval ${1+"$@"} - my_saved_positional_parameters="$func_quote_for_eval_result" + _G_saved_positional_parameters="$func_quote_for_eval_result" # Initialisation. func_init # Option processing. - eval func_options "$my_saved_positional_parameters" + eval func_options "$_G_saved_positional_parameters" # Post-option preparation. func_prep @@ -448,214 +274,6 @@ func_init () } -# func_options [ARG]... -# --------------------- -# All the functions called inside func_options are hookable. See the -# individual implementations for details. -func_hookable func_options -func_options () -{ - $debug_cmd - - func_options_prep ${1+"$@"} - eval func_parse_options \ - ${func_options_prep_result+"$func_options_prep_result"} - eval func_validate_options \ - ${func_parse_options+"$func_parse_options_result"} - - eval func_run_hooks func_options \ - ${func_validate_options_result+"$func_validate_options_result"} - - # save modified positional parameters for caller - func_options_result="$func_run_hooks_result" -} - - -# func_options_prep [ARG]... -# -------------------------- -# All initialisations required before starting the option parse loop. -# Note that when calling hook functions, we pass through the list of -# positional parameters. If a hook function modifies that list, and -# needs to propogate that back to rest of this script, then the complete -# modified list must be put in `func_run_hooks_result' before -# returning. -func_hookable func_options_prep -func_options_prep () -{ - $debug_cmd - - warning_func=func_error - - # Option defaults: - opt_copy=${copy-false} - opt_dry_run=false - opt_force=false - opt_gnulib_srcdir="$GNULIB_SRCDIR" - opt_skip_git=false - opt_skip_po=false - opt_warning= - opt_verbose=false - - func_run_hooks func_options_prep ${1+"$@"} - - # save modified positional parameters for caller - func_options_prep_result="$func_run_hooks_result" -} - - -# func_parse_options [ARG]... -# --------------------------- -# The main option parsing loop. -# -# In order to add your own option parsing hooks, you must accept the -# full positional parameter list in your hook function, remove any -# options that you action, and then pass back the remaining unprocessed -# options in `func_run_hooks_result', escaped suitably for `eval'. Like -# this: -# -# my_silent_option () -# { -# $debug_cmd -# -# case $1 in -# --silent|-s) opt_silent=:; shift ;; -# esac -# -# func_quote_for_eval ${1+"$@"} -# func_run_hooks_result="$func_quote_for_eval_result" -# } -# func_add_hook func_parse_options my_silent_option -# -func_hookable func_parse_options -func_parse_options () -{ - $debug_cmd - - func_parse_options_result= - - # this just eases exit handling - while test $# -gt 0; do - - # Defer to hook functions for initial option parsing, so they - # get priority in the event of reusing an option name. - func_run_hooks func_parse_options ${1+"$@"} - - # Adjust func_parse_options positional parameters to match - eval set dummy "$func_run_hooks_result"; shift - - opt="$1" - shift - case $opt in - --debug|-x) debug_cmd='set -x' - func_echo "enabling shell trace mode" - $debug_cmd - ;; - --dry-run|--dryrun|-n) - opt_dry_run=: ;; - --copy|-c) opt_copy=: ;; - --force|-f) opt_force=: ;; - - --gnulib-srcdir) - test $# = 0 && func_missing_arg $opt && break - opt_gnulib_srcdir="$1" - shift - ;; - - --skip-git) opt_skip_git=: ;; - --skip-po) opt_skip_po=: ;; - --verbose|-v) opt_verbose=: ;; - - --warnings|--warning|-W) - test $# = 0 && func_missing_arg $opt && break - case " $1 " in - " all ") - opt_warning=" $warning_categories" - ;; - " none ") - opt_warning=" none" - warning_func=: - ;; - " error ") - warning_func=func_fatal_error - ;; - *" $warning_categories "*) - func_append_u opt_warning " $1" - ;; - *) - func_fatal_error \ - "error: unsupported warning category: \`$1'" - ;; - esac - shift - ;; - - --version) func_version ;; - -\?|-h) func_usage ;; - --help) func_help ;; - - # Separate optargs to long options: - --*=*) - func_split_equals "$opt" - set dummy "$func_split_equals_lhs" \ - "$func_split_equals_rhs" ${1+"$@"} - shift - ;; - - # Separate optargs to short options: - -W*) - func_split_short_opt "$opt" - set dummy "$func_split_short_opt_name" \ - "$func_split_short_opt_arg" ${1+"$@"} - shift - ;; - - # Separate non-argument short options: - -\?*|-h*|-c*|-f*|-n*|-v*|-x*) - func_split_short_opt "$opt" - set dummy "$func_split_short_opt_name" \ - "-$func_split_short_opt_arg" ${1+"$@"} - shift - ;; - - --) set dummy "$opt"; shift; break ;; - -*) func_fatal_help "unrecognised option: \`$opt'" ;; - *) set dummy "$opt"; shift; break ;; - esac - done - - # save modified positional parameters for caller - func_quote_for_eval ${1+"$@"} - func_parse_options_result="$func_quote_for_eval_result" -} - - -# func_validate_options [ARG]... -# ------------------------------ -# Perform any sanity checks on option settings and/or unconsumed -# arguments. -func_hookable func_validate_options -func_validate_options () -{ - $debug_cmd - - # display all warnings if -W was not given - test -n "$opt_warning" || opt_warning="$warning_categories" - - func_run_hooks func_validate_options ${1+"$@"} - - # Validate options. - test $# -gt 0 \ - && func_fatal_help "too many arguments" - - # Bail if the options were screwed! - $exit_cmd $EXIT_FAILURE - - # save modified positional parameters for caller - func_quote_for_eval ${1+"$@"} - func_validate_options_result="$func_quote_for_eval_result" -} - - # func_prep # --------- # Function to perform preparation for remaining bootstrap process. If @@ -860,7 +478,7 @@ func_gettext_configuration () # function. Note that adding a literal \\\ requires double escaping # here, once for the execution subshell, and again for the assignment, # which is why there are actually 12 (!!) backslashes in the script. - my_xgettext_options=`echo "$xgettext_options$nl" |$SED '/^$/d' |$SED ' + _G_xgettext_options=`echo "$xgettext_options$nl" |$SED '/^$/d' |$SED ' $b s|$| \\\\\\\\\\\\|'` @@ -874,7 +492,7 @@ func_gettext_configuration () /^XGETTEXT_OPTIONS *=/{ s|$| \\| a\ - '"$my_xgettext_options"' \\\ + '"$_G_xgettext_options"' \\\ $${end_of_xgettext_options+} } ' po/Makevars.template >po/Makevars || exit 1 @@ -918,11 +536,11 @@ func_libtoolize () $require_libtoolize test true = "$LIBTOOLIZE" || { - my_libtoolize_options= - $opt_copy && func_append my_libtoolize_options " --copy" - $opt_force && func_append my_libtoolize_options " --force" - $opt_verbose || func_append my_libtoolize_options " --quiet" - func_show_eval "$LIBTOOLIZE$my_libtoolize_options" 'exit $?' + _G_libtoolize_options= + $opt_copy && func_append _G_libtoolize_options " --copy" + $opt_force && func_append _G_libtoolize_options " --force" + $opt_verbose || func_append _G_libtoolize_options " --quiet" + func_show_eval "$LIBTOOLIZE$_G_libtoolize_options" 'exit $?' } } @@ -947,16 +565,16 @@ func_gnulib_tool_copy_file () # distribution tarball), make sure that at least we have some # version of the required file already in place. test -f "$2" || func_fatal_error "\ -error: Can't find, copy or download \`$2', a required - gnulib supplied file, please provide the location of a - complete \`gnulib' tree by setting \`gnulib_path' in your - \`bootstrap.conf' or with the \`--gnulib-srcdir' option - - or else specify the location of your \`git' binary by - setting \`GIT' in the environment so that a fresh - \`gnulib' submodule can be cloned." +Can't find, copy or download \`$2', a required +gnulib supplied file, please provide the location of a +complete \`gnulib' tree by setting \`gnulib_path' in your +\`bootstrap.conf' or with the \`--gnulib-srcdir' option - +or else specify the location of your \`git' binary by +setting \`GIT' in the environment so that a fresh +\`gnulib' submodule can be cloned." else test -f "$gnulib_path/$1" || { - func_error "error: \`$gnulib_path/$1' does not exist" + func_error "\`$gnulib_path/$1' does not exist" return 1 } @@ -1014,10 +632,10 @@ func_ensure_changelog () ChangeLog is generated by gitlog-to-changelog. EOT - my_message="creating dummy \`ChangeLog'" + _G_message="creating dummy \`ChangeLog'" test -f ChangeLog~ \ - && func_append my_message ' (backup in ChangeLog~)' - func_verbose "$my_message" + && func_append _G_message ' (backup in ChangeLog~)' + func_verbose "$_G_message" return 0 } @@ -1041,11 +659,11 @@ func_autoreconf () save_AUTOPOINT="$AUTOPOINT"; AUTOPOINT=true save_LIBTOOLIZE="$LIBTOOLIZE"; LIBTOOLIZE=true - my_autoreconf_options= - $opt_copy || func_append my_autoreconf_options " --symlink" - $opt_force && func_append my_autoreconf_options " --force" - $opt_verbose && func_append my_autoreconf_options " --verbose" - func_show_eval "$AUTORECONF$my_autoreconf_options --install" 'exit $?' + _G_autoreconf_options= + $opt_copy || func_append _G_autoreconf_options " --symlink" + $opt_force && func_append _G_autoreconf_options " --force" + $opt_verbose && func_append _G_autoreconf_options " --verbose" + func_show_eval "$AUTORECONF$_G_autoreconf_options --install" 'exit $?' AUTOPOINT="$save_AUTOPOINT" LIBTOOLIZE="$save_LIBTOOLIZE" @@ -1054,6 +672,8 @@ func_autoreconf () # func_check_configuration VARNAME [CONFIGURE_MACRO] # -------------------------------------------------- +# Exit with a suitable diagnostic for an important configuration change +# that needs to be made before bootstrap can run correctly. func_check_configuration () { $debug_cmd @@ -1061,13 +681,14 @@ func_check_configuration () $require_configure_ac eval 'test -n "$'$1'"' || { - my_error_msg="error: please set \`$1' in \`bootstrap.conf'" - test -n "$2" \ - && func_append my_error_msg " - or add the following (or similar) to your \`$configure_ac': - $2" + _G_error_msg="please set \`$1' in \`bootstrap.conf'" + if test -n "$configure_ac" && test -n "$2"; then + func_append _G_error_msg " +or add the following (or similar) to your \`$configure_ac': +$2" + fi - func_fatal_error "$my_error_msg" + func_fatal_error "$_G_error_msg" } } @@ -1166,10 +787,10 @@ func_update_dotversion () $debug_cmd test -f "$build_aux/git-version-gen" && { - my_message="updating .version" + _G_message="updating .version" test -f .version && { mv .version .version~ - func_append my_message " (backup in .version~)" + func_append _G_message " (backup in .version~)" } func_verbose "updating .version" @@ -1205,8 +826,8 @@ func_require_checkout_only_file () $opt_force || { test -n "$checkout_only_file" && test ! -f "$checkout_only_file" \ && func_fatal_error "\ -error: Bootstrapping from a non-checked-out distribution is risky. - If you wish to bootstrap anyway, use the \`--force' option." +Bootstrapping from a non-checked-out distribution is risky. +If you wish to bootstrap anyway, use the \`--force' option." } require_checkout_only_file=: @@ -1224,15 +845,15 @@ func_require_aclocal_amflags () $require_makefile_am - my_sed_extract_aclocal_amflags='s|#.*$|| + _G_sed_extract_aclocal_amflags='s|#.*$|| /^[ ]*ACLOCAL_AMFLAGS[ ]*=/ { s|^.*=[ ]*\(.*\)|aclocal_amflags="\1"| p }' - my_aclocal_flags_cmd=`$SED -n "$my_sed_extract_aclocal_amflags" \ + _G_aclocal_flags_cmd=`$SED -n "$_G_sed_extract_aclocal_amflags" \ "$makefile_am"` - eval "$my_aclocal_flags_cmd" + eval "$_G_aclocal_flags_cmd" func_verbose "ACLOCAL_AMFLAGS='$aclocal_amflags'" @@ -1253,8 +874,6 @@ func_require_autobuild_buildreq () test -f "$macro_dir/autobuild.m4" \ || printf '%s\n' "$buildreq" |func_grep_q '^[ ]*autobuild' \ || { - $require_configure_ac - func_extract_trace AB_INIT test -n "$func_extract_trace_result" && { func_append buildreq 'autobuild - http://josefsson.org/autobuild/ @@ -1293,16 +912,14 @@ for tool in autoconf libtoolize autopoint; do ${require_'$tool'-:} printf '%s\n' "$buildreq" |func_grep_q '\''^[ ]*'$tool\'' || { - $require_configure_ac - func_extract_trace '$m' - my_version="$func_extract_trace_result" - test -n "$my_version" && { + _G_version="$func_extract_trace_result" + test -n "$_G_version" && { func_append buildreq "\ - '$tool' $my_version http://www.gnu.org/s/'$b' + '$tool' $_G_version http://www.gnu.org/s/'$b' " func_verbose \ - "auto-adding \`'$tool'-$my_version'\'' to build requirements" + "auto-adding \`'$tool'-$_G_version'\'' to build requirements" } } @@ -1426,8 +1043,6 @@ func_require_build_aux () $debug_cmd test -n "$build_aux" || { - $require_configure_ac - func_extract_trace AC_CONFIG_AUX_DIR build_aux="$func_extract_trace_result" func_check_configuration build_aux \ @@ -1467,16 +1082,18 @@ func_require_buildtools_uptodate () $require_autopoint_buildreq test -n "$buildreq" && { + _G_error_hdr= + func_check_versions $buildreq $func_check_versions_result || { test -n "$buildreq_readme" \ && test -f "$buildreq_readme" \ - && func_error "\ -error: $buildreq_readme explains how to obtain these prerequisite programs: + && _G_error_hdr="\ +$buildreq_readme explains how to obtain these prerequisite programs: " - func_strtable 7 11 12 36 \ + func_strtable 0 11 12 36 \ "Program" "Min_version" "Homepage" $buildreq - func_fatal_error "$func_strtable_result" + func_fatal_error "$_G_error_hdr$func_strtable_result" } } @@ -1484,29 +1101,6 @@ error: $buildreq_readme explains how to obtain these prerequisite programs: } -# require_configure_ac -# -------------------- -# Ensure that there is a `configure.ac' or `configure.in' file in the -# current directory, and that `$configure_ac' contains its name. -require_configure_ac=func_require_configure_ac -func_require_configure_ac () -{ - $debug_cmd - - test -n "$configure_ac" || { - for configure_ac in configure.ac configure.in; do - test -f $configure_ac && break - done - - <$configure_ac - } - - func_verbose "found \`$configure_ac'" - - require_configure_ac=: -} - - # require_copyright_holder # ------------------------ # Ensure there is a sensible non-empty default value in `$copyright_holder'. @@ -1538,9 +1132,9 @@ func_require_dotgitmodules () test true = "$GIT" || { # A gnulib entry in .gitmodules always takes precedence. - my_path="`$GIT config --file .gitmodules submodule.gnulib.path 2>/dev/null`" + _G_path="`$GIT config --file .gitmodules submodule.gnulib.path 2>/dev/null`" - test -n "$my_path" || { + test -n "$_G_path" || { $require_vc_ignore_files func_verbose "creating \`.gitmodules'" @@ -1601,31 +1195,6 @@ func_require_git () } -# require_gnu_m4 -# -------------- -# Search for GNU M4, and export it in $M4. -require_gnu_m4=func_require_gnu_m4 -func_require_gnu_m4 () -{ - $debug_cmd - - test -n "$M4" || { - # Find the first m4 binary that responds to --version. - func_find_tool M4 gm4 gnum4 m4 - } - - test -n "$M4" || func_fatal_error "\ -error: Please install GNU M4, or \`export M4=/path/to/gnu/m4'." - - func_verbose "export M4='$M4'" - - # Make sure the search result is visible to subshells - export M4 - - require_gnu_m4=: -} - - # require_gnulib_cache # -------------------- # Ensure there is a non-empty default for `$gnulib_cache', and that it @@ -1765,7 +1334,7 @@ func_require_gnulib_submodule () if test -f .gitmodules && test -f "$gnulib_path/gnulib-tool"; then func_show_eval "$GIT submodule update" \ - 'func_fatal_error "error: Unable to update gnulib submodule."' + 'func_fatal_error "Unable to update gnulib submodule."' elif test -n "$opt_gnulib_srcdir"; then # Older git can't clone into an empty directory. @@ -1774,7 +1343,7 @@ func_require_gnulib_submodule () '$gnulib_url' '$gnulib_path'" \ && func_show_eval "$GIT submodule init" \ && func_show_eval "$GIT submodule update" \ - || func_fatal_error "error: Unable to fetch gnulib submodule." + || func_fatal_error "Unable to fetch gnulib submodule." # Without --gnulib-srcdir, and no existing checked out submodule, we # create a new shallow clone of the remote gnulib repository. @@ -1883,10 +1452,10 @@ func_require_macro_dir () test -n "$macro_dir" || { $require_aclocal_amflags - my_sed_scan='s|^.*-I[ ]*\([^ ]*\) .*|\1|' + _G_sed_scan='s|^.*-I[ ]*\([^ ]*\) .*|\1|' # Trailing space in echo is required by the sed script. - macro_dir=`echo "$aclocal_amflags " |$SED "$my_sed_scan"` + macro_dir=`echo "$aclocal_amflags " |$SED "$_G_sed_scan"` } func_verbose "macro_dir='$macro_dir'" @@ -2029,8 +1598,8 @@ func_require_package_version () case " "`echo $gnulib_modules`" " in *" git-version-gen "*) func_fatal_error "\ -error: cannot \$require_package_version in bootstrap.conf before - func_gnulib_tool has installed the \`git-version-gen' script." +cannot \$require_package_version in bootstrap.conf before +func_gnulib_tool has installed the \`git-version-gen' script." ;; *) func_check_configuration package_version \ @@ -2152,8 +1721,8 @@ func_cmp_s () } -# func_grep_q EXPRESSION [FILENAME..]. -# ------------------------------------ +# func_grep_q EXPRESSION [FILENAME..] +# ----------------------------------- # Check whether EXPRESSION matches any line of any listed FILENAME, # without any output at all, even error messages. func_grep_q () @@ -2175,23 +1744,23 @@ func_ifcontains () $debug_cmd # The embedded echo is to squase whitespace before globbing. - my_wslist=`echo " "$1" "` - my_member=$2 - my_yes_cmd=$3 - my_no_cmd=${4-":"} + _G_wslist=`echo " "$1" "` + _G_member=$2 + _G_yes_cmd=$3 + _G_no_cmd=${4-":"} - case $my_wslist in - *" $my_member "*) - eval "$my_yes_cmd" - my_status=$? + case $_G_wslist in + *" $_G_member "*) + eval "$_G_yes_cmd" + _G_status=$? ;; *) - eval "$my_no_cmd" - my_status=$? + eval "$_G_no_cmd" + _G_status=$? ;; esac - test "$my_status" -eq 0 || exit $my_status + test "$_G_status" -eq 0 || exit $_G_status } @@ -2209,11 +1778,11 @@ func_append_u () { $debug_cmd - eval my_current_value='`echo $'$1'`' - my_delim=`expr "$2" : '\(.\)'` + eval _G_current_value='`echo $'$1'`' + _G_delim=`expr "$2" : '\(.\)'` - case $my_delim$my_current_value$my_delim in - *"$2$my_delim"*) ;; + case $_G_delim$_G_current_value$_G_delim in + *"$2$_G_delim"*) ;; *) func_append "$@" ;; esac } @@ -2226,10 +1795,10 @@ func_strpad () { $debug_cmd - my_width=`expr "$2" - 1` + _G_width=`expr "$2" - 1` func_strpad_result=`echo "$1" |$SED ' :a - s|^.\{0,'"$my_width"'\}$|&'"$3"'| + s|^.\{0,'"$_G_width"'\}$|&'"$3"'| ta '` } @@ -2243,10 +1812,10 @@ func_strrpad () { $debug_cmd - my_width=`expr "$2" - 1` + _G_width=`expr "$2" - 1` func_strrpad_result=`echo "$1" |$SED ' :a - s|^.\{0,'"$my_width"'\}$|'"$3"'&| + s|^.\{0,'"$_G_width"'\}$|'"$3"'&| ta '` } @@ -2263,15 +1832,15 @@ func_strrow () func_strrow_linelen="$1"; shift - my_row= + _G_row= while test $# -gt 0; do func_strrow_linelen=`expr $func_strrow_linelen + $2` func_strpad "$1" $2 " " - func_append my_row "$func_strpad_result" + func_append _G_row "$func_strpad_result" shift; shift done - func_strrpad "$my_row" $func_strrow_linelen " " + func_strrpad "$_G_row" $func_strrow_linelen " " func_strrow_result="$func_strrpad_result" } @@ -2309,27 +1878,27 @@ func_strtable () $debug_cmd # Save the indent value, we'll need it for each row we render. - my_indent="$1"; shift + _G_indent="$1"; shift # Collect remaining numeric args into a list for reuse between # members of each row when we call func_strrow later. - my_widths="$1"; shift + _G_widths="$1"; shift while test 0 -lt `expr "$1" : '[1-9][0-9]*$'`; do - func_append my_widths " $1"; shift + func_append _G_widths " $1"; shift done # Extract the same number of positional parameters as there are # width elements - we'll do the header rows separately so that # we can insert a divider line. - my_header="$my_indent" - for my_width in $my_widths; do - func_append my_header " $1 $my_width"; shift + _G_header="$_G_indent" + for _G_width in $_G_widths; do + func_append _G_header " $1 $_G_width"; shift done - func_strrow $my_header + func_strrow $_G_header # Strip off the indent, and make a divider with `-' chars, then # reindent. - my_divider=`echo "$func_strrow_result" \ + _G_divider=`echo "$func_strrow_result" \ |$SED 's|[^ ]|-|g :a s|- |--|g @@ -2339,89 +1908,24 @@ func_strtable () # Append the header and divider to the running result. func_append func_strtable_result "\ $func_strrow_result -$my_divider +$_G_divider " # The remaining rows are zipped between the width values we # unwound earlier just like the header row above. while test $# -gt 0; do - my_row="$my_indent" - for my_width in $my_widths; do - func_append my_row " $1 $my_width"; shift + _G_row="$_G_indent" + for _G_width in $_G_widths; do + func_append _G_row " $1 $_G_width"; shift done - func_strrow $my_row + func_strrow $_G_row func_append func_strtable_result "\ $func_strrow_result " done # Mark the end of the table with a final divider line. - func_append func_strtable_result "$my_divider" -} - - -# func_echo ARG... -# ---------------- -# Echo program name prefixed message, taking newlines into account. -func_echo () -{ - my_message="$*" - - save_IFS="$IFS" - IFS="$nl" - for my_line in $my_message; do - IFS="$save_IFS" - echo "$progname: $my_line" - done - IFS="$save_IFS" -} - - -# func_verbose ARG... -# ------------------- -# Echo program name prefixed message in verbose mode only. -func_verbose () -{ - $opt_verbose && func_echo ${1+"$@"} -} - - -# func_error ARG... -# ----------------- -# Echo program name prefixed message to standard error. -func_error () -{ - my_message="$*" - - save_IFS="$IFS" - IFS="$nl" - for my_line in $my_message; do - IFS="$save_IFS" - echo "$progname: $bold_on$my_line$bold_off" 1>&2 - done - IFS="$save_IFS" -} - -# Allow display of bold text on terminals that support it -bold_on= -bold_off= -if test -t 1; then - if test -n "`tput bold 2>/dev/null`" \ - && test -n "`tput sgr0 2>/dev/null`" - then - bold_on=`tput bold` - bold_off=`tput sgr0` - fi -fi - - -# func_fatal_error ARG... -# ----------------------- -# Echo program name prefixed message to standard error, and exit. -func_fatal_error () -{ - func_error ${1+"$@"} - exit $EXIT_FAILURE + func_append func_strtable_result "$_G_divider" } @@ -2430,9 +1934,9 @@ func_fatal_error () # Echo program name prefixed message to standard error, and exit. func_internal_error () { - func_fatal_error "INTERNAL ERROR: " ${1+"$@"} " - Please report this bug to \`bug-gnulib@gnu.org' - in as much detail as possible." + func_fatal_error "INTERNAL: " ${1+"$@"} " + Please report this bug to \`bug-gnulib@gnu.org' + in as much detail as possible." } @@ -2444,7 +1948,7 @@ func_permissions_error () { $debug_cmd - func_fatal_error "error: Failed to create \`$1', check permissions." + func_fatal_error "Failed to create \`$1', check permissions." } @@ -2461,210 +1965,15 @@ func_warning () *) func_internal_error "invalid warning category \`$1'" ;; esac - my_category="$1" + _G_category="$1" shift case " $opt_warning " in - *" $my_category "*) $warning_func ${1+"$@"} ;; + *" $_G_category "*) $warning_func ${1+"$@"} ;; esac } -# func_fatal_help ARG... -# ---------------------- -# Echo program name prefixed message to standard error, followed by -# a help hint, and exit. -func_fatal_help () -{ - $debug_cmd - - func_error ${1+"$@"} - func_fatal_error "$fatal_help" -} -fatal_help="Try \`$progname --help' for more information." ## default - - -# func_version -# ------------ -# Echo version message to standard output and exit. -func_version () -{ - $debug_cmd - - printf '%s\n' "$progname $scriptversion" - $SED -n '/(C)/!b go - :more - /\./!{ - N - s|\n# | | - b more - } - :go - /^# Written by /,/# warranty; / { - s|^# || - s|^# *$|| - s|\((C)\)[ 0-9,-]*[ ,-]\([1-9][0-9]* \)|\1 \2| - p - } - /^# Written by / { - s|^# || - p - }' < "$progpath" - - exit $? -} - - -# func_usage_message -# ------------------ -# Echo short help message to standard output. -func_usage_message () -{ - $debug_cmd - - echo "$progpath [OPTION]..." - echo "" - echo "$usage_message" -} - - -# func_usage -# ---------- -# Echo short help message to standard output and exit. -func_usage () -{ - $debug_cmd - - func_usage_message - echo "Run \`$progname --help |more' for full usage" - exit 0 -} - - -# func_help -# --------- -# Echo long help message to standard output and exit. -func_help () -{ - $debug_cmd - - func_usage_message - echo "$long_help_message" - exit 0 -} - - -# func_missing_arg ARGNAME -# ------------------------ -# Echo program name prefixed message to standard error and set global -# exit_cmd. -func_missing_arg () -{ - $debug_cmd - - func_error "error: Missing argument for \`$1'." - exit_cmd=exit -} - - -# func_split_short_opt SHORTOPT -# ----------------------------- -# Set func_split_short_opt_name and func_split_short_opt_arg shell -# variables after splitting SHORTOPT after the 2nd character. -if (eval 'x=-abc; y=${x#??}; z=${x%$y}; test x$y$z = xbc-a') 2>/dev/null -then - # This is an XSI compatible shell, allowing a faster implementation... - eval 'func_split_short_opt () - { - $debug_cmd - - func_split_short_opt_arg=${1#??} - func_split_short_opt_name=${1%"$func_split_short_opt_arg"} - }' -else - # ...otherwise fall back to using expr, which is often a shell builtin. - func_split_short_opt () - { - $debug_cmd - - func_split_short_opt_name=`expr "x$1" : 'x-\(.\)'` - func_split_short_opt_arg=`expr "x$1" : 'x-.\(.*\)$'` - } -fi #func_split_short_opt - - -# func_split_equals STRING -# ------------------------ -# Set func_split_equals_lhs and func_split_equals_rhs shell variables after -# splitting STRING at the `=' sign. -if (eval 'x='--ab=cd'; y=${x#*=}; z=${x%%=*}; test x$y$z = xcd--ab') 2>/dev/null -then - # This is an XSI compatible shell, allowing a faster implementation... - eval 'func_split_equals () - { - $debug_cmd - - func_split_equals_lhs=${1%%=*} - func_split_equals_rhs=${1#*=} - test "x$func_split_equals_lhs" = "x$1" \ - && func_split_equals_rhs="" - }' -else - # ...otherwise fall back to using expr, which is often a shell builtin. - func_split_equals () - { - $debug_cmd - - func_split_equals_lhs=`expr "x$1" : 'x\([^=]*)'` - func_split_equals_rhs="" - test "x$func_split_equals_lhs" = "x$1" \ - || func_split_equals_rhs=`expr "x$1" : 'x[^=]*=\(.*\)$'` - } -fi #func_split_equals - - -# func_quote_for_eval ARG... -# -------------------------- -# Aesthetically quote ARGs to be evaled later. -# This function returns two values: FUNC_QUOTE_FOR_EVAL_RESULT -# is double-quoted, suitable for a subsequent eval, whereas -# FUNC_QUOTE_FOR_EVAL_UNQUOTED_RESULT has merely all characters -# which are still active within double quotes backslashified. -sed_quote_subst='s|\([`"$\\]\)|\\\1|g' -func_quote_for_eval () -{ - $debug_cmd - - func_quote_for_eval_result= - - while test $# -gt 0; do - case $1 in - *[\\\`\"\$]*) - my_unquoted_arg=`printf '%s\n' "$1" |$SED "$sed_quote_subst"` ;; - *) - my_unquoted_arg="$1" ;; - esac - - case $my_unquoted_arg in - # Double-quote args containing shell metacharacters to delay - # word splitting, command substitution and variable expansion - # for a subsequent eval. - # Many Bourne shells cannot handle close brackets correctly - # in scan sets, so we specify it separately. - *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") - my_quoted_arg="\"$my_unquoted_arg\"" - ;; - *) - my_quoted_arg="$my_unquoted_arg" ;; - esac - test -n "$func_quote_for_eval_result" \ - && func_append func_quote_for_eval_result " " - func_append func_quote_for_eval_result "$my_quoted_arg" - shift - done -} - - # func_show_eval CMD [FAIL_EXP] # ----------------------------- # Unless opt_silent is true, then output CMD. Then, if opt_dryrun is @@ -2674,19 +1983,19 @@ func_show_eval () { $debug_cmd - my_cmd="$1" - my_fail_exp="${2-:}" + _G_cmd="$1" + _G_fail_exp="${2-:}" ${opt_silent-false} || { - func_quote_for_eval $my_cmd + func_quote_for_eval $_G_cmd eval func_truncate_cmd $func_quote_for_eval_result func_echo "running: $func_truncate_cmd_result" } ${opt_dry_run-false} || { - eval "$my_cmd" - my_status=$? - test "$my_status" -eq 0 || eval "(exit $my_status); $my_fail_exp" + eval "$_G_cmd" + _G_status=$? + test "$_G_status" -eq 0 || eval "(exit $_G_status); $_G_fail_exp" } } @@ -2700,26 +2009,26 @@ func_truncate_cmd () { $debug_cmd - my_last_arg_opt_p=false + _G_last_arg_opt_p=false func_truncate_cmd_result= set dummy "$@"; shift while test $# -gt 0; do - my_opt="$1"; shift + _G_opt="$1"; shift test -n "$func_truncate_cmd_result" \ && func_append func_truncate_cmd_result ' ' - func_append func_truncate_cmd_result "$my_opt" + func_append func_truncate_cmd_result "$_G_opt" func_len "x$func_truncate_cmd_result" - case $my_opt in - -*) my_last_arg_opt_p=: ;; - *) $my_last_arg_opt_p \ + case $_G_opt in + -*) _G_last_arg_opt_p=: ;; + *) $_G_last_arg_opt_p \ || test $min_cmd_len -gt $func_len_result \ || break - my_last_arg_opt_p=false + _G_last_arg_opt_p=false ;; esac done @@ -2728,114 +2037,6 @@ func_truncate_cmd () } -# func_extract_trace MACRO_NAME [FILENAME]... -# ------------------------------------------- -# set `$func_extract_trace_result' to a colon delimited list of -# arguments to MACRO_NAME in FILENAME. If no FILENAME is not given, -# then `configure.ac' is assumed. -func_extract_trace () -{ - $debug_cmd - - $require_configure_ac - $require_gnu_m4 - - my_macro="$1"; shift - test $# -gt 0 || { - set dummy $configure_ac - shift - } - - # Generate an error if the first file is missing - <"$1" - - # Sadly, we can't use `autom4te' tracing to extract macro - # arguments, because it complains about things we want to - # ignore at bootstrap time - like missing m4_include files; - # AC_PREREQ being newer than the installed autoconf; and - # returns nothing when tracing `AM_INIT_AUTOMAKE' when - # aclocal hasn't been generated yet. - # - # The following tries to emulate a less persnickety version - # of (and due to not having to wait for Perl startup on - # every invocation, it's probably faster too): - # - # autom4te --language=Autoconf --trace=$my_macro:\$% "$@" - # - # First we give a minimal set of macro declarations to M4 - # to prime it for reading Autoconf macros, while still - # providing some of the functionality generally used at - # m4-time to supply dynamic arguments to Autocof functions, - # but without following `m4_s?include' files. - # - # We discard M4's stdout, but the M4 trace output from reading - # our "autoconf.mini" followed by any other files passed to - # this function is then scanned by sed to transform it into - # a colon delimited argument list assigned to a shell variable. - # - # Finally, we `eval' the sed generated assignment to get - # the result back into this script for further use by callers - # of this function. - - func_extract_trace_result= - eval `echo ' - # Initialisation. - m4_changequote([,]) - m4_define([m4_copy], [m4_define([$2], m4_defn([$1]))]) - m4_define([m4_rename], [m4_copy([$1], [$2])m4_undefine([$1])]) - - # Disable these macros. - m4_undefine([m4_dnl]) - m4_undefine([m4_include]) - m4_undefine([m4_m4exit]) - m4_undefine([m4_m4wrap]) - m4_undefine([m4_maketemp]) - - # Copy and rename macros not handled by "m4 --prefix". - m4_define([dnl], [m4_builtin([dnl])]) - m4_copy([m4_define], [m4_defun]) - m4_rename([m4_ifelse], [m4_if]) - m4_ifdef([m4_mkstemp], [m4_undefine([m4_mkstemp])]) - m4_rename([m4_patsubst], [m4_bpatsubst]) - m4_rename([m4_regexp], [m4_bregexp]) - - # "m4sugar.mini" - useful m4-time macros for dynamic arguments. - # If we discover packages that need more m4 macros defined in - # order to bootstrap correctly, add them here: - m4_define([m4_bmatch], - [m4_if([$#], 0, [], [$#], 1, [], [$#], 2, [$2], - [m4_if(m4_bregexp([$1], [$2]), -1, - [$0([$1], m4_shift3($@))], [$3])])]) - m4_define([m4_ifndef], [m4_ifdef([$1], [$3], [$2])]) - m4_define([m4_ifset], - [m4_ifdef([$1], [m4_ifval(m4_defn([$1]), [$2], [$3])], [$3])]) - m4_define([m4_require], [$1]) - m4_define([m4_shift3], [m4_shift(m4shift(m4shift($@)))]) - - # "autoconf.mini" - things from autoconf macros we care about. - m4_copy([m4_defun], [AC_DEFUN]) - - # Dummy definition for the macro we want to trace. - # AM_INIT_AUTOMAKE at least produces no trace without this. - AC_DEFUN(['"$my_macro"'])' \ - |$M4 -daq --prefix --trace="$my_macro" - "$@" 2>&1 1>/dev/null \ - |$SED -n 's|#.*$|| - /^m4trace: -1- '"$my_macro"'/ { - s|^m4trace: -1- '"$my_macro"'[([]*|func_extract_trace_result='\''| - s|], [[]|:|g - s|[])]*$|:'\''| - s|[^'\'']$|\&'\''| - p - }'` - - # Leave the ':' sentinel in place for successfully traced macros - # without arguments, otherwise remove it so that the results of - # single-argument macros can be used without additional parsing. - test : = "$func_extract_trace_result" \ - || func_extract_trace_result=`echo "$func_extract_trace_result" |$SED 's|:$||'` -} - - # func_insert_sorted_if_absent STR FILE... # ---------------------------------------- # If $STR is not already on a line by itself in $FILE, insert it, @@ -2915,13 +2116,11 @@ func_get_version () { $debug_cmd - app=$1 + _G_app=$1 - { $app --version || $app --version /dev/null 2>&1 \ - || return 1 - - $app --version 2>&1 \ - |$SED -n '# extract version within line + # Rather than uncomment the sed script in-situ, strip the comments + # programatically before passing the result to $SED for evaluation. + sed_get_version=`echo '# extract version within line s|.*[v ]\{1,\}\([0-9]\{1,\}\.[.a-z0-9-]*\).*|\1| t done @@ -2932,10 +2131,19 @@ func_get_version () d :done - #the following essentially does s|5.005|5.5| + # the following essentially does s|5.005|5.5| s|\.0*\([1-9]\)|.\1|g p - q' + q' \ + |$SED '/^[ ]*#.*$/d'` + + func_tool_version_output $_G_app >/dev/null + _G_status=$? + + test $_G_status -ne 0 \ + || $_G_app --version 2>&1 |$SED -n "$sed_get_version" + + (exit $_G_status) } @@ -2948,31 +2156,31 @@ func_check_versions () func_check_versions_result=: while test $# -gt 0; do - my_app="$1"; shift - my_reqver="$1"; shift - my_url="$1"; shift + _G_app="$1"; shift + _G_reqver="$1"; shift + _G_url="$1"; shift # Honor $APP variables ($TAR, $AUTOCONF, etc.) - my_appvar=`echo $my_app |tr '[a-z]' '[A-Z]'` - test "$my_appvar" = TAR && my_appvar=AMTAR - eval "my_app=\${$my_appvar-$my_app}" - my_instver=`func_get_version $my_app` + _G_appvar=`echo $_G_app |tr '[a-z]' '[A-Z]'` + test "$_G_appvar" = TAR && _G_appvar=AMTAR + eval "_G_app=\${$_G_appvar-$_G_app}" + _G_instver=`func_get_version $_G_app` - test -z "$my_instver" \ - || func_verbose "found \`$my_app' version $my_instver" + test -z "$_G_instver" \ + || func_verbose "found \`$_G_app' version $_G_instver" # Fail if --version didn't work. - if test -z "$my_instver"; then - func_error "error: \`$my_app' not found" + if test -z "$_G_instver"; then + func_error "\`$_G_app' not found" func_check_versions_result=false # Fail if a new version than what we have is required. - elif test "$my_reqver" != "-"; then - my_newer=`func_sort_ver $my_reqver $my_instver |cut -d' ' -f2` - test "$my_newer" != "$my_instver" && { + elif test "$_G_reqver" != "-"; then + _G_newer=`func_sort_ver $_G_reqver $_G_instver |cut -d' ' -f2` + test "$_G_newer" != "$_G_instver" && { func_error "\ -error: \`$my_app' version == $my_instver is too old - \`$my_app' version >= $my_reqver is required" +\`$_G_app' version == $_G_instver is too old +\`$_G_app' version >= $_G_reqver is required" func_check_versions_result=false } fi @@ -2988,9 +2196,9 @@ func_cleanup_gnulib () { $debug_cmd - my_status=$? + _G_status=$? $RM -fr "$gnulib_path" - exit $my_status + exit $_G_status } @@ -3001,46 +2209,8 @@ func_download_po_files () $debug_cmd func_echo "getting translations into $1 for $2..." - cmd=`printf "$po_download_command_format" "$2" "$1"` - eval "$cmd" -} - - -# func_find_tool ENVVAR NAMES... -# ------------------------------ -# Search for a required program. Use the value of ENVVAR, if set, -# otherwise find the first of the NAMES that can be run (i.e., -# supports --version). If found, set ENVVAR to the program name, -# die otherwise. -func_find_tool () -{ - $debug_cmd - - find_tool_envvar=$1 - shift - find_tool_names=$@ - eval "find_tool_res=\$$find_tool_envvar" - if test x"$find_tool_res" = x; then - for i - do - if ($i --version /dev/null 2>&1; then - find_tool_res=$i - break - fi - done - else - find_tool_error_prefix="\$$find_tool_envvar: " - fi - test x"$find_tool_res" = x && func_fatal_error "\ -error: One of these is required: - $find_tool_names" - - ($find_tool_res --version /dev/null 2>&1 \ - || func_fatal_error "\ -error: ${find_tool_error_prefix}Cannot run \`$find_tool_res --version'" - - eval "$find_tool_envvar=\$find_tool_res" - eval "export $find_tool_envvar" + _G_cmd=`printf "$po_download_command_format" "$2" "$1"` + eval "$_G_cmd" } @@ -3056,71 +2226,220 @@ func_update_po_files () # Directory containing primary .po files. # Overwrite them only when we're sure a .po file is new. - po_dir=$1 - domain=$2 + _G_po_dir=$1 + _G_domain=$2 # Mirror *.po files into this dir. # Usually contains *.s1 checksum files. - ref_po_dir="$po_dir/.reference" + _G_ref_po_dir="$_G_po_dir/.reference" - test -d $ref_po_dir || mkdir $ref_po_dir || return - func_download_po_files $ref_po_dir $domain \ - && ls "$ref_po_dir"/*.po 2>/dev/null \ - |$SED 's|.*/||; s|\.po$||' > "$po_dir/LINGUAS" || return + test -d $_G_ref_po_dir || mkdir $_G_ref_po_dir || return + func_download_po_files $_G_ref_po_dir $_G_domain \ + && ls "$_G_ref_po_dir"/*.po 2>/dev/null \ + |$SED 's|.*/||; s|\.po$||' > "$_G_po_dir/LINGUAS" || return - # Find sha1sum, named gsha1sum on MacPorts, and shasum on MacOS 10.6. + # Find sha1sum, named gsha1sum on MacPorts, and shasum on MacOS 10.6+. func_find_tool SHA1SUM sha1sum gsha1sum shasum - langs=`cd $ref_po_dir && echo *.po|$SED 's|\.po||g'` - test "$langs" = '*' && langs=x - for po in $langs; do - case $po in x) continue;; esac - new_po="$ref_po_dir/$po.po" - cksum_file="$ref_po_dir/$po.s1" - if ! test -f "$cksum_file" || - ! test -f "$po_dir/$po.po" || - ! $SHA1SUM -c --status "$cksum_file" \ - < "$new_po" > /dev/null; then - echo "updated $po_dir/$po.po..." - cp "$new_po" "$po_dir/$po.po" \ - && $SHA1SUM < "$new_po" > "$cksum_file" + _G_langs=`cd $_G_ref_po_dir && echo *.po|$SED 's|\.po||g'` + test "$_G_langs" = '*' && _G_langs=x + for _G_po in $_G_langs; do + case $_G_po in x) continue;; esac + _G_new_po="$_G_ref_po_dir/$_G_po.po" + _G_cksum_file="$_G_ref_po_dir/$_G_po.s1" + if ! test -f "$_G_cksum_file" || + ! test -f "$_G_po_dir/$_G_po.po" || + ! $SHA1SUM -c --status "$_G_cksum_file" \ + < "$_G_new_po" > /dev/null; then + echo "updated $_G_po_dir/$_G_po.po..." + cp "$_G_new_po" "$_G_po_dir/$_G_po.po" \ + && $SHA1SUM < "$_G_new_po" > "$_G_cksum_file" fi done } -## ----------------- ## -## Global variables. ## -## ----------------- ## +## --------------- ## +## Option parsing. ## +## --------------- ## -EXIT_SUCCESS=0 -EXIT_FAILURE=1 -EXIT_MISMATCH=63 # $? = 63 is used to indicate version mismatch to missing. -EXIT_SKIP=77 # $? = 77 is used to indicate a skipped test to automake. +# Hook in the functions to make sure our own options are parsed during +# the option parsing loop. -exit_status=$EXIT_SUCCESS - -# Allow overriding, eg to get a function call trace: -# debug_cmd='eval echo "${FUNCNAME[0]} $*" >&2' bash bootstrap -debug_cmd="${debug_cmd-:}" -exit_cmd=: - -dirname='s|/[^/]*$||' -basename='s|^.*/||' - -nl=' +# Short help message in response to `-h'. Add to this in `bootstrap.conf' +# if you accept any additional options. +usage_message='Common Bootstrap Options: + -c, --copy copy files instead of creating symbolic links. + --debug enable verbose shell tracing + -n, --dry-run print commands rather than running them + -f, --force attempt to bootstrap even if the sources seem not + to have been checked out. + --gnulib-srcdir=DIRNAME + specify a local directory where gnulib sources + reside. Use this if you already have the gnulib + sources on your machine, and don'\''t want to waste + your bandwidth downloading them again. Defaults to + \$GNULIB_SRCDIR. + --skip-git do not fetch files from remote repositories + --skip-po do not download po files. + -v, --verbose verbosely report processing + --version print version information and exit + -W, --warnings=CATEGORY + report the warnings falling in CATEGORY [all] + -h, --help print short or long help message and exit ' -# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh -# is ksh but when the shell is invoked as "sh" and the current value of -# the _XPG environment variable is not equal to 1 (one), the special -# positional parameter $0, within a function call, is the name of the -# function. -progpath="$0" +# Additional text appended to `usage_message' in response to `--help'. +long_help_message=" +Warning categories include: + \`all' show all warnings + \`none' turn off all the warnings + \`error' warnings are treated as fatal errors + \`recommend' show warnings about missing recommended packages + \`settings' show warnings about missing \`bootstrap.conf' settings + \`upgrade' show warnings about out-dated files + +If the file $progpath.conf exists in the same directory as this script, +its contents are read as shell variables to configure the bootstrap. + +For build prerequisites, environment variables like \$AUTOCONF and +\$AMTAR are honored. + +Running without arguments will suffice in most cases. +" + +# Warning categories used by `bootstrap', append others if you use them +# in your `bootstrap.conf'. +warning_categories='recommend settings upgrade' + + +# bootstrap_options_prep [ARG]... +# ------------------------------- +# Preparation for options parsed by Bootstrap. +bootstrap_options_prep () +{ + $debug_cmd + + warning_func=func_error + + # Option defaults: + opt_copy=${copy-false} + opt_dry_run=false + opt_force=false + opt_gnulib_srcdir="$GNULIB_SRCDIR" + opt_skip_git=false + opt_skip_po=false + opt_warning= + + # Pass back the list of options we consumed. + func_quote_for_eval ${1+"$@"} + func_run_hooks_result="$func_quote_for_eval_result" +} +func_add_hook func_options_prep bootstrap_options_prep + + +# bootstrap_parse_options [ARG]... +# -------------------------------- +# Provide handling for Bootstrap specific options. Note +# `func_parse_options' passes in the unconsumed positional parameters, and +# this function has to pass back whatever remains after its own +# processing in the `func_run_hooks_result' variable. +bootstrap_parse_options () +{ + $debug_cmd + + # Perform our own loop to consume as many options as possible in + # each iteration. + while test $# -gt 0; do + _G_opt="$1" + shift + case $_G_opt in + --dry-run|--dryrun|-n) + opt_dry_run=: ;; + --copy|-c) opt_copy=: ;; + --force|-f) opt_force=: ;; + + --gnulib-srcdir) + test $# = 0 && func_missing_arg $_G_opt && break + opt_gnulib_srcdir="$1" + shift + ;; + + --skip-git) opt_skip_git=: ;; + --skip-po) opt_skip_po=: ;; + + --warnings|--warning|-W) + test $# = 0 && func_missing_arg $_G_opt && break + case " $1 " in + " all ") + opt_warning=" $warning_categories" + ;; + " none ") + opt_warning=" none" + warning_func=: + ;; + " error ") + warning_func=func_fatal_error + ;; + *" $warning_categories "*) + func_append_u opt_warning " $1" + ;; + *) + func_fatal_error \ + "unsupported warning category: \`$1'" + ;; + esac + shift + ;; + + # Separate optargs to short options: + -W*) + func_split_short_opt "$_G_opt" + set dummy "$func_split_short_opt_name" \ + "$func_split_short_opt_arg" ${1+"$@"} + shift + ;; + + # Separate non-argument short options: + -c*|-f*|-n*) + func_split_short_opt "$_G_opt" + set dummy "$func_split_short_opt_name" \ + "-$func_split_short_opt_arg" ${1+"$@"} + shift + ;; + + *) set dummy "$_G_opt" ${1+"$@"}; shift; break ;; + esac + done + + # save modified positional parameters for caller + func_quote_for_eval ${1+"$@"} + func_parse_options_result="$func_quote_for_eval_result" +} +func_add_hook func_parse_options bootstrap_parse_options + + +# bootstrap_validate_options [ARG]... +# ----------------------------------- +# Perform any sanity checks on option settings and/or unconsumed +# arguments. +bootstrap_validate_options () +{ + $debug_cmd + + # Display all warnings if -W was not given. + test -n "$opt_warning" || opt_warning="$warning_categories" + + # Validate options. + test $# -gt 0 \ + && func_fatal_help "too many arguments" + + # Pass back the list of unconsumed options left. + func_quote_for_eval ${1+"$@"} + func_validate_options_result="$func_quote_for_eval_result" +} -# The name of this program. -progname=`echo "$progpath" |$SED "$basename"` ## -------------------------------------------------- ## ## Source package customisations in `bootstrap.conf'. ## @@ -3142,7 +2461,7 @@ esac func_bootstrap ${1+"$@"} # The End. -exit $exit_status +exit ${exit_status-$EXIT_SUCCESS} # Local variables: # mode: shell-script diff --git a/bootstrap.conf b/bootstrap.conf index 116023c1..0f89559e 100644 --- a/bootstrap.conf +++ b/bootstrap.conf @@ -1,4 +1,4 @@ -# bootstrap.conf (GNU Libtool) version 2011-10-20 +# bootstrap.conf (GNU Libtool) version 2011-11-02 # # Copyright (C) 2010, 2011 Free Software Foundation, Inc. # Written by Gary V. Vaughan, 2010 @@ -108,7 +108,7 @@ require_bootstrap_uptodate=: ## ------------------- ## # func_reconfigure -# ---------------- +# ------------------ # In addition to needing to autoreconf several directories, Libtool # provides `libtoolize' and doesn't use `autopoint', so we can use a # somewhat simpler `func_reconfigure' implementation. diff --git a/libltdl/config/extract-trace b/libltdl/config/extract-trace new file mode 100755 index 00000000..a2301409 --- /dev/null +++ b/libltdl/config/extract-trace @@ -0,0 +1,407 @@ +#! /bin/sh + +# Make sure we've evaluated the option-parser library. +test -n "$progpath" || . `echo "$0" |${SED-sed} 's,[^/]*$,,'`"/options-parser" + +# Set a version string. +scriptversion=2011-11-04.09; # UTC + +# Extract macro arguments from autotools input with GNU M4. +# Written by Gary V. Vaughan, 2010 +# +# Copyright (C) 2010, 2011 Free Software Foundation, Inc. +# This is free software; see the source for copying conditions. There is NO +# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# +##### PLEASE CHECK `--version' WORKS AFTER EDITING THE ABOVE COPYRIGHT ##### + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + + +## ------ ## +## Usage. ## +## ------ ## + +# Run `./extract-trace --help' for help with using this script from the +# command line. +# +# Or source first `options-parser' and then this file into your own +# scripts in order to make use of the function and variable framework +# they define, and also to avoid the overhead of forking to run this +# script in its own process on every call. + + +## -------------- ## +## Configuration. ## +## -------------- ## + +usage='$progname MACRO_NAME FILE [...]' + +long_help_message=' +The first argument to this program is the name of an autotools macro +whose arguments you want to extract by examining the files listed in the +remaining arguments using the same tool that Autoconf and Automake use, +GNU M4. + +The arguments are returned separated by colons, with each traced call +on a separate line.' + + + +## ------------------## +## Helper functions. ## +## ------------------## + +# This section contains the helper functions used by the rest of +# `extract-trace'. + + +# func_autoconf_configure MAYBE-CONFIGURE-FILE +# -------------------------------------------- +# Ensure that MAYBE-CONFIGURE-FILE is the name of a file in the current +# directory which contains an uncommented call to AC_INIT. +func_autoconf_configure () +{ + $debug_cmd + + _G_sed_no_comment='s,#.*$,,; s,^dnl .*$,,; s, dnl .*$,,;' + _G_ac_init= + + # If we were passed a genuine file, make sure it calls AC_INIT. + test -f "$1" \ + && _G_ac_init=`$SED "$_G_sed_no_comment" "$1" |grep AC_INIT` + + # Otherwise it is not a genuine Autoconf input file. + test -n "$_G_ac_init" + _G_status=$? + + test $_G_status -ne 0 \ + && func_verbose "\`$1' not using Autoconf" + + (exit $_G_status) +} + + +# func_find_tool ENVVAR NAMES... +# ------------------------------ +# Search for a required program. Use the value of ENVVAR, if set, +# otherwise find the first of the NAMES that can be run (i.e., +# supports --version). If found, set ENVVAR to the program name, +# die otherwise. +func_find_tool () +{ + $debug_cmd + + _G_find_tool_envvar=$1 + shift + _G_find_tool_names=$@ + eval "_G_find_tool_res=\$$_G_find_tool_envvar" + if test -n "$_G_find_tool_res"; then + _G_find_tool_error_prefix="\$$find_tool_envvar: " + else + for _G_prog + do + if func_tool_version_output $_G_prog >/dev/null; then + _G_find_tool_res=$_G_prog + break + fi + done + fi + if test -n "$_G_find_tool_res"; then + func_tool_version_output >/dev/null $_G_find_tool_res "\ +${_G_find_tool_error_prefix}Cannot run \`$_G_find_tool_res --version'" + + # Make sure the result is exported to the environment for children + # to use. + eval "$_G_find_tool_envvar=\$_G_find_tool_res" + eval "export $_G_find_tool_envvar" + else + func_error "\ +One of these is required: + $_G_find_tool_names" + fi +} + + +# func_tool_version_output CMD [FATAL-ERROR-MSG] +# ---------------------------------------------- +# Attempt to run `CMD --version', discarding errors. The output can be +# ignored by redirecting stdout, and this function used simply to test +# whether the command exists and exits normally when passed a +# `--version' argument. +# When FATAL-ERROR-MSG is given, then this function will display the +# message and exit if running `CMD --version' returns a non-zero exit +# status. +func_tool_version_output () +{ + $debug_cmd + + _G_cmd=$1 + _G_fatal_error_msg=$2 + + # Some tools, like `git2cl' produce thousands of lines of output + # unless stdin is /dev/null - in that case we want to return + # successfully without saving all of that output. Other tools, + # such as `help2man' exit with a non-zero status when stdin comes + # from /dev/null, so we re-execute without /dev/null if that + # happens. This means that occasionally, the output from both calls + # ends up in the result, but the alternative would be to discard the + # output from one call, and hope the other produces something useful. + { $_G_cmd --version /dev/null + _G_status=$? + + test $_G_status -ne 0 && test -n "$_G_fatal_error_msg" \ + && func_fatal_error "$_G_fatal_error_msg" + + (exit $_G_status) +} + + +## -------------------- ## +## Resource management. ## +## -------------------- ## + +# This section contains definitions for functions that each ensure a +# particular resource (a file, or a non-empty configuration variable for +# example) is available, and if appropriate to extract default values +# from pertinent package files. Where a variable already has a non- +# empty value (as set by the package's `bootstrap.conf'), that value is +# used in preference to deriving the default. Call them using their +# associated `require_*' variable to ensure that they are executed, at +# most, once. +# +# It's entirely deliberate that calling these functions can set +# variables that don't obey the namespace limitations obeyed by the rest +# of this file, in order that that they be as useful as possible to +# callers. + + +# require_configure_ac +# -------------------- +# Ensure that there is a `configure.ac' or `configure.in' file in the +# current directory which contains an uncommented call to AC_INIT, and +# that `$configure_ac' contains its name. +require_configure_ac=func_require_configure_ac +func_require_configure_ac () +{ + $debug_cmd + + test -z "$configure_ac" \ + && func_autoconf_configure configure.ac && configure_ac=configure.ac + test -z "$configure_ac" \ + && func_autoconf_configure configure.in && configure_ac=configure.in + test -z "$configure_ac" \ + || func_verbose "found \`$configure_ac'" + + require_configure_ac=: +} + + +# require_gnu_m4 +# -------------- +# Search for GNU M4, and export it in $M4. +require_gnu_m4=func_require_gnu_m4 +func_require_gnu_m4 () +{ + $debug_cmd + + test -n "$M4" || { + # Find the first m4 binary that responds to --version. + func_find_tool M4 gm4 gnum4 m4 + } + + test -n "$M4" || func_fatal_error "\ +Please install GNU M4, or \`export M4=/path/to/gnu/m4'." + + func_verbose "export M4='$M4'" + + # Make sure the search result is visible to subshells + export M4 + + require_gnu_m4=: +} + + +## --------------- ## +## Core functions. ## +## --------------- ## + +# This section contains the high level functions used when calling this +# file as a script. `func_extract_trace' is probably the only one that you +# won't want to replace if you source this file into your own script. + + +# func_extract_trace MACRO_NAMES [FILENAME]... +# -------------------------------------------- +# set `$func_extract_trace_result' to a colon delimited list of arguments +# to any of the comma separated list of MACRO_NAMES in FILENAME. If no +# FILENAME is given, then `$configure_ac' is assumed. +func_extract_trace () +{ + $debug_cmd + + $require_configure_ac + $require_gnu_m4 + + _G_m4_traces=`echo "--trace=$1" |$SED 's%,% --trace=%g'` + _G_re_macros=`echo "($1)" |$SED 's%,%|%g'` + _G_macros="$1"; shift + test $# -gt 0 || { + set dummy $configure_ac + shift + } + + # Generate an error if the first file is missing + <"$1" + + # Sadly, we can't use `autom4te' tracing to extract macro arguments, + # because it complains about things we want to ignore at bootstrap + # time - like missing m4_include files; AC_PREREQ being newer than + # the installed autoconf; and returns nothing when tracing + # `AM_INIT_AUTOMAKE' when aclocal hasn't been generated yet. + # + # The following tries to emulate a less persnickety version of (and + # due to not having to wait for Perl startup on every invocation, + # it's probably faster too): + # + # autom4te --language=Autoconf --trace=$my_macro:\$% "$@" + # + # First we give a minimal set of macro declarations to M4 to prime + # it for reading Autoconf macros, while still providing some of the + # functionality generally used at m4-time to supply dynamic + # arguments to Autocof functions, but without following + # `m4_s?include' files. + _G_mini=' + # Initialisation. + m4_changequote([,]) + m4_define([m4_copy], [m4_define([$2], m4_defn([$1]))]) + m4_define([m4_rename], [m4_copy([$1], [$2])m4_undefine([$1])]) + + # Disable these macros. + m4_undefine([m4_dnl]) + m4_undefine([m4_include]) + m4_undefine([m4_m4exit]) + m4_undefine([m4_m4wrap]) + m4_undefine([m4_maketemp]) + + # Copy and rename macros not handled by "m4 --prefix". + m4_define([dnl], [m4_builtin([dnl])]) + m4_copy([m4_define], [m4_defun]) + m4_rename([m4_ifelse], [m4_if]) + m4_ifdef([m4_mkstemp], [m4_undefine([m4_mkstemp])]) + m4_rename([m4_patsubst], [m4_bpatsubst]) + m4_rename([m4_regexp], [m4_bregexp]) + + # "m4sugar.mini" - useful m4-time macros for dynamic arguments. + # If we discover packages that need more m4 macros defined in + # order to bootstrap correctly, add them here: + m4_define([m4_bmatch], + [m4_if([$#], 0, [], [$#], 1, [], [$#], 2, [$2], + [m4_if(m4_bregexp([$1], [$2]), -1, + [$0([$1], m4_shift3($@))], [$3])])]) + m4_define([m4_ifndef], [m4_ifdef([$1], [$3], [$2])]) + m4_define([m4_ifset], + [m4_ifdef([$1], [m4_ifval(m4_defn([$1]), [$2], [$3])], [$3])]) + m4_define([m4_require], [$1]) + m4_define([m4_shift3], [m4_shift(m4shift(m4shift($@)))]) + + # "autoconf.mini" - things from autoconf macros we care about. + m4_copy([m4_defun], [AC_DEFUN]) + + # Dummy definitions for the macros we want to trace. + # AM_INIT_AUTOMAKE at least produces no trace without this. + ' + + _G_save=$IFS + IFS=, + for _G_macro in $_G_macros; do + IFS=$_G_save + func_append _G_mini "AC_DEFUN([$_G_macro])$nl" + done + IFS=$_G_save + + # We discard M4's stdout, but the M4 trace output from reading our + # "autoconf.mini" followed by any other files passed to this + # function is then scanned by sed to transform it into a colon + # delimited argument list assigned to a shell variable. + _G_transform='s,#.*$,,; s,^dnl .*$,,; s, dnl .*$,,;' + + # Unfortunately, alternation in regexp addresses doesn't work in at + # least BSD (and hence Mac OS X) sed, so we have to append a capture + # and print block for each traced macro to the sed transform script. + _G_save=$IFS + IFS=, + for _G_macro in $_G_macros; do + IFS=$_G_save + func_append _G_transform ' + /^m4trace: -1- '"$_G_macro"'/ { + s,^m4trace: -1- '"$_G_macro"'[([]*,, + s|], [[]|:|g + s|[])]*$|:| + s|\(.\):$|\1| + p + }' + done + IFS=$_G_save + + # Save the command pipeline results for further use by callers of + # this function. + func_extract_trace_result=`echo "$_G_mini" \ + |$M4 -daq --prefix $_G_m4_traces - "$@" 2>&1 1>/dev/null \ + |$SED -n -e "$_G_transform"` +} + + +# func_main [ARG]... +# ------------------ +func_main () +{ + $debug_cmd + + # Option processing. + func_options "$@" + eval set dummy "$func_options_result"; shift + + # Validate remaining non-option arguments. + test $# -gt 1 \ + || func_fatal_help "not enough arguments" + + # Pass non-option arguments to extraction function. + func_extract_trace "$@" + + # Display results. + test -n "$func_extract_trace_result" \ + && echo "$func_extract_trace_result" + + # The End. + exit $EXIT_SUCCESS +} + + +## --------------------------- ## +## Actually perform the trace. ## +## --------------------------- ## + +# Only call `func_main' if this script was called directly. +test extract-trace = "$progname" && func_main "$@" + +# Local variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC" +# time-stamp-end: "; # UTC" +# End: diff --git a/libltdl/config/options-parser b/libltdl/config/options-parser new file mode 100644 index 00000000..4f03dcec --- /dev/null +++ b/libltdl/config/options-parser @@ -0,0 +1,790 @@ +#! /bin/sh + +# Set a version string for this script. +scriptversion=2011-11-04.03; # UTC + +# A pluggable option parser for Bourne shell. +# Written by Gary V. Vaughan, 2010 + +# Copyright (C) 2010, 2011 Free Software Foundation, Inc. +# This is free software; see the source for copying conditions. There is NO +# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# Please report bugs or propose patches to bug-gnulib@gnu.org. + + +## ------ ## +## Usage. ## +## ------ ## + +# This file is a library for parsing options in your shell scripts along +# with assorted other useful supporting features that you can make use +# of too. +# +# For the simplest scripts you might need only: +# +# #!/bin/sh +# . relative/path/to/options-parser +# scriptversion=1.0 +# func_options ${1+"$@"} +# eval set dummy "$func_options_result"; shift +# ...rest of your script... +# +# In order for the `--version' option to work, you will need to have a +# suitably formatted comment like the one at the top of this file +# starting with '# Written by ' and ending with '# warranty; '. +# +# For `-h' and `--help' to work, you will also need a one line +# description of your script's purpose in a comment directly above the +# '# Written by ' line, like the one at the top of this file. +# +# The default options also support `--debug', which will turn on shell +# execution tracing (see the comment above debug_cmd below for another +# use), and `--verbose' and the func_verbose function to allow your script +# to display verbose messages only when your user has specified +# `--verbose'. +# +# After sourcing this file, you can plug processing for additional +# options by amending the variables from the `Configuration' section +# below, and following the instructions in the `Option parsing' +# section further down. + +## -------------------- ## +## Shell normalisation. ## +## -------------------- ## + +# Some shells need a little help to be as Bourne compatible as possible. +# Before doing anything else, make sure all that help has been provided! + +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in *posix*) set -o posix ;; esac +fi + +# NLS nuisances. +LANGUAGE=C +export LANGUAGE + +# Ensure file names are sorted consistently across platforms. +LC_ALL=C +export LC_ALL + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + + +## ------------------------------- ## +## User overridable command paths. ## +## ------------------------------- ## + +# All uppercase variable names are used for environment variables. These +# variables can be overridden by the user before calling a script that +# uses them if a suitable command of that name is not already available +# in the command search PATH. + +: ${SED="sed"} + + +## -------------- ## +## Configuration. ## +## -------------- ## + +# You should override these variables in your script after sourcing this +# file so that they reflect the customisations you have added to the +# option parser. + +# The usage line for option parsing errors and the start of `-h' and +# `--help' output messages. You can embed shell variables for delayed +# expansion at the time the message is displayed, but you will need to +# quote other shell meta-characters carefully to prevent them being +# expanded when the contents are evaled. +usage='$progpath [OPTION]...' + +# Short help message in response to `-h' and `--help'. Add to this or +# override it after sourcing this library to reflect the full set of +# options your script accepts. +usage_message="\ + --debug enable verbose shell tracing + -v, --verbose verbosely report processing + --version print version information and exit + -h, --help print short or long help message and exit +" + +# Additional text appended to `usage_message' in response to `--help'. +long_help_message="" + +# Help message printed before fatal option parsing errors. +fatal_help='Try \`$progname --help'\'' for more information.' + + + +## ----------------- ## +## Global variables. ## +## ----------------- ## + +# Except for the global variables explicitly listed below, the following +# functions in the '^func_' namespace, and the '^require_' namespace +# variables initialised in the `Resource management' section, sourcing +# this file will not pollute your global namespace with anything +# else. There's no portable way to scope variables in Bourne shell +# though, so actually running these functions will sometimes place +# results into a variable named after the function, and often use +# temporary variables in the `^_G_' namespace. If you are careful to +# avoid using those namespaces casually in your sourcing script, things +# should continue to work as you expect. And, of course, you can freely +# overwrite any of the functions or variables defined here before +# calling anything to customize them. + +EXIT_SUCCESS=0 +EXIT_FAILURE=1 +EXIT_MISMATCH=63 # $? = 63 is used to indicate version mismatch to missing. +EXIT_SKIP=77 # $? = 77 is used to indicate a skipped test to automake. + +# Allow overriding, eg assuming that you follow the convention of +# putting `$debug_cmd' at the start of all your functions, you can get +# bash to show function call trace with: +# debug_cmd='eval echo "${FUNCNAME[0]} $*" >&2' bash bootstrap +debug_cmd="${debug_cmd-:}" +exit_cmd=: + +dirname="$SED -e "'s|/[^/]*$||' +basename="$SED -e "'s|^.*/||' + +nl=' +' + +# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh +# is ksh but when the shell is invoked as "sh" and the current value of +# the _XPG environment variable is not equal to 1 (one), the special +# positional parameter $0, within a function call, is the name of the +# function. +progpath="$0" + +# The name of this program. +progname=`echo "$progpath" |$basename` + + +## ------------------------- ## +## Hook function management. ## +## ------------------------- ## + +# This section contains functions for adding, removing, and running hooks +# to the main code. A hook is just a named list of of function, that can +# be run in order later on. + + +# func_append VAR VALUE +# --------------------- +# Append VALUE onto the existing contents of VAR. +if (eval 'x=a; x+=" b"; test "x$x" = "xa b"') 2>/dev/null +then + # This is an XSI compatible shell, allowing a faster implementation... + eval 'func_append () + { + $debug_cmd + + eval "$1+=\$2" + }' +else + # ...otherwise fall back to using expr, which is often a shell builtin. + func_append () + { + $debug_cmd + + eval "$1=\$$1\$2" + } +fi + + +# func_hookable FUNC_NAME +# ----------------------- +# Declare that FUNC_NAME will run hooks added with +# `func_add_hook FUNC_NAME ...'. +func_hookable () +{ + $debug_cmd + + func_append hookable_fns " $1" +} + + +# func_add_hook FUNC_NAME HOOK_FUNC +# --------------------------------- +# Request that FUNC_NAME call HOOK_FUNC before it returns. FUNC_NAME must +# first have been declared "hookable" by a call to `func_hookable'. +func_add_hook () +{ + $debug_cmd + + case " $hookable_fns " in + *" $1 "*) ;; + *) func_fatal_error "\`$1' does not accept hook functions." ;; + esac + + eval func_append ${1}_hooks '" $2"' +} + + +# func_remove_hook FUNC_NAME HOOK_FUNC +# ------------------------------------ +# Remove HOOK_FUNC from the list of functions called by FUNC_NAME. +func_remove_hook () +{ + $debug_cmd + + eval ${1}_hooks='`echo "\$'$1'_hooks" |$SED "s| '$2'||"`' +} + + +# func_run_hooks FUNC_NAME [ARG]... +# --------------------------------- +# Run all hook functions registered to FUNC_NAME. +# It is assumed that the list of hook functions contains nothing more +# than a whitespace-delimited list of legal shell function names, and +# no effort is wasted trying to catch shell meta-characters or preserve +# whitespace. +func_run_hooks () +{ + $debug_cmd + + case " $hookable_fns " in + *" $1 "*) ;; + *) func_fatal_error "\`$1' does not support hook funcions.n" ;; + esac + + eval _G_hook_fns="\$$1_hooks" + + # shift away the first argument (FUNC_NAME) + shift + func_quote_for_eval ${1+"$@"} + func_run_hooks_result=$func_quote_for_eval_result + + for _G_hook in $_G_hook_fns; do + eval $_G_hook '"$@"' + + # store returned options list back into positional + # parameters for next `cmd' execution. + eval set dummy $func_run_hooks_result; shift + done +} + + + +## --------------- ## +## Option parsing. ## +## --------------- ## + +# In order to add your own option parsing hooks, you must accept the +# full positional parameter list in your hook function, remove any +# options that you action, and then pass back the remaining unprocessed +# options in `func_run_hooks_result', escaped suitably for `eval'. Like +# this: +# +# my_options_prep () +# { +# $debug_cmd +# +# # Extend the existing usage message. +# usage_message="$usage_message"' +# -s, --silent don'\''t print informational messages +# ' +# +# func_quote_for_eval ${1+"$@"} +# func_run_hooks_result=$func_quote_for_eval_result +# } +# func_add_hook func_options_prep my_options_prep +# +# +# my_silent_option () +# { +# $debug_cmd +# +# # Note that for efficiency, we parse as many options as we can +# # recognise in a loop before passing the remainder back to the +# # caller on the first unrecognised argument we encounter. +# while test $# -gt 0; do +# opt=$1; shift +# case $opt in +# --silent|-s) opt_silent=: ;; +# # Separate non-argument short options: +# -s*) func_split_short_opt "$_G_opt" +# set dummy "$func_split_short_opt_name" \ +# "-$func_split_short_opt_arg" ${1+"$@"} +# shift +# ;; +# *) set dummy "$_G_opt" "$*"; shift; break ;; +# esac +# done +# +# func_quote_for_eval ${1+"$@"} +# func_run_hooks_result=$func_quote_for_eval_result +# } +# func_add_hook func_parse_options my_silent_option +# +# +# my_option_validation () +# { +# $debug_cmd +# +# $opt_silent && $opt_verbose && func_fatal_help "\ +# \`--silent' and \`--verbose' options are mutually exclusive." +# +# func_quote_for_eval ${1+"$@"} +# func_run_hooks_result=$func_quote_for_eval_result +# } +# +# You'll alse need to manually amend $usage_message to reflect the extra +# options you parse. It's preferable to append if you can, so that +# multiple option parsing hooks can be added safely. + + +# func_options [ARG]... +# --------------------- +# All the functions called inside func_options are hookable. See the +# individual implementations for details. +func_hookable func_options +func_options () +{ + $debug_cmd + + func_options_prep ${1+"$@"} + eval func_parse_options \ + ${func_options_prep_result+"$func_options_prep_result"} + eval func_validate_options \ + ${func_parse_options_result+"$func_parse_options_result"} + + eval func_run_hooks func_options \ + ${func_validate_options_result+"$func_validate_options_result"} + + # save modified positional parameters for caller + func_options_result="$func_run_hooks_result" +} + + +# func_options_prep [ARG]... +# -------------------------- +# All initialisations required before starting the option parse loop. +# Note that when calling hook functions, we pass through the list of +# positional parameters. If a hook function modifies that list, and +# needs to propogate that back to rest of this script, then the complete +# modified list must be put in `func_run_hooks_result' before +# returning. +func_hookable func_options_prep +func_options_prep () +{ + $debug_cmd + + # Option defaults: + opt_verbose=false + + func_run_hooks func_options_prep ${1+"$@"} + + # save modified positional parameters for caller + func_options_prep_result=$func_run_hooks_result +} + + +# func_parse_options [ARG]... +# --------------------------- +# The main option parsing loop. +func_hookable func_parse_options +func_parse_options () +{ + $debug_cmd + + func_parse_options_result= + + # this just eases exit handling + while test $# -gt 0; do + # Defer to hook functions for initial option parsing, so they + # get priority in the event of reusing an option name. + func_run_hooks func_parse_options ${1+"$@"} + + # Adjust func_parse_options positional parameters to match + eval set dummy $func_run_hooks_result; shift + + _G_opt=$1 + shift + case $_G_opt in + --debug|-x) debug_cmd='set -x' + func_echo "enabling shell trace mode" + $debug_cmd + ;; + + --verbose|-v) opt_verbose=: ;; + --version) func_version ;; + -\?|-h) func_usage ;; + --help) func_help ;; + + # Separate non-argument short options: + -\?*|-h*|-v*|-x*) + func_split_short_opt "$_G_opt" + set dummy "$func_split_short_opt_name" \ + "-$func_split_short_opt_arg" ${1+"$@"} + shift + ;; + + --) set dummy "$_G_opt" "*"; shift; break ;; + -*) func_fatal_help "unrecognised option: \`$_G_opt'" ;; + *) set dummy "$_G_opt" "$*"; shift; break ;; + esac + done + + # save modified positional parameters for caller + func_quote_for_eval ${1+"$@"} + func_parse_options_result=$func_quote_for_eval_result +} + + +# func_validate_options [ARG]... +# ------------------------------ +# Perform any sanity checks on option settings and/or unconsumed +# arguments. +func_hookable func_validate_options +func_validate_options () +{ + $debug_cmd + + func_run_hooks func_validate_options ${1+"$@"} + + # Bail if the options were screwed! + $exit_cmd $EXIT_FAILURE + + # save modified positional parameters for caller + func_validate_options_result=$func_run_hooks_result +} + + + +## -------------------- ## +## Resource management. ## +## -------------------- ## + +# This section contains definitions for functions that each ensure a +# particular resource (a file, or a non-empty configuration variable for +# example) is available, and if appropriate to extract default values +# from pertinent package files. Call them using their associated +# `require_*' variable to ensure that they are executed, at most, once. +# +# It's entirely deliberate that calling these functions can set +# variables that don't obey the namespace limitations obeyed by the rest +# of this file, in order that that they be as useful as possible to +# callers. + + +# require_term_colors +# ------------------- +# Allow display of bold text on terminals that support it. +require_term_colors=func_require_term_colors +func_require_term_colors () +{ + $debug_cmd + + test -t 1 && { + test -n "`tput sgr0 2>/dev/null`" && { + tc_reset=`tput sgr0` + test -n "`tput bold 2>/dev/null`" && tc_bold=`tput bold` + tc_standout=$tc_bold + test -n "`tput smso 2>/dev/null`" && tc_standout=`tput smso` + test -n "`tput setaf 1 2>/dev/null`" && tc_red=`tput setaf 1` + test -n "`tput setaf 2 2>/dev/null`" && tc_green=`tput setaf 2` + test -n "`tput setaf 4 2>/dev/null`" && tc_blue=`tput setaf 4` + test -n "`tput setaf 5 2>/dev/null`" && tc_cyan=`tput setaf 5` + } + } + + require_term_colors=: +} + + +## ------------------## +## Helper functions. ## +## ------------------## + +# This section contains the helper functions used by the rest of the +# hookable option parser framework in ascii-betical order. + +# func_echo ARG... +# ---------------- +# Echo program name prefixed message, taking newlines into account. +func_echo () +{ + _G_message=$* + + save_IFS=$IFS + IFS=$nl + for _G_line in $_G_message; do + IFS=$save_IFS + echo "$progname: $_G_line" + done + IFS=$save_IFS +} + + +# func_error ARG... +# ----------------- +# Echo program name prefixed message to standard error. +func_error () +{ + $require_term_colors + + _G_message=$* + _G_prefix="$progname: ${tc_standout}${tc_red}error${tc_reset}: " + + save_IFS=$IFS + IFS=$nl + for _G_line in $_G_message; do + IFS=$save_IFS + echo "$_G_prefix${tc_bold}$_G_line${tc_reset}" 1>&2 + _G_prefix="$progname: " + done + IFS=$save_IFS +} + + +# func_fatal_error ARG... +# ----------------------- +# Echo program name prefixed message to standard error, and exit. +func_fatal_error () +{ + func_error ${1+"$@"} + exit $EXIT_FAILURE +} + + +# func_fatal_help ARG... +# ---------------------- +# Echo program name prefixed message to standard error, followed by +# a help hint, and exit. +func_fatal_help () +{ + $debug_cmd + + eval echo \""Usage: $usage"\" + eval echo \""$fatal_help"\" + func_error ${1+"$@"} + exit $EXIT_FAILURE +} + + +# func_help +# --------- +# Echo long help message to standard output and exit. +func_help () +{ + $debug_cmd + + func_usage_message + echo "$long_help_message" + exit 0 +} + + +# func_missing_arg ARGNAME +# ------------------------ +# Echo program name prefixed message to standard error and set global +# exit_cmd. +func_missing_arg () +{ + $debug_cmd + + func_error "Missing argument for \`$1'." + exit_cmd=exit +} + + +# func_quote_for_eval ARG... +# -------------------------- +# Aesthetically quote ARGs to be evaled later. +# This function returns two values: FN_QUOTE_FOR_EVAL_RESULT +# is double-quoted, suitable for a subsequent eval, whereas +# FN_QUOTE_FOR_EVAL_UNQUOTED_RESULT has merely all characters +# which are still active within double quotes backslashified. +func_quote_for_eval () +{ + $debug_cmd + + _G_sed_quote_subst='s|\([`"$\\]\)|\\\1|g' + + func_quote_for_eval_result= + while test $# -gt 0; do + case $1 in + *[\\\`\"\$]*) + _G_unquoted_arg=`printf '%s\n' "$1" |$SED "$_G_sed_quote_subst"` ;; + *) + _G_unquoted_arg="$1" ;; + esac + + case $_G_unquoted_arg in + # Double-quote args containing shell metacharacters to delay + # word splitting, command substitution and variable expansion + # for a subsequent eval. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, so we specify it separately. + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + _G_quoted_arg="\"$_G_unquoted_arg\"" + ;; + *) + _G_quoted_arg="$_G_unquoted_arg" ;; + esac + test -n "$func_quote_for_eval_result" \ + && func_append func_quote_for_eval_result " " + func_append func_quote_for_eval_result "$_G_quoted_arg" + shift + done +} + + +# func_split_equals STRING +# ------------------------ +# Set func_split_equals_lhs and func_split_equals_rhs shell variables after +# splitting STRING at the `=' sign. +if (eval 'x='--ab=cd'; y=${x#*=}; z=${x%%=*}; test x$y$z = xcd--ab') 2>/dev/null +then + # This is an XSI compatible shell, allowing a faster implementation... + eval 'func_split_equals () + { + $debug_cmd + + func_split_equals_lhs=${1%%=*} + func_split_equals_rhs=${1#*=} + test "x$func_split_equals_lhs" = "x$1" \ + && func_split_equals_rhs="" + }' +else + # ...otherwise fall back to using expr, which is often a shell builtin. + func_split_equals () + { + $debug_cmd + + func_split_equals_lhs=`expr "x$1" : 'x\([^=]*)'` + func_split_equals_rhs="" + test "x$func_split_equals_lhs" = "x$1" \ + || func_split_equals_rhs=`expr "x$1" : 'x[^=]*=\(.*\)$'` + } +fi #func_split_equals + + +# func_split_short_opt SHORTOPT +# ----------------------------- +# Set func_split_short_opt_name and func_split_short_opt_arg shell +# variables after splitting SHORTOPT after the 2nd character. +if (eval 'x=-abc; y=${x#??}; z=${x%$y}; test x$y$z = xbc-a') 2>/dev/null +then + # This is an XSI compatible shell, allowing a faster implementation... + eval 'func_split_short_opt () + { + $debug_cmd + + func_split_short_opt_arg=${1#??} + func_split_short_opt_name=${1%"$func_split_short_opt_arg"} + }' +else + # ...otherwise fall back to using expr, which is often a shell builtin. + func_split_short_opt () + { + $debug_cmd + + func_split_short_opt_name=`expr "x$1" : 'x-\(.\)'` + func_split_short_opt_arg=`expr "x$1" : 'x-.\(.*\)$'` + } +fi #func_split_short_opt + + +# func_usage +# ---------- +# Echo short help message to standard output and exit. +func_usage () +{ + $debug_cmd + + func_usage_message + echo "Run \`$progname --help |${PAGER-more}' for full usage" + exit 0 +} + + +# func_usage_message +# ------------------ +# Echo short help message to standard output. +func_usage_message () +{ + $debug_cmd + + eval echo \""$usage"\" + echo + $SED -n 's|^# ||;/^Written by/{x;p;x;};h' < "$progpath" + echo + eval echo \""$usage_message"\" +} + + +# func_verbose ARG... +# ------------------- +# Echo program name prefixed message in verbose mode only. +func_verbose () +{ + $opt_verbose && func_echo ${1+"$@"} +} + + +# func_version +# ------------ +# Echo version message to standard output and exit. +func_version () +{ + $debug_cmd + + printf '%s\n' "$progname $scriptversion" + $SED -n '/(C)/!b go + :more + /\./!{ + N + s|\n# | | + b more + } + :go + /^# Written by /,/# warranty; / { + s|^# || + s|^# *$|| + s|\((C)\)[ 0-9,-]*[ ,-]\([1-9][0-9]* \)|\1 \2| + p + } + /^# Written by / { + s|^# || + p + }' < "$progpath" + + exit $? +} + + +# Local variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC" +# time-stamp-end: "; # UTC" +# End: