| #! /bin/sh |
| |
| # Source required external libraries. |
| . `echo "$0" |${SED-sed} 's|[^/]*$||'`"build-aux/options-parser" |
| . `echo "$0" |${SED-sed} 's|[^/]*$||'`"build-aux/extract-trace" |
| |
| # Set a version string for *this* script. |
| scriptversion=2011-11-21.09; # UTC |
| |
| # Bootstrap this package from checked-out sources. |
| # Written by Gary V. Vaughan, 2010 |
| |
| # Copyright (C) 2010-2012 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 <http://www.gnu.org/licenses/>. |
| |
| # Originally written by Paul Eggert. The canonical version of this |
| # script is maintained as build-aux/bootstrap in gnulib, however, to |
| # be useful to your project, you should place a copy of it under |
| # version control in the top-level directory of your project. The |
| # intent is that all customization can be done with a bootstrap.conf |
| # file also maintained in your version control; gnulib comes with a |
| # template build-aux/bootstrap.conf to get you started. |
| |
| # Please report bugs or propose patches to bug-gnulib@gnu.org. |
| |
| |
| ## ================================================================== ## |
| ## ## |
| ## DO NOT EDIT THIS FILE, CUSTOMIZE IT USING A BOOTSTRAP.CONF ## |
| ## ## |
| ## ================================================================== ## |
| |
| ## ------------------------------- ## |
| ## User overridable command paths. ## |
| ## ------------------------------- ## |
| |
| # All uppercase denotes values stored in the environment. These |
| # variables should generally be overridden by the user - however, we do |
| # set them to `true' in some parts of this script to prevent them being |
| # called at the wrong time by other tools that we call (`autoreconf', |
| # for example). |
| # |
| # 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"} |
| : ${AUTOHEADER="autoheader"} |
| : ${AUTOM4TE="autom4te"} |
| : ${AUTOHEADER="autoheader"} |
| : ${AUTOMAKE="automake"} |
| : ${AUTOPOINT="autopoint"} |
| : ${AUTORECONF="autoreconf"} |
| : ${CMP="cmp"} |
| : ${CONFIG_SHELL="/bin/sh"} |
| : ${DIFF="diff"} |
| : ${EGREP="grep -E"} |
| : ${FGREP="grep -F"} |
| : ${GIT="git"} |
| : ${GREP="grep"} |
| : ${LN_S="ln -s"} |
| : ${RM="rm"} |
| : ${SED="sed"} |
| |
| export ACLOCAL |
| export AUTOCONF |
| export AUTOHEADER |
| export AUTOM4TE |
| export AUTOHEADER |
| export AUTOMAKE |
| export AUTOPOINT |
| export AUTORECONF |
| export CONFIG_SHELL |
| |
| |
| ## -------------- ## |
| ## Configuration. ## |
| ## -------------- ## |
| |
| # 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 |
| # to help locate missing packages. |
| buildreq= |
| |
| # Name of a file containing instructions on installing missing packages |
| # required in `buildreq'. |
| buildreq_readme=README-hacking |
| |
| # These are extracted from AC_INIT in configure.ac, though you can |
| # override those values in `bootstrap.conf' if you prefer. |
| build_aux= |
| macro_dir= |
| package= |
| package_name= |
| package_version= |
| package_bugreport= |
| |
| # These are extracted from `gnulib-cache.m4', or else fall-back |
| # automatically on the gnulib defaults; unless you set the values |
| # manually in `bootstrap.conf'. |
| doc_base= |
| gnulib_mk= |
| gnulib_name= |
| local_gl_dir= |
| source_base= |
| tests_base= |
| |
| # The list of gnulib modules required at `gnulib-tool' time. If you |
| # check `gnulib-cache.m4' into your repository, then this list will be |
| # extracted automatically. |
| gnulib_modules= |
| |
| # Extra gnulib files that are not in modules, which override files of |
| # the same name installed by other bootstrap tools. |
| gnulib_non_module_files=" |
| build-aux/compile |
| build-aux/install-sh |
| build-aux/mdate-sh |
| build-aux/texinfo.tex |
| build-aux/depcomp |
| build-aux/config.guess |
| build-aux/config.sub |
| doc/INSTALL |
| " |
| |
| # Relative path to the local gnulib submodule, and url to the upstream |
| # git repository. If you have a gnulib entry in your .gitmodules file, |
| # these values are ignored. |
| gnulib_path= |
| gnulib_url= |
| |
| # Additional gnulib-tool options to use. |
| gnulib_tool_options=" |
| --no-changelog |
| " |
| |
| # bootstrap removes any macro-files that are not included by aclocal.m4, |
| # except for files listed in this variable which are always kept. |
| gnulib_precious=" |
| gnulib-tool.m4 |
| " |
| |
| # When truncating long commands for display, always allow at least this |
| # many characters before truncating. |
| min_cmd_len=160 |
| |
| # The command to download all .po files for a specified domain into |
| # a specified directory. Fill in the first %s is the domain name, and |
| # the second with the destination directory. Use rsync's -L and -r |
| # options because the latest/%s directory and the .po files within are |
| # all symlinks. |
| po_download_command_format=\ |
| "rsync --delete --exclude '*.s1' -Lrtvz \ |
| 'translationproject.org::tp/latest/%s/' '%s'" |
| |
| # Other locale categories that need message catalogs. |
| extra_locale_categories= |
| |
| # Additional xgettext options to use. Gnulib might provide you with an |
| # extensive list of additional options to append to this, but gettext |
| # 0.16.1 and newer appends them automaticaly, so you can safely ignore |
| # the complaints from `gnulib-tool' if your $configure_ac states: |
| # |
| # AM_GNU_GETTEXT_VERSION([0.16.1]) |
| xgettext_options=" |
| --flag=_:1:pass-c-format |
| --flag=N_:1:pass-c-format |
| " |
| |
| # Package copyright holder for gettext files. Defaults to FSF if unset. |
| copyright_holder= |
| |
| # File that should exist in the top directory of a checked out hierarchy, |
| # but not in a distribution tarball. |
| checkout_only_file= |
| |
| # Whether to use copies instead of symlinks by default (if set to true, |
| # the --copy option has no effect). |
| copy=false |
| |
| # Set this to ".cvsignore .gitignore" in `bootstrap.conf' if you want |
| # those files to be generated in directories like `lib/', `m4/', and `po/', |
| # or set it to "auto" to make this script select which to use based |
| # on which version control system (if any) is used in the source directory. |
| # Or set it to "none" to ignore VCS ignore files entirely. Default is |
| # "auto". |
| vc_ignore= |
| |
| |
| ## ------------------- ## |
| ## Hookable functions. ## |
| ## ------------------- ## |
| |
| # After `bootstrap.conf' has been sourced, execution proceeds by calling |
| # `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 |
| # `Resource management' section for a description of what these are. |
| |
| |
| # func_bootstrap [ARG]... |
| # ----------------------- |
| # All the functions called inside func_bootstrap are hookable. See the |
| # the individual implementations for details. |
| func_bootstrap () |
| { |
| $debug_cmd |
| |
| # Save the current positional parameters to prevent them being |
| # corrupted by calls to `set' in `func_init'. |
| func_quote_for_eval ${1+"$@"} |
| _G_saved_positional_parameters=$func_quote_for_eval_result |
| |
| # Initialisation. |
| func_init |
| |
| # Option processing. |
| eval func_options "$_G_saved_positional_parameters" |
| |
| # Post-option preparation. |
| func_prep |
| |
| # Ensure ChangeLog presence. |
| func_ifcontains "$gnulib_modules" gitlog-to-changelog \ |
| func_ensure_changelog |
| |
| # Reconfigure the package. |
| func_reconfigure |
| |
| # Ensure .version is up-to-date. |
| func_update_dotversion |
| |
| # Finalisation. |
| func_fini |
| } |
| |
| |
| # func_init |
| # --------- |
| # Any early initialisations can be hooked to this function. Consider |
| # whether you can hook onto `func_prep' instead, because if you hook |
| # any slow to execute code in here, it will also add to the time before |
| # `./bootstrap --version' can respond. |
| func_hookable func_init |
| func_init () |
| { |
| $debug_cmd |
| |
| func_run_hooks func_init |
| } |
| |
| |
| # func_prep |
| # --------- |
| # Function to perform preparation for remaining bootstrap process. If |
| # your hooked code relies on the outcome of `func_options' hook it here |
| # rather than to `func_init'. |
| # |
| # All the functions called inside func_prep are hookable. See the |
| # individual implementations for details. |
| func_hookable func_prep |
| func_prep () |
| { |
| $debug_cmd |
| |
| $require_bootstrap_uptodate |
| $require_buildtools_uptodate |
| $require_checkout_only_file |
| |
| $require_gnulib_merge_changelog |
| |
| # fetch update files from the translation project |
| func_update_translations |
| |
| func_run_hooks func_prep |
| } |
| |
| |
| # func_update_translations |
| # ------------------------ |
| # Update package po files and translations. |
| func_hookable func_update_translations |
| func_update_translations () |
| { |
| $debug_cmd |
| |
| $opt_skip_po || { |
| test -d po && { |
| $require_package |
| |
| func_update_po_files po $package || exit $? |
| } |
| |
| func_run_hooks func_update_translations |
| } |
| } |
| |
| |
| # func_reconfigure |
| # ---------------- |
| # Reconfigure the current package by running the appropriate autotools in a |
| # suitable order. |
| func_hookable func_reconfigure |
| func_reconfigure () |
| { |
| $debug_cmd |
| |
| # Released `autopoint' has the tendency to install macros that have |
| # been obsoleted in current `gnulib., so run this before `gnulib-tool'. |
| func_autopoint |
| |
| # Autoreconf runs `aclocal' before `libtoolize', which causes spurious |
| # warnings if the initial `aclocal' is confused by the libtoolized |
| # (or worse: out-of-date) macro directory. |
| func_libtoolize |
| |
| # If you need to do anything after `gnulib-tool' is done, but before |
| # `autoreconf' runs, you don't need to override this whole function, |
| # because `func_gnulib_tool' is hookable. |
| func_gnulib_tool |
| |
| func_autoreconf |
| |
| func_run_hooks func_reconfigure |
| } |
| |
| |
| # func_gnulib_tool |
| # ---------------- |
| # Run `gnulib-tool' to fetch gnulib modules into the current package. |
| # |
| # It's assumed that since you are using gnulib's `bootstrap' script, |
| # you're also using gnulib elsewhere in your package. If not, then |
| # you can replace this function in `bootstrap.conf' with: |
| # |
| # func_gnulib_tool () { :; } |
| # |
| # (although the function returns immediately if $gnulib_tool is set to |
| # true in any case). |
| func_hookable func_gnulib_tool |
| func_gnulib_tool () |
| { |
| $debug_cmd |
| |
| $require_gnulib_tool |
| $require_libtoolize |
| |
| test true = "$gnulib_tool" || { |
| if test -n "$gnulib_modules"; then |
| $require_gnulib_cache |
| $require_build_aux |
| $require_macro_dir |
| |
| # Try not to pick up any stale values from `gnulib-cache.m4'. |
| rm -f "$gnulib_cache" |
| |
| gnulib_mode=--import |
| |
| # `gnulib_modules' and others are maintained in `bootstrap.conf`: |
| # Use `gnulib --import` to fetch gnulib modules. |
| test -n "$build_aux" \ |
| && func_append_u gnulib_tool_options " --aux-dir=$build_aux" |
| test -n "$macro_dir" \ |
| && func_append_u gnulib_tool_options " --m4-base=$macro_dir" |
| test -n "$doc_base" \ |
| && func_append_u gnulib_tool_options " --doc-base=$doc_base" |
| test -n "$gnulib_name" \ |
| && func_append_u gnulib_tool_options " --lib=$gnulib_name" |
| test -n "$local_gl_dir" \ |
| && func_append_u gnulib_tool_options " --local-dir=$local_gl_dir" |
| test -n "$source_base" \ |
| && func_append_u gnulib_tool_options " --source-base=$source_base" |
| test -n "$gnulib_mk" \ |
| && func_append_u gnulib_tool_options " --makefile-name=$gnulib_mk" |
| test -n "$tests_base" && { |
| func_append_u gnulib_tool_options " --tests-base=$tests_base" |
| func_append_u gnulib_tool_options " --with-tests" |
| } |
| else |
| |
| # `gnulib_modules' and others are cached in `gnulib-cache.m4': |
| # Use `gnulib --update' to fetch gnulib modules. |
| gnulib_mode=--update |
| fi |
| |
| # Add a sensible default libtool option to gnulib_tool_options. |
| # The embedded echo is to squash whitespace before globbing. |
| case `echo " "$gnulib_tool_options" "` in |
| *" --no-libtool "*|*" --libtool "*) ;; |
| *) if test true = "$LIBTOOLIZE"; then |
| func_append_u gnulib_tool_options " --no-libtool" |
| else |
| func_append_u gnulib_tool_options " --libtool" |
| fi |
| ;; |
| esac |
| |
| $opt_copy || func_append_u gnulib_tool_options " --symlink" |
| |
| func_append_u gnulib_tool_options " $gnulib_mode" |
| func_append gnulib_tool_options " $gnulib_modules" |
| |
| # The embedded echo is to squash whitespace before display. |
| gnulib_cmd=`echo $gnulib_tool $gnulib_tool_options` |
| |
| func_show_eval "$gnulib_cmd" 'exit $?' |
| |
| # Use `gnulib-tool --copy-file' to install non-module files. |
| func_install_gnulib_non_module_files |
| } |
| |
| func_run_hooks func_gnulib_tool |
| } |
| |
| |
| # func_fini |
| # --------- |
| # Function to perform all finalisation for the bootstrap process. |
| func_hookable func_fini |
| func_fini () |
| { |
| $debug_cmd |
| |
| func_gettext_configuration |
| func_clean_dangling_symlinks |
| func_clean_unused_macros |
| func_skip_po_recommendation |
| |
| func_run_hooks func_fini |
| |
| func_echo "Done. Now you can run './configure'." |
| } |
| |
| |
| # func_gettext_configuration |
| # -------------------------- |
| # Edit configuration values into po/Makevars. |
| func_hookable func_gettext_configuration |
| func_gettext_configuration () |
| { |
| $debug_cmd |
| |
| $require_autopoint |
| |
| test true = "$AUTOPOINT" || { |
| $require_copyright_holder |
| $require_extra_locale_categories |
| $require_package_bugreport |
| |
| # Escape xgettext options for sed Makevars generation below. |
| # We have to delete blank lines in a separate script so that we don't |
| # append \\\ to the penultimate line, and then delete the last empty |
| # line, which messes up the variable substitution later in this |
| # 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. |
| _G_xgettext_options=`echo "$xgettext_options$nl" |$SED '/^$/d' |$SED ' |
| $b |
| s|$| \\\\\\\\\\\\|'` |
| |
| # Create gettext configuration. |
| func_echo "Creating po/Makevars from po/Makevars.template ..." |
| $RM -f po/Makevars |
| $SED ' |
| /^EXTRA_LOCALE_CATEGORIES *=/s|=.*|= '"$extra_locale_categories"'| |
| /^COPYRIGHT_HOLDER *=/s|=.*|= '"$copyright_holder"'| |
| /^MSGID_BUGS_ADDRESS *=/s|=.*|= '"$package_bugreport"'| |
| /^XGETTEXT_OPTIONS *=/{ |
| s|$| \\| |
| a\ |
| '"$_G_xgettext_options"' \\\ |
| $${end_of_xgettext_options+} |
| } |
| ' po/Makevars.template >po/Makevars || exit 1 |
| } |
| |
| func_run_hooks func_gettext_configuration |
| } |
| |
| |
| |
| ## --------------- ## |
| ## Core functions. ## |
| ## --------------- ## |
| |
| # This section contains the main functions called from the `Hookable |
| # functions' (shown above), and are the ones you're most likely |
| # to want to replace with your own implementations in `bootstrap.conf'. |
| |
| |
| # func_autopoint |
| # -------------- |
| # If this package uses gettext, then run `autopoint'. |
| func_autopoint () |
| { |
| $debug_cmd |
| |
| $require_autopoint |
| |
| test true = "$AUTOPOINT" \ |
| || func_show_eval "$AUTOPOINT --force" 'exit $?' |
| } |
| |
| |
| # func_libtoolize |
| # --------------- |
| # If this package uses libtool, then run `libtoolize'. |
| func_libtoolize () |
| { |
| $debug_cmd |
| |
| $require_libtoolize |
| |
| test true = "$LIBTOOLIZE" || { |
| _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 $?' |
| } |
| } |
| |
| |
| # func_gnulib_tool_copy_file SRC DEST |
| # ----------------------------------- |
| # Copy SRC, a path relative to the gnulib sub-tree, to DEST, a path |
| # relative to the top-level source directory using gnulib-tool so that |
| # any patches or replacements in $local_gl_dir are applied. |
| func_gnulib_tool_copy_file () |
| { |
| $debug_cmd |
| |
| $require_gnulib_path |
| $require_gnulib_tool |
| $require_patch |
| |
| gnulib_copy_cmd="$gnulib_tool --copy-file" |
| $opt_copy || func_append gnulib_copy_cmd " --symlink" |
| |
| if test true = "$gnulib_tool"; then |
| # If gnulib-tool is not available (e.g. bootstrapping in a |
| # distribution tarball), make sure that at least we have some |
| # version of the required file already in place. |
| test -f "$2" || func_fatal_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." |
| else |
| test -f "$gnulib_path/$1" || { |
| func_error "\`$gnulib_path/$1' does not exist" |
| return 1 |
| } |
| |
| $gnulib_copy_cmd $1 $2 |
| fi |
| } |
| |
| |
| # func_install_gnulib_non_module_files |
| # ------------------------------------ |
| # Get additional non-module files from gnulib, overriding existing files. |
| func_install_gnulib_non_module_files () |
| { |
| $debug_cmd |
| |
| $require_build_aux |
| $require_gnulib_tool |
| |
| test -n "$gnulib_non_module_files" && { |
| maybe_exit_cmd=: |
| |
| for file in $gnulib_non_module_files; do |
| case $file in |
| */COPYING*) dest=COPYING;; |
| */INSTALL) dest=INSTALL;; |
| build-aux/missing) dest= |
| func_warning settings "\ |
| Please remove build-aux/missing from gnulib_module_files in |
| \`bootstrap.conf', as it may clash with Automake's version." |
| ;; |
| build-aux/*) dest=$build_aux/`expr "$file" : 'build-aux/\(.*\)'`;; |
| *) dest=$file;; |
| esac |
| |
| # Be sure to show all copying errors before bailing out |
| test -z "$dest" \ |
| || func_gnulib_tool_copy_file "$file" "$dest" \ |
| || maybe_exit_cmd="exit $EXIT_FAILURE" |
| done |
| |
| $maybe_exit_cmd |
| } |
| } |
| |
| |
| # func_ensure_changelog |
| # --------------------- |
| # Even with 'gitlog-to-changelog' generated ChangeLogs, automake |
| # will not run to completion with no ChangeLog file. |
| func_ensure_changelog () |
| { |
| $debug_cmd |
| |
| test -f ChangeLog && mv -f ChangeLog ChangeLog~ |
| |
| cat >ChangeLog <<'EOT' |
| ## ---------------------- ## |
| ## DO NOT EDIT THIS FILE! ## |
| ## ---------------------- ## |
| |
| ChangeLog is generated by gitlog-to-changelog. |
| EOT |
| |
| _G_message="creating dummy \`ChangeLog'" |
| test -f ChangeLog~ \ |
| && func_append _G_message ' (backup in ChangeLog~)' |
| func_verbose "$_G_message" |
| |
| return 0 |
| } |
| |
| |
| # func_autoreconf |
| # --------------- |
| # Being careful not to re-run `autopoint' or `libtoolize', and not to |
| # try to run `autopoint', `libtoolize' or `autoheader' on packages that |
| # don't use them, defer to `autoreconf' for execution of the remaining |
| # autotools to bootstrap this package. |
| func_autoreconf () |
| { |
| $debug_cmd |
| |
| $require_autoheader |
| $require_build_aux # automake and others put files in here |
| $require_macro_dir # aclocal and others put files in here |
| |
| # We ran these manually already, and autoreconf won't exec `:' |
| save_AUTOPOINT=$AUTOPOINT; AUTOPOINT=true |
| save_LIBTOOLIZE=$LIBTOOLIZE; LIBTOOLIZE=true |
| |
| _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 |
| } |
| |
| |
| # 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 |
| |
| $require_configure_ac |
| |
| eval 'test -n "$'$1'"' || { |
| _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 "$_G_error_msg" |
| } |
| } |
| |
| |
| # func_clean_dangling_symlinks |
| # ---------------------------- |
| # Remove any dangling symlink matching "*.m4" or "*.[ch]" in some |
| # gnulib-populated directories. Such .m4 files would cause aclocal to |
| # fail. The following requires GNU find 4.2.3 or newer. Considering |
| # the usual portability constraints of this script, that may seem a very |
| # demanding requirement, but it should be ok. Ignore any failure, |
| # which is fine, since this is only a convenience to help developers |
| # avoid the relatively unusual case in which a symlinked-to .m4 file is |
| # git-removed from gnulib between successive runs of this script. |
| func_clean_dangling_symlinks () |
| { |
| $debug_cmd |
| |
| $require_macro_dir |
| $require_source_base |
| |
| func_verbose "cleaning dangling symlinks" |
| |
| find "$macro_dir" "$source_base" \ |
| -depth \( -name '*.m4' -o -name '*.[ch]' \) \ |
| -type l -xtype l -delete > /dev/null 2>&1 |
| } |
| |
| |
| # func_clean_unused_macros |
| # ------------------------ |
| # Autopoint can result in over-zealously adding macros into $macro_dir |
| # even though they are not actually used, for example tests to help |
| # build the `intl' directory even though you have specified |
| # `AM_GNU_GETTEXT([external])' in your configure.ac. This function |
| # looks removes any macro files that can be found in gnulib, but |
| # are not `m4_include'd by `aclocal.m4'. |
| func_clean_unused_macros () |
| { |
| $debug_cmd |
| |
| $require_gnulib_path |
| $require_macro_dir |
| |
| test -n "$gnulib_path" && test -f aclocal.m4 && { |
| aclocal_m4s=`find . -name aclocal.m4 -print` |
| |
| # We use `ls|grep' instead of `ls *.m4' to avoid exceeding |
| # command line length limits in some shells. |
| for file in `cd "$macro_dir" && ls -1 |grep '\.m4$'`; do |
| |
| # Remove a macro file when aclocal.m4 does not m4_include it... |
| func_grep_q 'm4_include([[]'$macro_dir/$file'])' $aclocal_m4s \ |
| || test ! -f "$gnulib_path/m4/$file" || { |
| |
| # ...and there is an identical file in gnulib... |
| if func_cmp_s "$gnulib_path/m4/$file" "$macro_dir/$file"; then |
| |
| # ...and it's not in the precious list (`echo' is needed |
| # here to squash whitespace for the match expression). |
| case " "`echo $gnulib_precious`" " in |
| *" $file "*) ;; |
| *) rm -f "$macro_dir/$file" |
| func_verbose \ |
| "removing unused gnulib file \`$macro_dir/$file'" |
| esac |
| fi |
| } |
| done |
| } |
| } |
| |
| |
| # func_skip_po_recommendation |
| # --------------------------- |
| # If there is a po directory, and `--skip-po' wasn't passed, let the |
| # user know that they can use `--skip-po' on subsequent invocations. |
| func_skip_po_recommendation () |
| { |
| $debug_cmd |
| |
| test ! -d po \ |
| || $opt_skip_po \ |
| || func_warning recommend "\ |
| If your pofiles are up-to-date, you can rerun bootstrap |
| as \`$progname --skip-po' to avoid redownloading." |
| } |
| |
| |
| # func_update_dotversion |
| # ---------------------- |
| # Even with 'gitlog-to-changelog' generated ChangeLogs, automake |
| # will not run to completion with no ChangeLog file. |
| func_update_dotversion () |
| { |
| $debug_cmd |
| |
| test -f "$build_aux/git-version-gen" && { |
| _G_message="updating .version" |
| test -f .version && { |
| mv .version .version~ |
| func_append _G_message " (backup in .version~)" |
| } |
| func_verbose "updating .version" |
| |
| $build_aux/git-version-gen dummy-arg > .version |
| } |
| } |
| |
| |
| |
| ## -------------------- ## |
| ## 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. |
| |
| |
| # require_checkout_only_file |
| # -------------------------- |
| # Bail out if this package only bootstraps properly from a repository |
| # checkout. |
| require_checkout_only_file=func_require_checkout_only_file |
| func_require_checkout_only_file () |
| { |
| $debug_cmd |
| |
| $opt_force || { |
| test -n "$checkout_only_file" && test ! -f "$checkout_only_file" \ |
| && func_fatal_error "\ |
| Bootstrapping from a non-checked-out distribution is risky. |
| If you wish to bootstrap anyway, use the \`--force' option." |
| } |
| |
| require_checkout_only_file=: |
| } |
| |
| |
| # require_aclocal_amflags |
| # ----------------------- |
| # Ensure `$aclocal_amflags' has a sensible default, extracted from |
| # `Makefile.am' if necessary. |
| require_aclocal_amflags=func_require_aclocal_amflags |
| func_require_aclocal_amflags () |
| { |
| $debug_cmd |
| |
| $require_makefile_am |
| |
| _G_sed_extract_aclocal_amflags='s|#.*$|| |
| /^[ ]*ACLOCAL_AMFLAGS[ ]*=/ { |
| s|^.*=[ ]*\(.*\)|aclocal_amflags="\1"| |
| p |
| }' |
| |
| _G_aclocal_flags_cmd=`$SED -n "$_G_sed_extract_aclocal_amflags" \ |
| "$makefile_am"` |
| eval "$_G_aclocal_flags_cmd" |
| |
| func_verbose "ACLOCAL_AMFLAGS='$aclocal_amflags'" |
| |
| require_aclocal_amflags=: |
| } |
| |
| |
| # require_autoheader |
| # ------------------ |
| # Skip autoheader if it's not needed. |
| require_autoheader=func_require_autoheader |
| func_require_autoheader () |
| { |
| $debug_cmd |
| |
| test true = "$AUTOHEADER" || { |
| func_extract_trace AC_CONFIG_HEADERS |
| test -n "$func_extract_trace_result" \ |
| || func_extract_trace AC_CONFIG_HEADER |
| |
| test -n "$func_extract_trace_result" || { |
| AUTOHEADER=true |
| |
| func_verbose "export AUTOHEADER='$AUTOHEADER'" |
| |
| # Make sure the search result is visible to subshells |
| export AUTOHEADER |
| } |
| } |
| |
| require_autoheader=: |
| } |
| |
| |
| # require_autopoint |
| # ----------------- |
| # Skip autopoint if it's not needed. |
| require_autopoint=func_require_autopoint |
| func_require_autopoint () |
| { |
| $debug_cmd |
| |
| test true = "$AUTOPOINT" || { |
| func_extract_trace AM_GNU_GETTEXT_VERSION |
| |
| test -n "$func_extract_trace_result" || { |
| AUTOPOINT=true |
| |
| func_verbose "export AUTOPOINT='$AUTOPOINT'" |
| |
| # Make sure the search result is visible to subshells |
| export AUTOPOINT |
| } |
| } |
| |
| require_autopoint=: |
| } |
| |
| |
| # require_bootstrap_uptodate |
| # -------------------------- |
| # Complain if the version of bootstrap in the gnulib directory differs |
| # from the one we are running. |
| require_bootstrap_uptodate=func_require_bootstrap_uptodate |
| func_require_bootstrap_uptodate () |
| { |
| $debug_cmd |
| |
| $require_gnulib_path |
| |
| test x = x"$gnulib_path" \ |
| || func_cmp_s $progpath $gnulib_path/build-aux/bootstrap \ |
| || func_warning upgrade "\ |
| \`$progpath' differs from \`./$gnulib_path/build-aux/bootstrap', |
| please consider adopting the canonical version from gnulib." |
| |
| require_bootstrap_uptodate=: |
| } |
| |
| |
| # require_build_aux |
| # ----------------- |
| # Ensure that `$build_aux' is set, and if it doesn't already point to an |
| # existing directory, create one. |
| require_build_aux=func_require_build_aux |
| func_require_build_aux () |
| { |
| $debug_cmd |
| |
| test -n "$build_aux" || { |
| func_extract_trace AC_CONFIG_AUX_DIR |
| build_aux=$func_extract_trace_result |
| func_check_configuration build_aux \ |
| "AC_CONFIG_AUX_DIR([name of a directory for build scripts])" |
| |
| func_verbose "build_aux='$build_aux'" |
| } |
| |
| $require_vc_ignore_files |
| |
| # If the build_aux directory doesn't exist, create it now, and mark it |
| # as ignored for the VCS. |
| if test ! -d "$build_aux"; then |
| func_show_eval "mkdir '$build_aux'" |
| |
| test -n "$vc_ignore_files" \ |
| || func_insert_sorted_if_absent "$build_aux" $vc_ignore_files |
| fi |
| |
| require_build_aux=: |
| } |
| |
| |
| # require_buildreq_autobuild |
| # -------------------------- |
| # Try to find whether the bootstrap requires autobuild. |
| require_buildreq_autobuild=func_require_buildreq_autobuild |
| func_require_buildreq_autobuild () |
| { |
| $debug_cmd |
| |
| $require_macro_dir |
| |
| test -f "$macro_dir/autobuild.m4" \ |
| || printf '%s\n' "$buildreq" |func_grep_q '^[ ]*autobuild' \ |
| || { |
| func_extract_trace AB_INIT |
| test -n "$func_extract_trace_result" && { |
| func_append buildreq 'autobuild - http://josefsson.org/autobuild/ |
| ' |
| func_verbose "auto-adding \`autobuild' to build requirements" |
| } |
| } |
| |
| require_buildreq_autobuild=: |
| } |
| |
| |
| # require_buildreq_autoconf |
| # require_buildreq_autopoint |
| # require_buildreq_libtoolize |
| # --------------------------- |
| # Try to find the minimum compatible version of autoconf/libtool |
| # required to bootstrap successfully, and add it to `$buildreq'. |
| for tool in autoconf libtoolize autopoint; do |
| b=$tool |
| v=require_buildreq_${tool} |
| f=func_$v |
| case $tool in |
| autoconf) m=AC_PREREQ ;; |
| libtoolize) m=LT_PREREQ; b=libtool ;; |
| autopoint) m=AM_GNU_GETTEXT_VERSION b=gettext ;; |
| esac |
| |
| eval $v'='$f' |
| '$f' () |
| { |
| $debug_cmd |
| |
| # The following is ignored if undefined, but might be necessary |
| # in order for `func_find_tool` to run. |
| ${require_'$tool'-:} |
| |
| printf '\''%s\n'\'' "$buildreq" |func_grep_q '\''^[ ]*'$tool\'' || { |
| func_extract_trace '$m' |
| _G_version=$func_extract_trace_result |
| test -n "$_G_version" && { |
| func_append buildreq "\ |
| '$tool' $_G_version http://www.gnu.org/s/'$b' |
| " |
| func_verbose \ |
| "auto-adding \`'$tool'-$_G_version'\'' to build requirements" |
| } |
| } |
| |
| '$v'=: |
| } |
| ' |
| done |
| |
| |
| # require_buildreq_automake |
| # ------------------------- |
| # Try to find the minimum compatible version of automake required to |
| # bootstrap successfully, and add it to `$buildreq'. |
| require_buildreq_automake=func_require_buildreq_automake |
| func_require_buildreq_automake () |
| { |
| $debug_cmd |
| |
| # if automake is not already listed in $buildreq... |
| printf '%s\n' "$buildreq" |func_grep_q automake || { |
| func_extract_trace AM_INIT_AUTOMAKE |
| |
| # ...and AM_INIT_AUTOMAKE is declared... |
| test -n "$func_extract_trace_result" && { |
| automake_version=`$bs_echo "$func_extract_trace_result" \ |
| |$SED 's|[^0-9]*||; s| .*$||'` |
| test -n "$automake_version" || automake_version=- |
| |
| func_append buildreq "\ |
| automake $automake_version http://www.gnu.org/s/automake |
| " |
| func_verbose \ |
| "auto-adding \`automake-$automake_version' to build requirements" |
| } |
| } |
| |
| require_buildreq_automake=: |
| } |
| |
| |
| # require_buildreq_patch |
| # ---------------------- |
| # Automatically add a patch build-requirement if there are diff files |
| # in $local_gl_dir. |
| require_buildreq_patch=func_require_buildreq_patch |
| func_require_buildreq_patch () |
| { |
| $debug_cmd |
| |
| # This ensures PATCH is set appropriately by the time |
| # func_check_versions enforces $buildreq. |
| $require_patch |
| |
| # If patch is not already listed in $buildreq... |
| printf '%s\n' "$buildreq" |func_grep_q '^[ ]*patch' || { |
| # The ugly find invocation is necessary to exit with non-zero |
| # status for old find binaries that don't support -exec fully. |
| if test ! -d "$local_gl_dir" \ |
| || find "$local_gl_dir" -name *.diff -exec false {} +; then : |
| else |
| func_append buildreq 'patch - http://www.gnu.org/s/patch |
| ' |
| fi |
| } |
| |
| require_buildreq_patch=: |
| } |
| |
| |
| # require_buildtools_uptodate |
| # --------------------------- |
| # Ensure all the packages listed in BUILDREQS are available on the build |
| # machine at the minimum versions or better. |
| require_buildtools_uptodate=func_require_buildtools_uptodate |
| func_require_buildtools_uptodate () |
| { |
| $debug_cmd |
| |
| $require_buildreq_autobuild |
| $require_buildreq_autoconf |
| $require_buildreq_automake |
| $require_buildreq_libtoolize |
| $require_buildreq_autopoint |
| $require_buildreq_patch |
| |
| test -n "$buildreq" && { |
| _G_error_hdr= |
| |
| func_check_versions $buildreq |
| $func_check_versions_result || { |
| test -n "$buildreq_readme" \ |
| && test -f "$buildreq_readme" \ |
| && _G_error_hdr="\ |
| $buildreq_readme explains how to obtain these prerequisite programs: |
| " |
| func_strtable 0 11 12 36 \ |
| "Program" "Min_version" "Homepage" $buildreq |
| func_fatal_error "$_G_error_hdr$func_strtable_result" |
| } |
| } |
| |
| require_buildtools_uptodate=: |
| } |
| |
| |
| # require_copyright_holder |
| # ------------------------ |
| # Ensure there is a sensible non-empty default value in `$copyright_holder'. |
| require_copyright_holder=func_require_copyright_holder |
| func_require_copyright_holder () |
| { |
| $debug_cmd |
| |
| test -n "$copyright_holder" || { |
| copyright_holder='Free Software Foundation, Inc.' |
| func_warning settings "\ |
| Please set copyright_holder explicitly in \`bootstrap.conf'; |
| defaulting to \`$copyright_holder'." |
| } |
| |
| require_copyright_holder=: |
| } |
| |
| |
| # require_dotgitmodules |
| # --------------------- |
| # Ensure we have a `.gitmodules' file, with appropriate `gnulib' settings. |
| require_dotgitmodules=func_require_dotgitmodules |
| func_require_dotgitmodules () |
| { |
| $debug_cmd |
| |
| $require_git |
| |
| test true = "$GIT" || { |
| # A gnulib entry in .gitmodules always takes precedence. |
| _G_path=`$GIT config --file .gitmodules submodule.gnulib.path 2>/dev/null` |
| |
| test -n "$_G_path" || { |
| $require_vc_ignore_files |
| |
| func_verbose "creating \`.gitmodules'" |
| |
| # If the .gitmodules file doesn't exist, create it now, and mark |
| # it as ignored for the VCS. |
| test -n "$gnulib_path" || gnulib_path=gnulib |
| test -n "$gnulib_url" || gnulib_url=git://git.sv.gnu.org/gnulib |
| |
| { |
| echo '[submodule "gnulib"]' |
| echo " path = $gnulib_path" |
| echo " url = $gnulib_url" |
| } >> .gitmodules |
| |
| test -n "$vc_ignore_files" \ |
| || func_insert_sorted_if_absent ".gitmodules" $vc_ignore_files |
| } |
| } |
| |
| require_dotgitmodules=: |
| } |
| |
| |
| # require_extra_locale_categories |
| # ------------------------------- |
| # Ensure there is a default value in `$extra_locale_categories' |
| require_extra_locale_categories=func_require_extra_locale_categories |
| func_require_extra_locale_categories () |
| { |
| $debug_cmd |
| |
| # Defaults to empty, so run with whatever value may have been set in |
| # `bootstrap.conf'. |
| require_extra_locale_categories=: |
| } |
| |
| |
| # require_git |
| # ----------- |
| # Ignore git if it's not available, or we're not in a git checkout tree. |
| require_git=func_require_git |
| func_require_git () |
| { |
| $debug_cmd |
| |
| $opt_skip_git && GIT=true |
| |
| test true = "$GIT" || { |
| if test -f .gitignore && ($GIT --version) >/dev/null 2>&1; then :; else |
| GIT=true |
| fi |
| } |
| |
| func_verbose "GIT='$GIT'" |
| |
| require_git=: |
| } |
| |
| |
| # require_gnulib_cache |
| # -------------------- |
| # Ensure there is a non-empty default for `$gnulib_cache', and that it |
| # names an existing file. |
| require_gnulib_cache=func_require_gnulib_cache |
| func_require_gnulib_cache () |
| { |
| $debug_cmd |
| |
| $require_macro_dir |
| |
| test -n "$gnulib_cache" \ |
| || gnulib_cache=$macro_dir/gnulib-cache.m4 |
| |
| func_verbose "found \`$gnulib_cache'" |
| |
| require_gnulib_cache=: |
| } |
| |
| |
| # require_gnulib_merge_changelog |
| # ------------------------------ |
| # See if we can use gnulib's git-merge-changelog merge driver. |
| require_gnulib_merge_changelog=func_require_gnulib_merge_changelog |
| func_require_gnulib_merge_changelog () |
| { |
| $debug_cmd |
| |
| test -f ChangeLog && { |
| $require_git |
| |
| func_grep_q '^\(/\|\)ChangeLog$' .gitignore || test true = "$GIT" || { |
| if $GIT config merge.merge-changelog.driver >/dev/null ; then |
| : |
| elif (git-merge-changelog --version) >/dev/null 2>&1 ; then |
| func_echo "initializing git-merge-changelog driver" |
| $GIT config merge.merge-changelog.name 'GNU-style ChangeLog merge driver' |
| $GIT config merge.merge-changelog.driver 'git-merge-changelog %O %A %B' |
| else |
| func_warning recommend \ |
| "Consider installing git-merge-changelog from gnulib." |
| fi |
| } |
| } |
| |
| require_gnulib_merge_changelog=: |
| } |
| |
| |
| # require_gnulib_mk |
| # ----------------- |
| # Ensure gnulib_mk has a sensible value, extracted from `gnulib-cache.m4' |
| # if possible, otherwise letting `gnulib-tool' pick a default. |
| require_gnulib_mk=func_require_gnulib_mk |
| func_require_gnulib_mk () |
| { |
| $debug_cmd |
| |
| test -f "$gnulib_cache" && test -z "$gnulib_mk" && { |
| $require_gnulib_cache |
| $require_macro_dir |
| |
| func_extract_trace "gl_MAKEFILE_NAME" "$gnulib_cache" |
| gnulib_mk=$func_extract_trace_result |
| |
| test -n "$gnulib_mk" && func_verbose "gnulib_mk='$gnulib_mk'" |
| } |
| |
| require_gnulib_mk=: |
| } |
| |
| |
| # require_gnulib_path |
| # require_gnulib_url |
| # ------------------- |
| # Ensure `gnulib_path' and `gnulib_url' are set. |
| require_gnulib_path=func_require_dotgitmodules_parameters |
| require_gnulib_url=func_require_dotgitmodules_parameters |
| func_require_dotgitmodules_parameters () |
| { |
| $debug_cmd |
| |
| $require_git |
| |
| test true = "$GIT" && { |
| # If we can't find git (or if the user specified `--skip-git'), |
| # then use an existing gnulib directory specified with |
| # `--gnulib-srcdir' if possible. |
| test -n "$gnulib_path" \ |
| || test ! -x "$opt_gnulib_srcdir/gnulib-tool" \ |
| || gnulib_path=$opt_gnulib_srcdir |
| } |
| |
| |
| $require_dotgitmodules |
| |
| test -f .gitmodules && { |
| # Extract the parameters with sed, since git may be missing |
| test -n "$gnulib_path" \ |
| || gnulib_path=`$SED -e '/^.submodule "gnulib".$/,${ |
| /[ ]*path *= */{ |
| s|[ ]*||g;s|^[^=]*=||;p |
| } |
| };d' .gitmodules |$SED 1q` |
| test -n "$gnulib_url" \ |
| || gnulib_url=`$SED -e '/^.submodule "gnulib".$/,${ |
| /[ ]*url *= */{ |
| s|[ ]*||g;s|^[^=]*=||;p |
| } |
| };d' .gitmodules |$SED 1q` |
| |
| func_verbose "gnulib_path='$gnulib_path'" |
| func_verbose "gnulib_url='$gnulib_url'" |
| } |
| |
| require_gnulib_path=: |
| require_gnulib_url=: |
| } |
| |
| |
| # require_gnulib_submodule |
| # ------------------------ |
| # Ensure that there is a current gnulib submodule at `$gnulib_path'. |
| require_gnulib_submodule=func_require_gnulib_submodule |
| func_require_gnulib_submodule () |
| { |
| $debug_cmd |
| |
| $require_git |
| |
| if test true = "$GIT"; then |
| func_warning recommend \ |
| "No \`git' found; imported gnulib modules may be outdated." |
| else |
| $require_gnulib_path |
| $require_gnulib_url |
| |
| if test -f .gitmodules && test -f "$gnulib_path/gnulib-tool"; then |
| func_show_eval "$GIT submodule update" \ |
| 'func_fatal_error "Unable to update gnulib submodule."' |
| |
| elif test -n "$opt_gnulib_srcdir"; then |
| # Older git can't clone into an empty directory. |
| rmdir "$gnulib_path" 2>/dev/null |
| func_show_eval "$GIT clone --reference '$opt_gnulib_srcdir' \ |
| '$gnulib_url' '$gnulib_path'" \ |
| && func_show_eval "$GIT submodule init" \ |
| && func_show_eval "$GIT submodule update" \ |
| || 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. |
| else |
| trap func_cleanup_gnulib 1 2 13 15 |
| |
| shallow= |
| $GIT clone -h 2>&1 |func_grep_q -- --depth \ |
| && shallow='--depth 2' |
| |
| func_show_eval "$GIT clone $shallow '$gnulib_url' '$gnulib_path'" \ |
| func_cleanup_gnulib |
| |
| # FIXME: Solaris /bin/sh will try to execute '-' if any of |
| # these signals are caught after this. |
| trap - 1 2 13 15 |
| fi |
| fi |
| |
| require_gnulib_submodule=: |
| } |
| |
| |
| # require_gnulib_tool |
| # ------------------- |
| # Ensure that `$gnulib_tool' is set, and points to an executable file, |
| # or else fall back to using the binary `true' if the main gnulib |
| # files appear to have been imported already. |
| require_gnulib_tool=func_require_gnulib_tool |
| func_require_gnulib_tool () |
| { |
| $debug_cmd |
| |
| $require_gnulib_submodule |
| |
| test true = "$gnulib_tool" || { |
| $require_gnulib_path |
| |
| test -n "$gnulib_tool" \ |
| || gnulib_tool=$gnulib_path/gnulib-tool |
| |
| test -x "$gnulib_tool" || { |
| gnulib_tool=true |
| func_warning recommend \ |
| "No \`gnulib-tool' found; gnulib modules may be missing." |
| } |
| |
| test true = "$gnulib_tool" \ |
| || func_verbose "found \`$gnulib_tool'" |
| } |
| |
| require_gnulib_tool=: |
| } |
| |
| |
| # require_libtoolize |
| # ------------------ |
| # Skip libtoolize if it's not needed. |
| require_libtoolize=func_require_libtoolize |
| func_require_libtoolize () |
| { |
| $debug_cmd |
| |
| # Unless we're not searching for libtool use by this package, set |
| # LIBTOOLIZE to true if none of `LT_INIT', `AC_PROG_LIBTOOL' and |
| # `AM_PROG_LIBTOOL' are used in configure. |
| test true = "$LIBTOOLIZE" || { |
| func_extract_trace LT_INIT |
| test -n "$func_extract_trace_result" || func_extract_trace AC_PROG_LIBTOOL |
| test -n "$func_extract_trace_result" || func_extract_trace AM_PROG_LIBTOOL |
| test -n "$func_extract_trace_result" || LIBTOOLIZE=true |
| } |
| |
| test -n "$LIBTOOLIZE" || { |
| # Find libtoolize, named glibtoolize in Mac Ports, but prefer |
| # user-installed libtoolize to ancient glibtoolize shipped by |
| # Apple with Mac OS X when Mac Ports is not installed. |
| func_find_tool LIBTOOLIZE libtoolize glibtoolize |
| } |
| |
| func_verbose "export LIBTOOLIZE='$LIBTOOLIZE'" |
| |
| # Make sure the search result is visible to subshells |
| export LIBTOOLIZE |
| |
| require_libtoolize=: |
| } |
| |
| |
| # require_macro_dir |
| # ----------------- |
| # Ensure that `$macro_dir' is set, and if it doesn't already point to an |
| # existing directory, create one. |
| require_macro_dir=func_require_macro_dir |
| func_require_macro_dir () |
| { |
| $debug_cmd |
| |
| # Sometimes this is stored in `configure.ac'. |
| test -n "$macro_dir" || { |
| func_extract_trace AC_CONFIG_MACRO_DIR |
| macro_dir=$func_extract_trace_result |
| } |
| |
| # Otherwise we might find it in `Makefile.am'. |
| test -n "$macro_dir" || { |
| $require_aclocal_amflags |
| |
| _G_sed_scan='s|^.*-I[ ]*\([^ ]*\) .*|\1|' |
| |
| # Trailing space in echo is required by the sed script. |
| macro_dir=`echo "$aclocal_amflags " |$SED "$_G_sed_scan"` |
| } |
| |
| func_verbose "macro_dir='$macro_dir'" |
| |
| func_check_configuration macro_dir \ |
| "AC_CONFIG_MACRO_DIR([name of a directory for configure m4 files])" |
| |
| $require_vc_ignore_files |
| |
| # If the macro_dir directory doesn't exist, create it now, and mark it |
| # as ignored for the VCS. |
| if test ! -d "$macro_dir"; then |
| mkdir "$macro_dir" || func_permissions_error "$macro_dir" |
| |
| test -n "$vc_ignore_files" \ |
| || func_insert_sorted_if_absent "$macro_dir" $vc_ignore_files |
| fi |
| |
| require_macro_dir=: |
| } |
| |
| |
| # require_makefile_am |
| # ------------------- |
| # Ensure there is a `Makefile.am' in the current directory. |
| # names an existing file. |
| require_makefile_am=func_require_makefile_am |
| func_require_makefile_am () |
| { |
| $debug_cmd |
| |
| test -n "$makefile_am" \ |
| || makefile_am=Makefile.am |
| |
| <"$makefile_am" |
| |
| func_verbose "found \`$makefile_am'" |
| |
| require_makefile_am=: |
| } |
| |
| |
| # require_package |
| # --------------- |
| # Ensure that `$package' contains a sensible default value. |
| require_package=func_require_package |
| func_require_package () |
| { |
| $debug_cmd |
| |
| test -n "$package" || { |
| $require_package_name |
| |
| package=`echo "$package_name" \ |
| |$SED 's/GNU //;y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'` |
| } |
| |
| func_verbose "package='$package'" |
| |
| require_package=: |
| } |
| |
| |
| # require_package_bugreport |
| # ------------------------- |
| # Ensure that this has a sensible value, extracted from `configure.ac' |
| # if appropriate (and possible!). |
| require_package_bugreport=func_require_package_bugreport |
| func_require_package_bugreport () |
| { |
| $debug_cmd |
| |
| func_extract_trace AC_INIT |
| |
| save_ifs=$IFS |
| IFS=: |
| set dummy $func_extract_trace_result |
| IFS=$save_ifs |
| shift |
| |
| test -n "$package_bugreport" || package_bugreport=$3 |
| func_check_configuration package_bugreport \ |
| "AC_INIT([$package_name], [$package_version], [bug-$package@gnu.org])" |
| func_verbose "package_bugreport='$package_bugreport'" |
| |
| require_package_bugreport=: |
| } |
| |
| |
| # require_package_name |
| # -------------------- |
| # Ensure that this has a sensible value, extracted from `configure.ac' |
| # if appropriate (and possible!). |
| require_package_name=func_require_package_name |
| func_require_package_name () |
| { |
| $debug_cmd |
| |
| func_extract_trace AC_INIT |
| |
| save_ifs=$IFS |
| IFS=: |
| set dummy $func_extract_trace_result |
| IFS=$save_ifs |
| shift |
| |
| test -n "$package_name" || package_name=$1 |
| func_check_configuration package_name \ |
| "AC_INIT([name of your package], [package version number])" |
| func_verbose "package_name='$package_name'" |
| |
| require_package_name=: |
| } |
| |
| |
| # require_package_version |
| # ----------------------- |
| # Ensure that this has a sensible value, extracted from `configure.ac' |
| # if appropriate (and possible!). While we might have set all the |
| # parameters extracted from AC_INIT at once, `package_version' in |
| # particular is not necessarily available as early as the others, since |
| # `git-version-gen' is often involved, and until then we can't rely on |
| # getting a correct version number from an AC_INIT extraction. |
| require_package_version=func_require_package_version |
| func_require_package_version () |
| { |
| $debug_cmd |
| |
| func_extract_trace AC_INIT |
| |
| save_ifs=$IFS |
| IFS=: |
| set dummy $func_extract_trace_result |
| IFS=$save_ifs |
| shift |
| |
| test -n "$package_version" || package_version=$2 |
| test -n "$package_version" || { |
| # The embedded echo is to squash whitespace before globbing. |
| case " "`echo $gnulib_modules`" " in |
| *" git-version-gen "*) |
| func_fatal_error "\ |
| cannot \$require_package_version in bootstrap.conf before |
| func_gnulib_tool has installed the \`git-version-gen' script." |
| ;; |
| *) |
| func_check_configuration package_version \ |
| "AC_INIT([name of your package], [package version number])" |
| ;; |
| esac |
| } |
| func_verbose "package_version='$package_version'" |
| |
| require_package_version=: |
| } |
| |
| |
| # require_patch |
| # ------------- |
| # Find patch, according to the PATCH environment variable, or else |
| # searching the user's PATH. |
| require_patch=func_require_patch |
| func_require_patch () |
| { |
| $debug_cmd |
| |
| test -n "$PATCH" || { |
| # Find a patch program, preferring gpatch which is usually better |
| # than the vendor patch. |
| func_find_tool PATCH gpatch patch |
| } |
| |
| func_verbose "export PATCH='$PATCH'" |
| |
| # Make sure the search result is visible to subshells |
| export PATCH |
| |
| require_patch=: |
| } |
| |
| |
| # require_source_base |
| # ------------------- |
| # Ensure that source_base has a sensible value, extracted from |
| # `gnulib-cache.m4' if possible. |
| require_source_base=func_require_source_base |
| func_require_source_base () |
| { |
| $debug_cmd |
| |
| $require_gnulib_cache |
| |
| test -f "$gnulib_cache" && test x = "x$source_base" && { |
| $require_macro_dir |
| |
| func_extract_trace "gl_SOURCE_BASE" "$gnulib_cache" |
| |
| source_base=$func_extract_trace_result |
| |
| func_verbose "source_base='$source_base'" |
| } |
| |
| require_source_base=: |
| } |
| |
| |
| # require_vc_ignore_files |
| # ----------------------- |
| # Ensure that `$vc_ignore' has been processed to list VCS ignore files |
| # in `$vc_ignore_files' |
| require_vc_ignore_files=func_require_vc_ignore_files |
| func_require_vc_ignore_files () |
| { |
| $debug_cmd |
| |
| test -n "$vc_ignore" || vc_ignore=auto |
| |
| if test auto = "$vc_ignore" && test x = x"$vc_ignore_files"; then |
| vc_ignore_files= |
| test -d .git && vc_ignore_files=.gitignore |
| test -d CVS && vc_ignore_files="$vc_ignore_files .cvsignore" |
| else |
| vc_ignore_files=$vc_ignore |
| fi |
| |
| func_verbose "vc_ignore_files='$vc_ignore_files'" |
| |
| require_vc_ignore_files=: |
| } |
| |
| |
| ## ------------------## |
| ## Helper functions. ## |
| ## ------------------## |
| |
| # This section contains the helper functions used by the rest of `bootstrap'. |
| |
| # func_len STRING |
| # --------------- |
| # STRING may not start with a hyphen. |
| if (eval 'x=123; test x${#x} = "x3"') 2>/dev/null |
| then |
| # This is an XSI compatible shell, allowing a faster implementation... |
| eval 'func_len () |
| { |
| $debug_cmd |
| |
| func_len_result=${#1} |
| }' |
| else |
| # ...otherwise fall back to using expr, which is often a shell builtin. |
| func_len () |
| { |
| $debug_cmd |
| |
| func_len_result=`expr "$1" : ".*" 2>/dev/null || echo 0` |
| } |
| fi |
| |
| |
| # func_unset VAR |
| # -------------- |
| # Portably unset VAR. |
| # In some shells, an `unset VAR' statement leaves a non-zero return |
| # status if VAR is already unset, which might be problematic if the |
| # statement is used at the end of a function (thus poisoning its return |
| # value) or when `set -e' is active (causing even a spurious abort of |
| # the script in this case). |
| func_unset () |
| { |
| { eval $1=; unset $1; } |
| } |
| unset=func_unset |
| |
| |
| # func_cmp_s FILE1 FILE2 |
| # ---------------------- |
| # Return non-zero exit status unless FILE1 and FILE2 are identical, without |
| # any output at all, even error messages. |
| func_cmp_s () |
| { |
| $debug_cmd |
| |
| # This function relies on non-zero exit status, which will cause the |
| # program to exit when running in `set -e' mode. |
| $CMP "$@" >/dev/null 2>&1 |
| } |
| |
| |
| # 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 () |
| { |
| $debug_cmd |
| |
| # This function relies on non-zero exit status, which will cause the |
| # program to exit when running in `set -e' mode. |
| $GREP "$@" >/dev/null 2>&1 |
| } |
| |
| |
| # func_ifcontains LIST MEMBER YES-CMD [NO-CMD] |
| # -------------------------------------------- |
| # If whitespace-separated LIST contains MEMBER then execute YES-CMD, |
| # otherwise if NO-CMD was give, execute that. |
| func_ifcontains () |
| { |
| $debug_cmd |
| |
| # The embedded echo is to squash whitespace before globbing. |
| _G_wslist=`$bs_echo " "$1" "` |
| _G_member=$2 |
| _G_yes_cmd=$3 |
| _G_no_cmd=${4-":"} |
| |
| case $_G_wslist in |
| *" $_G_member "*) |
| eval "$_G_yes_cmd" |
| _G_status=$? |
| ;; |
| *) |
| eval "$_G_no_cmd" |
| _G_status=$? |
| ;; |
| esac |
| |
| test 0 -eq $_G_status || exit $_G_status |
| } |
| |
| |
| # func_append_u VAR VALUE |
| # ----------------------- |
| # Append unique VALUE onto the existing contents of VAR, assuming |
| # entries are delimited by the first character of VALUE. For example: |
| # |
| # func_append_u options " --another-option option-argument" |
| # |
| # will only append to $options if " --another-option option-argument " |
| # is not already present somewhere in $options already (note spaces at |
| # each end implied by leading space in second argument). |
| func_append_u () |
| { |
| $debug_cmd |
| |
| eval _G_current_value='`$bs_echo $'$1'`' |
| _G_delim=`expr "$2" : '\(.\)'` |
| |
| case $_G_delim$_G_current_value$_G_delim in |
| *"$2$_G_delim"*) ;; |
| *) func_append "$@" ;; |
| esac |
| } |
| |
| |
| # func_strpad STR WIDTH CHAR |
| # -------------------------- |
| # Trim STR, or pad with CHAR to force a total length of WIDTH. |
| func_strpad () |
| { |
| $debug_cmd |
| |
| _G_width=`expr "$2" - 1` |
| func_strpad_result=`$bs_echo "$1" |$SED ' |
| :a |
| s|^.\{0,'"$_G_width"'\}$|&'"$3"'| |
| ta |
| '` |
| } |
| |
| |
| # func_strrpad STR WIDTH CHAR |
| # --------------------------- |
| # Trim STR, or right-justify-pad with CHAR to force a total length of |
| # WIDTH. |
| func_strrpad () |
| { |
| $debug_cmd |
| |
| _G_width=`expr "$2" - 1` |
| func_strrpad_result=`$bs_echo "$1" |$SED ' |
| :a |
| s|^.\{0,'"$_G_width"'\}$|'"$3"'&| |
| ta |
| '` |
| } |
| |
| |
| # func_strrow INDENT FIELD WIDTH [FIELDn WIDTHn]... |
| # ------------------------------------------------- |
| # Return a string containing each FIELD left justified to WIDTH, with |
| # the whole thing indented by INDENT spaces. This function is used to |
| # render one row of aligned columns for a table by func_strtable(). |
| func_strrow () |
| { |
| $debug_cmd |
| |
| func_strrow_linelen=$1; shift |
| |
| _G_row= |
| while test $# -gt 0; do |
| func_strrow_linelen=`expr $func_strrow_linelen + $2` |
| func_strpad "$1" $2 " " |
| func_append _G_row "$func_strpad_result" |
| shift; shift |
| done |
| |
| func_strrpad "$_G_row" $func_strrow_linelen " " |
| func_strrow_result=$func_strrpad_result |
| } |
| |
| |
| # func_strtable INDENT WIDTH1...WIDTHn HEADER1...HEADERn FIELD1...FIELDn |
| # ---------------------------------------------------------------------- |
| # Generate a string of newline-separated rows arranged in lined-up |
| # columns of the given WIDTHs, with the entire table indented by INDENT |
| # spaces. The number of columns is determined by the number of integer |
| # valued WIDTH arguments following INDENT. The next set (i.e. a number |
| # of arguments equal to the number of WIDTH arguments) of fields are |
| # treated as the table's column HEADERs, and are separated from the |
| # remainder of the table by an indented row of `-' characters. Remaining |
| # arguments are each aligned below the next available header, wrapping |
| # to a new row as necessary. Finally another row of `-' characters is |
| # added to mark the end of the table. |
| # |
| # For example an unindented 3 column table with 2 rows of data would be |
| # generated by this call: |
| # |
| # func_strtable 3 20 10 25 \ |
| # Header1 Header2 Header3 \ |
| # Row1Col1 Row1Col2 Row1Col3 \ |
| # Row2Col1 Row2Col2 Row2Col3 |
| # |
| # returning the following string: |
| # |
| # " Header1 Header2 Header3 |
| # ------------------------------------------------------- |
| # Row1Col1 Row1Col2 Row1Col3 |
| # Row2Col1 Row2Col2 Row2Col3 |
| # -------------------------------------------------------" |
| func_strtable () |
| { |
| $debug_cmd |
| |
| # Save the indent value, we'll need it for each row we render. |
| _G_indent=$1; shift |
| |
| # Collect remaining numeric args into a list for reuse between |
| # members of each row when we call func_strrow later. |
| _G_widths=$1; shift |
| while test 0 -lt `expr "$1" : '[1-9][0-9]*$'`; do |
| 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. |
| _G_header=$_G_indent |
| for _G_width in $_G_widths; do |
| func_append _G_header " $1 $_G_width"; shift |
| done |
| func_strrow $_G_header |
| |
| # Strip off the indent, and make a divider with `-' chars, then |
| # reindent. |
| _G_divider=`$bs_echo "$func_strrow_result" \ |
| |$SED 's|[^ ]|-|g |
| :a |
| s|- |--|g |
| ta |
| '` |
| |
| # Append the header and divider to the running result. |
| func_append func_strtable_result "\ |
| $func_strrow_result |
| $_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 |
| _G_row=$_G_indent |
| for _G_width in $_G_widths; do |
| func_append _G_row " $1 $_G_width"; shift |
| done |
| 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 "$_G_divider" |
| } |
| |
| |
| # func_internal_error ARG... |
| # -------------------------- |
| # Echo program name prefixed message to standard error, and exit. |
| func_internal_error () |
| { |
| func_fatal_error "\ |
| INTERNAL: " ${1+"$@"} " |
| Please report this bug to \`bug-gnulib@gnu.org' |
| in as much detail as possible." |
| } |
| |
| |
| # func_permissions_error FILE-OR-DIRECTORY |
| # ---------------------------------------- |
| # Echo program name prefixed permissions error message to standard |
| # error, and exit. |
| func_permissions_error () |
| { |
| $debug_cmd |
| |
| func_fatal_error "Failed to create \`$1', check permissions." |
| } |
| |
| |
| # func_warning CATEGORY ARG... |
| # ---------------------------- |
| # Echo program name prefixed warning message to standard error. Warning |
| # messages can be filtered according to CATEGORY. |
| func_warning () |
| { |
| $debug_cmd |
| |
| case " $warning_categories " in |
| *" $1 "*) ;; |
| *) func_internal_error "invalid warning category \`$1'" ;; |
| esac |
| |
| _G_category=$1 |
| shift |
| |
| case " $opt_warning " in |
| *" $_G_category "*) $warning_func ${1+"$@"} ;; |
| esac |
| } |
| |
| |
| # func_show_eval CMD [FAIL_EXP] |
| # ----------------------------- |
| # Unless opt_silent is true, then output CMD. Then, if opt_dryrun is |
| # not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP |
| # is given, then evaluate it. |
| func_show_eval () |
| { |
| $debug_cmd |
| |
| _G_cmd=$1 |
| _G_fail_exp=${2-':'} |
| |
| ${opt_silent-'false'} || { |
| 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 "$_G_cmd" |
| _G_status=$? |
| test 0 -eq $_G_status || eval "(exit $_G_status); $_G_fail_exp" |
| } |
| } |
| |
| |
| # func_truncate_cmd CMD [ARG]... |
| # ------------------------------ |
| # For unreasonably long commands (such as a gnulib-tool invocation with |
| # the full module list for import), truncate CMD after the second non- |
| # option ARG. |
| func_truncate_cmd () |
| { |
| $debug_cmd |
| |
| _G_last_arg_opt_p=false |
| func_truncate_cmd_result= |
| |
| set dummy "$@"; shift |
| |
| while test $# -gt 0; do |
| _G_opt=$1; shift |
| |
| test -n "$func_truncate_cmd_result" \ |
| && func_append func_truncate_cmd_result ' ' |
| func_append func_truncate_cmd_result "$_G_opt" |
| |
| func_len "x$func_truncate_cmd_result" |
| |
| case $_G_opt in |
| -*) _G_last_arg_opt_p=: ;; |
| *) $_G_last_arg_opt_p \ |
| || test "$min_cmd_len" -gt "$func_len_result" \ |
| || break |
| _G_last_arg_opt_p=false |
| ;; |
| esac |
| done |
| |
| test $# -gt 0 && func_append func_truncate_cmd_result "..." |
| } |
| |
| |
| # func_insert_sorted_if_absent STR FILE... |
| # ---------------------------------------- |
| # If $STR is not already on a line by itself in $FILE, insert it, |
| # sorting the new contents of the file and replacing $FILE with the result. |
| func_insert_sorted_if_absent () |
| { |
| $debug_cmd |
| |
| str=$1 |
| shift |
| |
| for file |
| do |
| test -f "$file" || touch "$file" |
| |
| func_grep_q "$str" "$file" \ |
| && func_verbose "inserting \`$str' into \`$file'" |
| |
| $bs_echo "$str" |sort -u - "$file" |func_cmp_s - "$file" \ |
| || $bs_echo "$str" |sort -u - "$file" -o "$file" \ |
| || func_permissions_error "$file" |
| done |
| } |
| |
| |
| # func_sort_ver VER1 VER2 |
| # ----------------------- |
| # `sort -V' is not generally available. |
| # Note this deviates from the version comparison in automake |
| # in that it treats 1.5 < 1.5.0, and treats 1.4.4a < 1.4-p3a |
| # but this should suffice as we won't be specifying old |
| # version formats or redundant trailing .0 in bootstrap.conf. |
| # If we did want full compatibility then we should probably |
| # use m4_version_compare from autoconf. |
| func_sort_ver () |
| { |
| $debug_cmd |
| |
| ver1=$1 |
| ver2=$2 |
| |
| # Split on '.' and compare each component. |
| i=1 |
| while : ; do |
| p1=`echo "$ver1" |cut -d. -f$i` |
| p2=`echo "$ver2" |cut -d. -f$i` |
| if test ! "$p1"; then |
| echo "$1 $2" |
| break |
| elif test ! "$p2"; then |
| echo "$2 $1" |
| break |
| elif test ! "$p1" = "$p2"; then |
| if test "$p1" -gt "$p2" 2>/dev/null; then # numeric comparison |
| echo "$2 $1" |
| elif test "$p2" -gt "$p1" 2>/dev/null; then # numeric comparison |
| echo "$1 $2" |
| else # numeric, then lexicographic comparison |
| lp=`printf "$p1\n$p2\n" |sort -n |tail -n1` |
| if test "$lp" = "$p2"; then |
| echo "$1 $2" |
| else |
| echo "$2 $1" |
| fi |
| fi |
| break |
| fi |
| i=`expr $i + 1` |
| done |
| } |
| |
| |
| # func_get_version APP |
| # -------------------- |
| # echo the version number (if any) of APP, which is looked up along your |
| # PATH. |
| func_get_version () |
| { |
| $debug_cmd |
| |
| _G_app=$1 |
| |
| # Rather than uncomment the sed script in-situ, strip the comments |
| # programatically before passing the result to $SED for evaluation. |
| sed_get_version=`$bs_echo '# extract version within line |
| s|.*[v ]\{1,\}\([0-9]\{1,\}\.[.a-z0-9-]*\).*|\1| |
| t done |
| |
| # extract version at start of line |
| s|^\([0-9]\{1,\}\.[.a-z0-9-]*\).*|\1| |
| t done |
| |
| d |
| |
| :done |
| # the following essentially does s|5.005|5.5| |
| s|\.0*\([1-9]\)|.\1|g |
| p |
| q' \ |
| |$SED '/^[ ]*#.*$/d'` |
| |
| func_tool_version_output $_G_app >/dev/null |
| _G_status=$? |
| |
| test 0 -ne $_G_status \ |
| || $_G_app --version 2>&1 |$SED -n "$sed_get_version" |
| |
| (exit $_G_status) |
| } |
| |
| |
| # func_check_versions APP1 VER1 URL1 ...[APPN VERN URLN] |
| # ------------------------------------------------------ |
| func_check_versions () |
| { |
| $debug_cmd |
| |
| func_check_versions_result=: |
| |
| while test $# -gt 0; do |
| _G_app=$1; shift |
| _G_reqver=$1; shift |
| _G_url=$1; shift |
| |
| # Honor $APP variables ($TAR, $AUTOCONF, etc.) |
| _G_appvar=`echo $_G_app |tr '[a-z]' '[A-Z]'` |
| test TAR = "$_G_appvar" && _G_appvar=AMTAR |
| eval "_G_app=\${$_G_appvar-$_G_app}" |
| _G_instver=`func_get_version $_G_app` |
| |
| test -z "$_G_instver" \ |
| || func_verbose "found \`$_G_app' version $_G_instver" |
| |
| # Fail if --version didn't work. |
| 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 "$_G_reqver" != -; then |
| _G_newer=`func_sort_ver $_G_reqver $_G_instver |cut -d' ' -f2` |
| test "$_G_newer" != "$_G_instver" && { |
| func_error "\ |
| \`$_G_app' version == $_G_instver is too old |
| \`$_G_app' version >= $_G_reqver is required" |
| func_check_versions_result=false |
| } |
| fi |
| done |
| } |
| |
| |
| # func_cleanup_gnulib |
| # ------------------- |
| # Recursively delete everything below the path in the global variable |
| # GNULIB_PATH. |
| func_cleanup_gnulib () |
| { |
| $debug_cmd |
| |
| _G_status=$? |
| $RM -fr "$gnulib_path" |
| exit $_G_status |
| } |
| |
| |
| # func_download_po_files SUBDIR DOMAIN |
| # ------------------------------------ |
| func_download_po_files () |
| { |
| $debug_cmd |
| |
| func_echo "getting translations into $1 for $2..." |
| _G_cmd=`printf "$po_download_command_format" "$2" "$1"` |
| eval "$_G_cmd" |
| } |
| |
| |
| # func_update_po_files PO_DIR DOMAIN |
| # ---------------------------------- |
| # Mirror .po files to $po_dir/.reference and copy only the new |
| # or modified ones into $po_dir. Also update $po_dir/LINGUAS. |
| # Note po files that exist locally only are left in $po_dir but will |
| # not be included in LINGUAS and hence will not be distributed. |
| func_update_po_files () |
| { |
| $debug_cmd |
| |
| # Directory containing primary .po files. |
| # Overwrite them only when we're sure a .po file is new. |
| _G_po_dir=$1 |
| _G_domain=$2 |
| |
| # Mirror *.po files into this dir. |
| # Usually contains *.s1 checksum files. |
| _G_ref_po_dir=$_G_po_dir/.reference |
| |
| 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+. |
| func_find_tool SHA1SUM sha1sum gsha1sum shasum |
| |
| _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 |
| } |
| |
| |
| |
| ## --------------- ## |
| ## Option parsing. ## |
| ## --------------- ## |
| |
| # Hook in the functions to make sure our own options are parsed during |
| # the option parsing loop. |
| |
| usage='$progpath [OPTION]...' |
| |
| # 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 |
| ' |
| |
| # 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_warn |
| |
| # 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+"$@"} |
| bootstrap_options_prep_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. |
| 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+"$@"} |
| bootstrap_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+"$@"} |
| bootstrap_validate_options_result=$func_quote_for_eval_result |
| } |
| func_add_hook func_validate_options bootstrap_validate_options |
| |
| |
| ## -------------------------------------------------- ## |
| ## Source package customisations in `bootstrap.conf'. ## |
| ## -------------------------------------------------- ## |
| |
| # Override the default configuration, if necessary. |
| # Make sure that bootstrap.conf is sourced from the current directory |
| # if we were invoked as "sh bootstrap". |
| case $0 in |
| */*) test -r "$0.conf" && . "$0.conf" ;; |
| *) test -r "$0.conf" && . ./"$0.conf" ;; |
| esac |
| |
| |
| ## ------------------------------- ## |
| ## Actually perform the bootstrap. ## |
| ## ------------------------------- ## |
| |
| func_bootstrap ${1+"$@"} |
| |
| # The End. |
| exit ${exit_status-$EXIT_SUCCESS} |
| |
| # 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: |