FYI, From 4c779b19551bea70e9f3152566414fe810e40e60 Mon Sep 17 00:00:00 2001 From: Jim Meyering <meyer...@redhat.com> Date: Thu, 14 Apr 2011 12:01:37 +0200 Subject: [PATCH] maint: update bootstrap and init.sh from gnulib
* bootstrap: Likewise. * tests/init.sh: Update from gnulib. --- bootstrap | 169 ++++++++++++++++++++++++++++++++++++++------------------- tests/init.sh | 53 +++++++++++-------- 2 files changed, 145 insertions(+), 77 deletions(-) diff --git a/bootstrap b/bootstrap index aab03a8..7cbb5dc 100755 --- a/bootstrap +++ b/bootstrap @@ -1,6 +1,6 @@ #! /bin/sh # Print a version string. -scriptversion=2010-10-08.16; # UTC +scriptversion=2011-04-05.18; # UTC # Bootstrap this package from checked-out sources. @@ -42,24 +42,32 @@ local_gl_dir=gl bt='._bootmp' bt_regex=`echo "$bt"| sed 's/\./[.]/g'` bt2=${bt}2 +me=$0 usage() { cat <<EOF -Usage: $0 [OPTION]... +Usage: $me [OPTION]... Bootstrap this package from the checked-out sources. Options: - --gnulib-srcdir=DIRNAME Specify the local directory where gnulib + --gnulib-srcdir=DIRNAME specify the local directory where gnulib sources reside. Use this if you already have gnulib sources on your machine, and do not want to waste your bandwidth downloading - them again. Defaults to \$GNULIB_SRCDIR. - --copy Copy files instead of creating symbolic links. - --force Attempt to bootstrap even if the sources seem - not to have been checked out. - --skip-po Do not download po files. - -If the file $0.conf exists in the same directory as this script, its + them again. Defaults to \$GNULIB_SRCDIR + --bootstrap-sync if this bootstrap script is not identical to + the version in the local gnulib sources, + update this script, and then restart it with + /bin/sh or the shell \$CONFIG_SHELL + --no-bootstrap-sync do not check whether bootstrap is out of sync + --copy copy files instead of creating symbolic links + --force attempt to bootstrap even if the sources seem + not to have been checked out + --no-git do not use git to update gnulib. Requires that + --gnulib-srcdir point to a correct gnulib snapshot + --skip-po do not download po files + +If the file $me.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 @@ -122,18 +130,7 @@ source_base=lib m4_base=m4 doc_base=doc tests_base=tests - -# Extra files from gnulib, which override files from other sources. -gnulib_extra_files=" - $build_aux/install-sh - $build_aux/missing - $build_aux/mdate-sh - $build_aux/texinfo.tex - $build_aux/depcomp - $build_aux/config.guess - $build_aux/config.sub - doc/INSTALL -" +gnulib_extra_files='' # Additional gnulib-tool options to use. Use "\newline" to break lines. gnulib_tool_option_extras= @@ -168,6 +165,13 @@ copy=false # on which version control system (if any) is used in the source directory. vc_ignore=auto +# Set this to true in bootstrap.conf to enable --bootstrap-sync by +# default. +bootstrap_sync=false + +# Use git to update gnulib sources +use_git=true + # find_tool ENVVAR NAMES... # ------------------------- # Search for a required program. Use the value of ENVVAR, if set, @@ -192,11 +196,11 @@ find_tool () find_tool_error_prefix="\$$find_tool_envvar: " fi if test x"$find_tool_res" = x; then - echo >&2 "$0: one of these is required: $find_tool_names" + echo >&2 "$me: one of these is required: $find_tool_names" exit 1 fi ($find_tool_res --version </dev/null) >/dev/null 2>&1 || { - echo >&2 "$0: ${find_tool_error_prefix}cannot run $find_tool_res --version" + echo >&2 "$me: ${find_tool_error_prefix}cannot run $find_tool_res --version" exit 1 } eval "$find_tool_envvar=\$find_tool_res" @@ -214,6 +218,18 @@ case "$0" in *) test -r "$0.conf" && . ./"$0.conf" ;; esac +# Extra files from gnulib, which override files from other sources. +test -z "${gnulib_extra_files}" && \ + gnulib_extra_files=" + $build_aux/install-sh + $build_aux/missing + $build_aux/mdate-sh + $build_aux/texinfo.tex + $build_aux/depcomp + $build_aux/config.guess + $build_aux/config.sub + doc/INSTALL +" if test "$vc_ignore" = auto; then vc_ignore= @@ -239,25 +255,53 @@ do checkout_only_file=;; --copy) copy=true;; + --bootstrap-sync) + bootstrap_sync=true;; + --no-bootstrap-sync) + bootstrap_sync=false;; + --no-git) + use_git=false;; *) echo >&2 "$0: $option: unknown option" exit 1;; esac done +if $use_git || test -d "$GNULIB_SRCDIR"; then + : +else + echo "$0: Error: --no-git requires --gnulib-srcdir" >&2 + exit 1 +fi + if test -n "$checkout_only_file" && test ! -r "$checkout_only_file"; then echo "$0: Bootstrapping from a non-checked-out distribution is risky." >&2 exit 1 fi +# Ensure that lines starting with ! sort last, per gitignore conventions +# for whitelisting exceptions after a more generic blacklist pattern. +sort_patterns() { + sort -u "$@" | sed '/^!/ { + H + d + } + $ { + P + x + s/^\n// + }' +} + # 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. insert_sorted_if_absent() { file=$1 str=$2 test -f $file || touch $file - echo "$str" | sort -u - $file | cmp - $file > /dev/null \ - || echo "$str" | sort -u - $file -o $file \ + echo "$str" | sort_patterns - $file | cmp - $file > /dev/null \ + || { echo "$str" | sort_patterns - $file > $file.bak \ + && mv $file.bak $file; } \ || exit 1 } @@ -344,17 +388,18 @@ get_version() { $app --version >/dev/null 2>&1 || return 1 $app --version 2>&1 | - sed -n '# extract version within line - s/.*[v ]\{1,\}\([0-9]\{1,\}\.[.a-z0-9-]*\).*/\1/ - t done + sed -n '# Move version to start of line. + s/.*[v ]\([0-9]\)/\1/ + + # Skip lines that do not start with version. + /^[0-9]/!d - # extract version at start of line - s/^\([0-9]\{1,\}\.[.a-z0-9-]*\).*/\1/ - t done + # Remove characters after the version. + s/[^.a-z0-9-].*// - d + # The first component must be digits only. + s/^\([0-9]*\)[a-z-].*/\1/ - :done #the following essentially does s/5.005/5.5/ s/\.0*\([1-9]\)/.\1/g p @@ -369,18 +414,22 @@ check_versions() { if test "$app" = libtool; then app=libtoolize fi + # Exempt git if --no-git is in effect. + if test "$app" = git; then + $use_git || continue + fi # Honor $APP variables ($TAR, $AUTOCONF, etc.) appvar=`echo $app | tr '[a-z]-' '[A-Z]_'` test "$appvar" = TAR && appvar=AMTAR eval "app=\${$appvar-$app}" inst_ver=$(get_version $app) if [ ! "$inst_ver" ]; then - echo "Error: '$app' not found" >&2 + echo "$me: Error: '$app' not found" >&2 ret=1 elif [ ! "$req_ver" = "-" ]; then latest_ver=$(sort_ver $req_ver $inst_ver | cut -d' ' -f2) if [ ! "$latest_ver" = "$inst_ver" ]; then - echo "Error: '$app' version == $inst_ver is too old" >&2 + echo "$me: Error: '$app' version == $inst_ver is too old" >&2 echo " '$app' version >= $req_ver is required" >&2 ret=1 fi @@ -413,9 +462,9 @@ fi if ! printf "$buildreq" | check_versions; then echo >&2 if test -f README-prereq; then - echo "See README-prereq for how to get the prerequisite programs" >&2 + echo "$0: See README-prereq for how to get the prerequisite programs" >&2 else - echo "Please install the prerequisite programs" >&2 + echo "$0: Please install the prerequisite programs" >&2 fi exit 1 fi @@ -427,11 +476,11 @@ if test -d .git && (git --version) >/dev/null 2>/dev/null ; then if git config merge.merge-changelog.driver >/dev/null ; then : elif (git-merge-changelog --version) >/dev/null 2>/dev/null ; then - echo "initializing git-merge-changelog driver" + echo "$0: 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 - echo "consider installing git-merge-changelog from gnulib" + echo "$0: consider installing git-merge-changelog from gnulib" fi fi @@ -447,7 +496,7 @@ git_modules_config () { } gnulib_path=`git_modules_config submodule.gnulib.path` -: ${gnulib_path=gnulib} +test -z "$gnulib_path" && gnulib_path=gnulib # Get gnulib files. @@ -500,6 +549,16 @@ case ${GNULIB_SRCDIR--} in ;; esac +if $bootstrap_sync; then + cmp -s "$0" "$GNULIB_SRCDIR/build-aux/bootstrap" || { + echo "$0: updating bootstrap and restarting..." + exec sh -c \ + 'cp "$1" "$2" && shift && exec "${CONFIG_SHELL-/bin/sh}" "$@"' \ + -- "$GNULIB_SRCDIR/build-aux/bootstrap" \ + "$0" "$@" --no-bootstrap-sync + } +fi + gnulib_tool=$GNULIB_SRCDIR/gnulib-tool <$gnulib_tool || exit @@ -508,7 +567,7 @@ gnulib_tool=$GNULIB_SRCDIR/gnulib-tool download_po_files() { subdir=$1 domain=$2 - echo "$0: getting translations into $subdir for $domain..." + echo "$me: getting translations into $subdir for $domain..." cmd=`printf "$po_download_command_format" "$domain" "$subdir"` eval "$cmd" } @@ -542,7 +601,7 @@ update_po_files() { ! test -f "$po_dir/$po.po" || ! $SHA1SUM -c --status "$cksum_file" \ < "$new_po" > /dev/null; then - echo "updated $po_dir/$po.po..." + echo "$me: updated $po_dir/$po.po..." cp "$new_po" "$po_dir/$po.po" \ && $SHA1SUM < "$new_po" > "$cksum_file" fi @@ -587,13 +646,13 @@ symlink_to_dir() if $copy; then { test ! -h "$dst" || { - echo "$0: rm -f $dst" && + echo "$me: rm -f $dst" && rm -f "$dst" } } && test -f "$dst" && cmp -s "$src" "$dst" || { - echo "$0: cp -fp $src $dst" && + echo "$me: cp -fp $src $dst" && cp -fp "$src" "$dst" } else @@ -607,7 +666,7 @@ symlink_to_dir() *) case /$dst/ in *//* | */../* | */./* | /*/*/*/*/*/) - echo >&2 "$0: invalid symlink calculation: $src -> $dst" + echo >&2 "$me: invalid symlink calculation: $src -> $dst" exit 1;; /*/*/*/*/) dot_dots=../../../;; /*/*/*/) dot_dots=../../;; @@ -615,7 +674,7 @@ symlink_to_dir() esac;; esac - echo "$0: ln -fs $dot_dots$src $dst" && + echo "$me: ln -fs $dot_dots$src $dst" && ln -fs "$dot_dots$src" "$dst" } fi @@ -648,7 +707,7 @@ cp_mark_as_generated() cmp -s "$cp_src" "$cp_dst" || { # Copy the file first to get proper permissions if it # doesn't already exist. Then overwrite the copy. - echo "$0: cp -f $cp_src $cp_dst" && + echo "$me: cp -f $cp_src $cp_dst" && rm -f "$cp_dst" && cp "$cp_src" "$cp_dst-t" && sed "s!$bt_regex/!!g" "$cp_src" > "$cp_dst-t" && @@ -666,7 +725,7 @@ cp_mark_as_generated() if cmp -s "$cp_dst-t" "$cp_dst"; then rm -f "$cp_dst-t" else - echo "$0: cp $cp_src $cp_dst # with edits" && + echo "$me: cp $cp_src $cp_dst # with edits" && mv -f "$cp_dst-t" "$cp_dst" fi fi @@ -685,7 +744,7 @@ version_controlled_file() { elif test -d .svn; then svn log -r HEAD "$dir/$file" > /dev/null 2>&1 && found=yes else - echo "$0: no version control for $dir/$file?" >&2 + echo "$me: no version control for $dir/$file?" >&2 fi test $found = yes } @@ -709,18 +768,18 @@ slurp() { remove_intl='/^[^#].*\/intl/s/^/#/;'"s!$bt_regex/!!g" sed "$remove_intl" $1/$dir/$file | cmp - $dir/$gnulib_mk > /dev/null || { - echo "$0: Copying $1/$dir/$file to $dir/$gnulib_mk ..." && + echo "$me: Copying $1/$dir/$file to $dir/$gnulib_mk ..." && rm -f $dir/$gnulib_mk && sed "$remove_intl" $1/$dir/$file >$dir/$gnulib_mk && gnulib_mk_hook $dir/$gnulib_mk } elif { test "${2+set}" = set && test -r $2/$dir/$file; } || version_controlled_file $dir $file; then - echo "$0: $dir/$file overrides $1/$dir/$file" + echo "$me: $dir/$file overrides $1/$dir/$file" else copied=$copied$sep$file; sep=$nl if test $file = gettext.m4; then - echo "$0: patching m4/gettext.m4 to remove need for intl/* ..." + echo "$me: patching m4/gettext.m4 to remove need for intl/* ..." rm -f $dir/$file sed ' /^AC_DEFUN(\[AM_INTL_SUBDIR],/,/^]/c\ @@ -831,7 +890,7 @@ grep -E '^[ ]*AC_CONFIG_HEADERS?\>' configure.ac >/dev/null || for command in \ libtool \ - "${ACLOCAL-aclocal} --force -I m4 $ACLOCAL_FLAGS" \ + "${ACLOCAL-aclocal} --force -I '$m4_base' $ACLOCAL_FLAGS" \ "${AUTOCONF-autoconf} --force" \ "${AUTOHEADER-autoheader} --force" \ "${AUTOMAKE-automake} --add-missing --copy --force-missing" @@ -842,7 +901,7 @@ do command="${LIBTOOLIZE-libtoolize} -c -f" fi echo "$0: $command ..." - $command || exit + eval "$command" || exit done diff --git a/tests/init.sh b/tests/init.sh index 366701a..71c6516 100644 --- a/tests/init.sh +++ b/tests/init.sh @@ -74,10 +74,10 @@ Exit () { set +e; (exit $1); exit $1; } # the reason for skip/failure to console, rather than to the .log files. : ${stderr_fileno_=2} -warn_() { echo "$@" 1>&$stderr_fileno_; } -fail_() { warn_ "$ME_: failed test: $@"; Exit 1; } -skip_() { warn_ "$ME_: skipped test: $@"; Exit 77; } -framework_failure_() { warn_ "$ME_: set-up failure: $@"; Exit 99; } +warn_ () { echo "$@" 1>&$stderr_fileno_; } +fail_ () { warn_ "$ME_: failed test: $@"; Exit 1; } +skip_ () { warn_ "$ME_: skipped test: $@"; Exit 77; } +framework_failure_ () { warn_ "$ME_: set-up failure: $@"; Exit 99; } # Sanitize this shell to POSIX mode, if possible. DUALCASE=1; export DUALCASE @@ -111,7 +111,7 @@ fi # Eval this code in a subshell to determine a shell's suitability. # 10 - passes all tests; ok to use -# 9 - ok, but enabling "set -x" corrupts application stderr; prefer higher score +# 9 - ok, but enabling "set -x" corrupts app stderr; prefer higher score # ? - not ok gl_shell_test_script_=' test $(echo y) = y || exit 1 @@ -193,7 +193,7 @@ fi test -n "$EXEEXT" && shopt -s expand_aliases # Enable glibc's malloc-perturbing option. -# This is cheap and useful for exposing code that depends on the fact that +# This is useful for exposing code that depends on the fact that # malloc-related functions often return memory that is mostly zeroed. # If you have the time and cycles, use valgrind to do an even better job. : ${MALLOC_PERTURB_=87} @@ -202,22 +202,22 @@ export MALLOC_PERTURB_ # This is a stub function that is run upon trap (upon regular exit and # interrupt). Override it with a per-test function, e.g., to unmount # a partition, or to undo any other global state changes. -cleanup_() { :; } +cleanup_ () { :; } if ( diff --version < /dev/null 2>&1 | grep GNU ) > /dev/null 2>&1; then - compare() { diff -u "$@"; } + compare () { diff -u "$@"; } elif ( cmp --version < /dev/null 2>&1 | grep GNU ) > /dev/null 2>&1; then - compare() { cmp -s "$@"; } + compare () { cmp -s "$@"; } else - compare() { cmp "$@"; } + compare () { cmp "$@"; } fi # An arbitrary prefix to help distinguish test directories. -testdir_prefix_() { printf gt; } +testdir_prefix_ () { printf gt; } # Run the user-overridable cleanup_ function, remove the temporary # directory and exit with the incoming value of $?. -remove_tmp_() +remove_tmp_ () { __st=$? cleanup_ @@ -233,7 +233,7 @@ remove_tmp_() # contains only the specified bytes (see the case stmt below), then print # a space-separated list of those names and return 0. Otherwise, don't # print anything and return 1. Naming constraints apply also to DIR. -find_exe_basenames_() +find_exe_basenames_ () { feb_dir_=$1 feb_fail_=0 @@ -245,6 +245,9 @@ find_exe_basenames_() # below, just skip it. test "x$feb_file_" = "x$feb_dir_/*.exe" && test ! -f "$feb_file_" \ && continue + # Exempt [.exe, since we can't create a function by that name, yet + # we can't invoke [ by PATH search anyways due to shell builtins. + test "x$feb_file_" = "x$feb_dir_/[.exe" && continue case $feb_file_ in *[!-a-zA-Z/0-9_.+]*) feb_fail_=1; break;; *) # Remove leading file name components as well as the .exe suffix. @@ -263,7 +266,7 @@ find_exe_basenames_() # PROG that simply invokes PROG.exe, then return 0. If any selected # file name or the directory name, $1, contains an unexpected character, # define no alias and return 1. -create_exe_shims_() +create_exe_shims_ () { case $EXEEXT in '') return 0 ;; @@ -272,7 +275,7 @@ create_exe_shims_() esac base_names_=`find_exe_basenames_ $1` \ - || { echo "$0 (exe_shim): skipping directory: $1" 1>&2; return 1; } + || { echo "$0 (exe_shim): skipping directory: $1" 1>&2; return 0; } if test -n "$base_names_"; then for base_ in $base_names_; do @@ -285,7 +288,7 @@ create_exe_shims_() # Use this function to prepend to PATH an absolute name for each # specified, possibly-$initial_cwd_-relative, directory. -path_prepend_() +path_prepend_ () { while test $# != 0; do path_dir_=$1 @@ -308,7 +311,7 @@ path_prepend_() export PATH } -setup_() +setup_ () { if test "$VERBOSE" = yes; then # Test whether set -x may cause the selected shell to corrupt an @@ -324,12 +327,19 @@ setup_() fi initial_cwd_=$PWD + fail=0 pfx_=`testdir_prefix_` test_dir_=`mktempd_ "$initial_cwd_" "$pfx_-$ME_.XXXX"` \ || fail_ "failed to create temporary directory in $initial_cwd_" cd "$test_dir_" + # As autoconf-generated configure scripts do, ensure that IFS + # is defined initially, so that saving and restoring $IFS works. + gl_init_sh_nl_=' +' + IFS=" "" $gl_init_sh_nl_" + # This trap statement, along with a trap on 0 below, ensure that the # temporary directory, $test_dir_, is removed upon exit as well as # upon receipt of any of the listed signals. @@ -354,7 +364,7 @@ setup_() # - make only $MAX_TRIES_ attempts # Helper function. Print $N pseudo-random bytes from a-zA-Z0-9. -rand_bytes_() +rand_bytes_ () { n_=$1 @@ -386,7 +396,7 @@ rand_bytes_() | LC_ALL=C tr -c $chars_ 01234567$chars_$chars_$chars_ } -mktempd_() +mktempd_ () { case $# in 2);; @@ -407,11 +417,10 @@ mktempd_() case $template_ in *XXXX) ;; - *) fail_ "invalid template: $template_ (must have a suffix of at least 4 X's)";; + *) fail_ \ + "invalid template: $template_ (must have a suffix of at least 4 X's)";; esac - fail=0 - # First, try to use mktemp. d=`unset TMPDIR; mktemp -d -t -p "$destdir_" "$template_" 2>/dev/null` \ || fail=1 -- 1.7.5.rc1.228.g86d60b