diff mbox

Stop using "which" in ./configure

Message ID 20100119114750.GB11613@bee.dooz.org
State New
Headers show

Commit Message

Loïc Minier Jan. 19, 2010, 11:47 a.m. UTC
On Tue, Jan 19, 2010, Loïc Minier wrote:
>  Following the thread on the sdl-config patch, please find attached a
>  patch to add a couple of portable shell functions which allow testing
>  whehter a command/builtin is available and to find the full pathname of
>  an executable in the PATH.  This also replaces all uses of "which" in
>  ./configure.  (This should be applied on top of the sdl-config patch.)

 Please find attached a new version of the patch with a simpler version
 of path_of() which uses IFS instead of the ${foo#bar} and ${foo%%bar}
 constructs.  It also removes the special casing of an empty PATH.

Comments

Stefan Weil Jan. 19, 2010, 5:42 p.m. UTC | #1
Loïc Minier schrieb:
> On Tue, Jan 19, 2010, Loïc Minier wrote:
>   
>>  Following the thread on the sdl-config patch, please find attached a
>>  patch to add a couple of portable shell functions which allow testing
>>  whehter a command/builtin is available and to find the full pathname of
>>  an executable in the PATH.  This also replaces all uses of "which" in
>>  ./configure.  (This should be applied on top of the sdl-config patch.)
>>     
>
>  Please find attached a new version of the patch with a simpler version
>  of path_of() which uses IFS instead of the ${foo#bar} and ${foo%%bar}
>  constructs.  It also removes the special casing of an empty PATH.

I did not test the whole patch, but I think this would be better:

+    type "$local_command" >/dev/null 2>&1

(type sends error messages to stderr, we don't want to see them)
Måns Rullgård Jan. 19, 2010, 6:09 p.m. UTC | #2
Loïc Minier <lool@dooz.org> writes:

> On Tue, Jan 19, 2010, Loïc Minier wrote:
>>  Following the thread on the sdl-config patch, please find attached a
>>  patch to add a couple of portable shell functions which allow testing
>>  whehter a command/builtin is available and to find the full pathname of
>>  an executable in the PATH.  This also replaces all uses of "which" in
>>  ./configure.  (This should be applied on top of the sdl-config patch.)
>
>  Please find attached a new version of the patch with a simpler version
>  of path_of() which uses IFS instead of the ${foo#bar} and ${foo%%bar}
>  constructs.  It also removes the special casing of an empty PATH.
>
> -- 
> Loïc Minier
>
> From 5fc05ec61d87049ea0f29b2dd51c16e260698ef8 Mon Sep 17 00:00:00 2001
> From: =?UTF-8?q?Lo=C3=AFc=20Minier?= <lool@dooz.org>
> Date: Tue, 19 Jan 2010 11:05:00 +0100
> Subject: [PATCH] Add and use has() and path_of() funcs
>
> Add has() and path_of() funcs and use them across configure; has()
> will test whether a command or builtin is available; path_of() will
> search the PATH for executables and return the full pathname if found.
> ---
>  configure |   53 ++++++++++++++++++++++++++++++++++++++++++++---------
>  1 files changed, 44 insertions(+), 9 deletions(-)
>
> diff --git a/configure b/configure
> index baa2800..711e335 100755
> --- a/configure
> +++ b/configure
> @@ -27,6 +27,43 @@ compile_prog() {
>    $cc $QEMU_CFLAGS $local_cflags -o $TMPE $TMPC $LDFLAGS $local_ldflags > /dev/null 2> /dev/null
>  }
>  
> +# check whether a command is available to this shell (may be either an
> +# executable or a builtin)
> +has() {
> +    local_command="$1"
> +    type "$local_command" >/dev/null
> +}

Why the extra variable?  Using $1 directly seems just as obvious to me.

> +# search for an executable in PATH
> +path_of() {
> +    local_command="$1"
> +    local_ifs="$IFS"
> +    local_dir=""
> +
> +    # pathname has a dir component?
> +    if [ "${local_command#*/}" != "$local_command" ]; then
> +        if [ -x "$local_command" ] && [ ! -d "$local_command" ]; then
> +            echo "$local_command"
> +            return 0
> +        fi
> +    fi
> +    if [ -z "$local_command" ]; then
> +        return 1
> +    fi
> +
> +    IFS=:
> +    for local_dir in $PATH; do
> +        if [ -x "$local_dir/$local_command" ] && [ ! -d "$local_dir/$local_command" ]; then
> +            echo "$local_dir/$local_command"
> +            IFS="$local_ifs"
> +            return 0
> +        fi
> +    done
> +    # not found
> +    IFS="$local_ifs"
> +    return 1
> +}
> +
>  # default parameters
>  cpu=""
>  prefix=""
> @@ -763,7 +800,7 @@ fi
>  # Solaris specific configure tool chain decisions
>  #
>  if test "$solaris" = "yes" ; then
> -  solinst=`which $install 2> /dev/null | /usr/bin/grep -v "no $install in"`
> +  solinst=`path_of $install`
>    if test -z "$solinst" ; then
>      echo "Solaris install program not found. Use --install=/usr/ucb/install or"
>      echo "install fileutils from www.blastwave.org using pkg-get -i fileutils"
> @@ -776,7 +813,7 @@ if test "$solaris" = "yes" ; then
>      echo "using pkg-get -i fileutils, or use --install=/usr/ucb/install"
>      exit 1
>    fi
> -  sol_ar=`which ar 2> /dev/null | /usr/bin/grep -v "no ar in"`
> +  sol_ar=`path_of ar`
>    if test -z "$sol_ar" ; then
>      echo "Error: No path includes ar"
>      if test -f /usr/ccs/bin/ar ; then

Is the full path of these tools really important?  Doesn't look like
it to me.
diff mbox

Patch

From 5fc05ec61d87049ea0f29b2dd51c16e260698ef8 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lo=C3=AFc=20Minier?= <lool@dooz.org>
Date: Tue, 19 Jan 2010 11:05:00 +0100
Subject: [PATCH] Add and use has() and path_of() funcs

Add has() and path_of() funcs and use them across configure; has()
will test whether a command or builtin is available; path_of() will
search the PATH for executables and return the full pathname if found.
---
 configure |   53 ++++++++++++++++++++++++++++++++++++++++++++---------
 1 files changed, 44 insertions(+), 9 deletions(-)

diff --git a/configure b/configure
index baa2800..711e335 100755
--- a/configure
+++ b/configure
@@ -27,6 +27,43 @@  compile_prog() {
   $cc $QEMU_CFLAGS $local_cflags -o $TMPE $TMPC $LDFLAGS $local_ldflags > /dev/null 2> /dev/null
 }
 
+# check whether a command is available to this shell (may be either an
+# executable or a builtin)
+has() {
+    local_command="$1"
+    type "$local_command" >/dev/null
+}
+
+# search for an executable in PATH
+path_of() {
+    local_command="$1"
+    local_ifs="$IFS"
+    local_dir=""
+
+    # pathname has a dir component?
+    if [ "${local_command#*/}" != "$local_command" ]; then
+        if [ -x "$local_command" ] && [ ! -d "$local_command" ]; then
+            echo "$local_command"
+            return 0
+        fi
+    fi
+    if [ -z "$local_command" ]; then
+        return 1
+    fi
+
+    IFS=:
+    for local_dir in $PATH; do
+        if [ -x "$local_dir/$local_command" ] && [ ! -d "$local_dir/$local_command" ]; then
+            echo "$local_dir/$local_command"
+            IFS="$local_ifs"
+            return 0
+        fi
+    done
+    # not found
+    IFS="$local_ifs"
+    return 1
+}
+
 # default parameters
 cpu=""
 prefix=""
@@ -763,7 +800,7 @@  fi
 # Solaris specific configure tool chain decisions
 #
 if test "$solaris" = "yes" ; then
-  solinst=`which $install 2> /dev/null | /usr/bin/grep -v "no $install in"`
+  solinst=`path_of $install`
   if test -z "$solinst" ; then
     echo "Solaris install program not found. Use --install=/usr/ucb/install or"
     echo "install fileutils from www.blastwave.org using pkg-get -i fileutils"
@@ -776,7 +813,7 @@  if test "$solaris" = "yes" ; then
     echo "using pkg-get -i fileutils, or use --install=/usr/ucb/install"
     exit 1
   fi
-  sol_ar=`which ar 2> /dev/null | /usr/bin/grep -v "no ar in"`
+  sol_ar=`path_of ar`
   if test -z "$sol_ar" ; then
     echo "Error: No path includes ar"
     if test -f /usr/ccs/bin/ar ; then
@@ -969,7 +1006,7 @@  fi
 # pkgconfig probe
 
 pkgconfig="${cross_prefix}pkg-config"
-if ! test -x "$(which $pkgconfig 2>/dev/null)"; then
+if ! has $pkgconfig; then
   # likely not cross compiling, or hope for the best
   pkgconfig=pkg-config
 fi
@@ -977,7 +1014,7 @@  fi
 ##########################################
 # Sparse probe
 if test "$sparse" != "no" ; then
-  if test -x "$(which cgcc 2>/dev/null)"; then
+  if has cgcc; then
     sparse=yes
   else
     if test "$sparse" = "yes" ; then
@@ -993,7 +1030,7 @@  fi
 if $pkgconfig sdl --modversion >/dev/null 2>&1; then
   sdlconfig="$pkgconfig sdl"
   _sdlversion=`$sdlconfig --modversion 2>/dev/null | sed 's/[^0-9]//g'`
-elif which sdl-config >/dev/null 2>&1; then
+elif has sdl-config; then
   sdlconfig='sdl-config'
   _sdlversion=`$sdlconfig --version | sed 's/[^0-9]//g'`
 else
@@ -1424,8 +1461,7 @@  EOF
     fi
   else
     if test "$kvm" = "yes" ; then
-      if [ -x "`which awk 2>/dev/null`" ] && \
-         [ -x "`which grep 2>/dev/null`" ]; then
+      if has awk && has grep; then
         kvmerr=`LANG=C $cc $QEMU_CFLAGS -o $TMPE $kvm_cflags $TMPC 2>&1 \
 	| grep "error: " \
 	| awk -F "error: " '{if (NR>1) printf(", "); printf("%s",$2);}'`
@@ -1694,8 +1730,7 @@  fi
 
 # Check if tools are available to build documentation.
 if test "$docs" != "no" ; then
-  if test -x "`which texi2html 2>/dev/null`" -a \
-          -x "`which pod2man 2>/dev/null`" ; then
+  if has texi2html && has pod2man; then
     docs=yes
   else
     if test "$docs" = "yes" ; then
-- 
1.6.5