Mercurial > hg > octave-lojdl > gnulib-hg
changeset 16850:f87aab0c02ac
bootstrap: take advantage of POSIX shell features
The 'bootstrap' script offered by Gnulib script already uses POSIX
shell features (like $((...)) arithmetic expansions) that are not
supported by legacy Bourne shells like Solaris 10 /bin/sh. This
means that bootstrap must already be run using a proper POSIX shell,
which will thus provide more features, like ${var#pattern} parameter
expansion or inversion of a command exit status with '!'. We can
thus use these features to improve the clarity and the performances
of the bootstrap script.
Suggested by Eric Blake.
* build-aux/bootstrap: Prefer xpg4 parameter expansions over use
of sed/expr plus command substitutions, to save some forks. While
we are at it, prefer the POSIX $(...) form of command substitution,
rather than the legacy form `...` (since the former is visually
clearer and interacts better with quoting), and prefer the idiom:
"if ! CMD; then ACTION ..."
over the idiom:
"if CMD; then :; else ACTION ..."
which was required by legacy Bourne shells not supporting '!'.
author | Stefano Lattarini <stefano.lattarini@gmail.com> |
---|---|
date | Sun, 13 May 2012 10:17:51 +0200 |
parents | 1aa668619908 |
children | 2ef869fa79b4 |
files | ChangeLog build-aux/bootstrap |
diffstat | 2 files changed, 44 insertions(+), 21 deletions(-) [+] |
line wrap: on
line diff
--- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,28 @@ +2012-05-13 Stefano Lattarini <stefano.lattarini@gmail.com> + + bootstrap: take advantage of POSIX shell features + + The 'bootstrap' script offered by Gnulib script already uses POSIX + shell features (like $((...)) arithmetic expansions) that are not + supported by legacy Bourne shells like Solaris 10 /bin/sh. This + means that bootstrap must already be run using a proper POSIX shell, + which will thus provide more features, like ${var#pattern} parameter + expansion or inversion of a command exit status with '!'. We can + thus use these features to improve the clarity and the performances + of the bootstrap script. + + Suggested by Eric Blake. + + * build-aux/bootstrap: Prefer xpg4 parameter expansions over use + of sed/expr plus command substitutions, to save some forks. While + we are at it, prefer the POSIX $(...) form of command substitution, + rather than the legacy form `...` (since the former is visually + clearer and interacts better with quoting), and prefer the idiom: + "if ! CMD; then ACTION ..." + over the idiom: + "if CMD; then :; else ACTION ..." + which was required by legacy Bourne shells not supporting '!'. + 2012-05-12 Bruno Haible <bruno@clisp.org> system-quote: Add more comments.
--- a/build-aux/bootstrap +++ b/build-aux/bootstrap @@ -1,6 +1,6 @@ #! /bin/sh # Print a version string. -scriptversion=2012-04-26.13; # UTC +scriptversion=2012-05-13.09; # UTC # Bootstrap this package from checked-out sources. @@ -130,7 +130,7 @@ p } ' -package=`sed -n "$extract_package_name" configure.ac` || exit +package=$(sed -n "$extract_package_name" configure.ac) || exit gnulib_name=lib$package build_aux=build-aux @@ -256,7 +256,7 @@ usage exit;; --gnulib-srcdir=*) - GNULIB_SRCDIR=`expr "X$option" : 'X--gnulib-srcdir=\(.*\)'`;; + GNULIB_SRCDIR=${option#--gnulib-srcdir=};; --skip-po) SKIP_PO=t;; --force) @@ -323,7 +323,7 @@ # A .gitignore entry that does not start with '/' applies # recursively to subdirectories, so prepend '/' to every # .gitignore entry. - pattern=`echo "$pattern" | sed s,^,/,`;; + pattern=$(echo "$pattern" | sed s,^,/,);; esac insert_sorted_if_absent "$vc_ignore_file" "$pattern" } @@ -427,7 +427,7 @@ $use_git || continue fi # Honor $APP variables ($TAR, $AUTOCONF, etc.) - appvar=`echo $app | LC_ALL=C tr '[a-z]-' '[A-Z]_'` + appvar=$(echo $app | LC_ALL=C tr '[a-z]-' '[A-Z]_') test "$appvar" = TAR && appvar=AMTAR case $appvar in GZIP) ;; # Do not use $GZIP: it contains gzip options. @@ -442,7 +442,7 @@ # "GNU automake-ng") when asked their version. case $app in automake-ng|aclocal-ng) - app=`echo "$app" | sed 's/-ng$//'` + app=${app%-ng} ($app --version | grep '(GNU automake-ng)') >/dev/null 2>&1 || { echo "$me: Error: '$app' not found or not from Automake-NG" >&2 ret=1 @@ -512,10 +512,8 @@ # When we can deduce that gnulib-tool will require patch, # and when patch is not already listed as a prerequisite, add it, too. -if test ! -d "$local_gl_dir" \ - || find "$local_gl_dir" -name '*.diff' -exec false {} +; then - : -else +if test -d "$local_gl_dir" \ + && ! find "$local_gl_dir" -name '*.diff' -exec false {} +; then case $buildreq in *patch*) ;; *) buildreq="patch - @@ -559,7 +557,7 @@ test -f .gitmodules && git config --file .gitmodules "$@" } -gnulib_path=`git_modules_config submodule.gnulib.path` +gnulib_path=$(git_modules_config submodule.gnulib.path) test -z "$gnulib_path" && gnulib_path=gnulib # Get gnulib files. @@ -632,10 +630,10 @@ subdir=$1 domain=$2 echo "$me: getting translations into $subdir for $domain..." - cmd=`printf "$po_download_command_format" "$domain" "$subdir"` + cmd=$(printf "$po_download_command_format" "$domain" "$subdir") eval "$cmd" && return # Fallback to HTTP. - cmd=`printf "$po_download_command_format2" "$subdir" "$domain"` + cmd=$(printf "$po_download_command_format2" "$subdir" "$domain") eval "$cmd" } @@ -658,7 +656,7 @@ && ls "$ref_po_dir"/*.po 2>/dev/null | sed 's|.*/||; s|\.po$||' > "$po_dir/LINGUAS" || return - langs=`cd $ref_po_dir && echo *.po|sed 's/\.po//g'` + 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 @@ -695,18 +693,18 @@ # If the destination directory doesn't exist, create it. # This is required at least for "lib/uniwidth/cjk.h". - dst_dir=`dirname "$dst"` + dst_dir=$(dirname "$dst") if ! test -d "$dst_dir"; then mkdir -p "$dst_dir" # If we've just created a directory like lib/uniwidth, # tell version control system(s) it's ignorable. # FIXME: for now, this does only one level - parent=`dirname "$dst_dir"` + parent=$(dirname "$dst_dir") for dot_ig in x $vc_ignore; do test $dot_ig = x && continue ig=$parent/$dot_ig - insert_vc_ignore $ig `echo "$dst_dir"|sed 's,.*/,,'` + insert_vc_ignore $ig "${dst_dir##*/}" done fi @@ -730,10 +728,10 @@ # so that broken tools aren't confused into skipping needed builds. See # <http://lists.gnu.org/archive/html/bug-gnulib/2011-05/msg00326.html>. test -h "$dst" && - src_ls=`ls -diL "$src" 2>/dev/null` && set $src_ls && src_i=$1 && - dst_ls=`ls -diL "$dst" 2>/dev/null` && set $dst_ls && dst_i=$1 && + src_ls=$(ls -diL "$src" 2>/dev/null) && set $src_ls && src_i=$1 && + dst_ls=$(ls -diL "$dst" 2>/dev/null) && set $dst_ls && dst_i=$1 && test "$src_i" = "$dst_i" && - both_ls=`ls -dt "$src" "$dst"` && + both_ls=$(ls -dt "$src" "$dst") && test "X$both_ls" = "X$dst$nl$src" || { dot_dots= case $src in @@ -868,7 +866,7 @@ for file in $gnulib_extra_files; do case $file in */INSTALL) dst=INSTALL;; - build-aux/*) dst=$build_aux/`expr "$file" : 'build-aux/\(.*\)'`;; + build-aux/*) dst=$build_aux/${file#build-aux/};; *) dst=$file;; esac symlink_to_dir "$GNULIB_SRCDIR" $file $dst || exit