autoconf-patches
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH 5/5] use shell function for AS_BASENAME, AS_DIRNAME, AS_MKDIR_P


From: Paolo Bonzini
Subject: [PATCH 5/5] use shell function for AS_BASENAME, AS_DIRNAME, AS_MKDIR_P
Date: Thu, 18 Sep 2008 16:15:10 +0200

This patch defines shell functions for the various implementation
of basename/dirname/mkdir_p and changes macros such as AS_BASENAME
to simply dispatch to those macros.

Some care is needed to delay the definition of as_me, and to define
the shell functions in _AS_PREPARE for config.status.  There's also
a bug that _AS_LINENO_PREPARE was not using m4_defun.

I decided to stop having AS_PREPARE call _AS_PREPARE, because the
former can let _AS_BASENAME_PREPARE and friends expand shell functions,
while _AS_PREPARE (which is used for the prolog of config.status)
must do that on its own.

I made this into a single patch because it's a mess to separate
the initialization of shell functions in _AS_PREPARE.  Otherwise,
there's nothing that prevents from splitting it further.

2008-09-18  Paolo Bonzini  <address@hidden>

        * m4sugar/m4sh.m4 (AS_SHELL_SANITIZE): Delay setting as_me
        until the M4SH-INIT diversion using _AS_ME_PREPARE.
        (_AS_PREPARE): Define shell functions.  Invoke _AS_EXPR_PREPARE
        before _AS_BASENAME_PREPARE (newly added) and _AS_DIRNAME_PREPARE, and
        _AS_BASENAME_PREPARE and _AS_ME_PREPARE before _AS_LINENO_PREPARE.
        (AS_PREPARE): Include all the AS_REQUIREs manually.
        (_AS_ME_PREPARE): New.
        (_AS_LINENO_PREPARE): Use m4_defun.

        (AS_BASENAME): Just dispatch to $as_basename.
        (_AS_BASENAME_EXPR): Do not require _AS_EXPR_PREPARE.
        (_AS_BASENAME_PREPARE): Do that here.  Test availability of
        basename and expr.  Define shell functions.

        (AS_DIRNAME): Just dispatch to $as_dirname.
        (_AS_DIRNAME_EXPR): Do not require _AS_EXPR_PREPARE.
        (_AS_DIRNAME_PREPARE): Do that here.  Test availability of
        basename and expr.  Define shell functions.

        (_AS_MKDIR_P): New, from AS_MKDIR_P.  Adjust meaning of as_mkdir_p
        to be `false' or a full `mkdir -p' command.
        (AS_MKDIR_P): Just dispatch to as_func_mkdir_p.
        (_AS_MKDIR_P_PREPARE): Set as_mkdir_p according to the above change.
        Define shell functions.
---
 lib/m4sugar/m4sh.m4 |   81 ++++++++++++++++++++++++++++++++++----------------
 1 files changed, 55 insertions(+), 26 deletions(-)

diff --git a/lib/m4sugar/m4sh.m4 b/lib/m4sugar/m4sh.m4
index a3ef690..4247144 100644
--- a/lib/m4sugar/m4sh.m4
+++ b/lib/m4sugar/m4sh.m4
@@ -396,12 +396,8 @@ export LC_ALL
 LANGUAGE=C
 export LANGUAGE
 
-# Required to use basename.
-_AS_EXPR_PREPARE
-_AS_BASENAME_PREPARE
-
-# Name of the executable.
-as_me=`AS_BASENAME("$[0]")`
+dnl Delay this until after shell functions are defined.
+AS_REQUIRE([_AS_ME_PREPARE])
 
 # CDPATH.
 $as_unset CDPATH
@@ -421,11 +417,32 @@ $as_unset CDPATH
 # there are so many _AS_PREPARE_* below, and that's also why it is
 # important not to forget some: config.status needs them.
 m4_defun([_AS_PREPARE],
-[_AS_LINENO_PREPARE
+[as_func_basename_expr() {
+  _AS_BASENAME_EXPR([$[]2])
+}
 
+as_func_basename_sed() {
+  _AS_BASENAME_SED([$[]2])
+}
+
+as_func_dirname_expr() {
+  _AS_DIRNAME_EXPR([$[]2])
+}
+
+as_func_dirname_sed() {
+  _AS_DIRNAME_SED([$[]2])
+}
+
+as_func_mkdir_p() {
+  _AS_MKDIR_P([$[]1])
+}
+
+_AS_EXPR_PREPARE
+_AS_BASENAME_PREPARE
 _AS_DIRNAME_PREPARE
+_AS_ME_PREPARE
+_AS_LINENO_PREPARE
 _AS_ECHO_N_PREPARE[]dnl We do not need this ourselves but user code might.
-_AS_EXPR_PREPARE
 _AS_LN_S_PREPARE
 _AS_MKDIR_P_PREPARE
 _AS_TEST_PREPARE
@@ -433,13 +450,23 @@ _AS_TR_CPP_PREPARE
 _AS_TR_SH_PREPARE
 ])
 
-
 # AS_PREPARE
 # ----------
 # Output all the M4sh possible initialization into the initialization
 # diversion.
 m4_defun([AS_PREPARE],
-[m4_divert_text([M4SH-INIT], [_AS_PREPARE])])
+[AS_REQUIRE([_AS_EXPR_PREPARE])
+AS_REQUIRE([_AS_BASENAME_PREPARE])
+AS_REQUIRE([_AS_DIRNAME_PREPARE])
+AS_REQUIRE([_AS_ME_PREPARE])
+AS_REQUIRE([_AS_LINENO_PREPARE])
+AS_REQUIRE([_AS_ECHO_N_PREPARE])
+AS_REQUIRE([_AS_LN_S_PREPARE])
+AS_REQUIRE([_AS_MKDIR_P_PREPARE])
+AS_REQUIRE([_AS_TEST_PREPARE])
+AS_REQUIRE([_AS_TR_CPP_PREPARE])
+AS_REQUIRE([_AS_TR_SH_PREPARE])
+])
 
 
 ## ----------------------------- ##
@@ -694,8 +721,7 @@ m4_define([AS_ERROR],
 # Also see the comments for AS_DIRNAME.
 
 m4_defun([_AS_BASENAME_EXPR],
-[AS_REQUIRE([_AS_EXPR_PREPARE])dnl
-$as_expr X/[]$1 : '.*/\([[^/][^/]*]\)/*$' \| \
+[$as_expr X/[]$1 : '.*/\([[^/][^/]*]\)/*$' \| \
         X[]$1 : 'X\(//\)$' \| \
         X[]$1 : 'X\(/\)' \| .])
 
@@ -717,9 +743,7 @@ m4_defun([_AS_BASENAME_SED],
 
 m4_defun([AS_BASENAME],
 [AS_REQUIRE([_$0_PREPARE])dnl
-$as_basename -- $1 ||
-_AS_BASENAME_EXPR([$1]) 2>/dev/null ||
-_AS_BASENAME_SED([$1])])
+$as_basename -- $1])
 
 
 # _AS_BASENAME_PREPARE
@@ -727,10 +751,17 @@ _AS_BASENAME_SED([$1])])
 # Avoid Solaris 9 /usr/ucb/basename, as `basename /' outputs an empty line.
 # Also, traditional basename mishandles --.
 m4_defun([_AS_BASENAME_PREPARE],
-[if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; 
then
+[AS_REQUIRE([_AS_EXPR_PREPARE])dnl
+AS_REQUIRE_SHELL_FN([as_func_basename_expr],
+                    [_AS_BASENAME_EXPR([$[]2]) 2>/dev/null])
+AS_REQUIRE_SHELL_FN([as_func_basename_sed],
+                   [_AS_BASENAME_SED([$[]2])])
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
   as_basename=basename
+elif (as_func_basename_expr -- /) >/dev/null 2>&1; then
+  as_basename=as_func_basename_expr
 else
-  as_basename=false
+  as_basename=as_func_basename_sed
 fi
 ])# _AS_BASENAME_PREPARE
 
@@ -747,8 +778,7 @@ fi
 # substring is longer than 120 bytes.  So fall back on echo|sed if
 # expr fails.
 m4_defun([_AS_DIRNAME_EXPR],
-[AS_REQUIRE([_AS_EXPR_PREPARE])dnl
-$as_expr X[]$1 : 'X\(.*[[^/]]\)//*[[^/][^/]]*/*$' \| \
+[$as_expr X[]$1 : 'X\(.*[[^/]]\)//*[[^/][^/]]*/*$' \| \
         X[]$1 : 'X\(//\)[[^/]]' \| \
         X[]$1 : 'X\(//\)$' \| \
         X[]$1 : 'X\(/\)' \| .])
@@ -775,18 +805,23 @@ m4_defun([_AS_DIRNAME_SED],
 
 m4_defun([AS_DIRNAME],
 [AS_REQUIRE([_$0_PREPARE])dnl
-$as_dirname -- $1 ||
-_AS_DIRNAME_EXPR([$1]) 2>/dev/null ||
-_AS_DIRNAME_SED([$1])])
+$as_dirname -- $1])
 
 
 # _AS_DIRNAME_PREPARE
 # --------------------
 m4_defun([_AS_DIRNAME_PREPARE],
-[if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+[AS_REQUIRE([_AS_EXPR_PREPARE])dnl
+AS_REQUIRE_SHELL_FN([as_func_dirname_expr],
+                    [_AS_DIRNAME_EXPR([$[]2]) 2>/dev/null])
+AS_REQUIRE_SHELL_FN([as_func_dirname_sed],
+                   [_AS_DIRNAME_SED([$[]2])])
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
   as_dirname=dirname
+elif (as_func_dirname_expr -- /) >/dev/null 2>&1; then
+  as_dirname=as_func_dirname_expr
 else
-  as_dirname=false
+  as_dirname=as_func_dirname_sed
 fi
 ])# _AS_DIRNAME_PREPARE
 
@@ -882,6 +917,14 @@ fi
 ])# _AS_EXPR_PREPARE
 
 
+# _AS_ME_PREPARE
+# --------------
+# Define $as_me to the basename of the executable file's name.
+m4_defun([_AS_ME_PREPARE],
+[AS_REQUIRE([_AS_BASENAME_PREPARE])dnl
+as_me=`AS_BASENAME("$[0]")`
+])
+
 # _AS_LINENO_WORKS
 # ---------------
 # Succeed if the currently executing shell supports LINENO.
@@ -907,6 +950,7 @@ m4_define([_AS_LINENO_WORKS],
 # configure.
-m4_define([_AS_LINENO_PREPARE],
+m4_defun([_AS_LINENO_PREPARE],
 [AS_REQUIRE([_AS_CR_PREPARE])dnl
+AS_REQUIRE([_AS_ME_PREPARE])dnl
 _AS_DETECT_SUGGESTED([_AS_LINENO_WORKS])
 _AS_LINENO_WORKS || {
 
@@ -995,16 +1039,15 @@ $as_ln_s $1 $2
 ])
 
 
-# AS_MKDIR_P(DIR)
-# ---------------
-# Emulate `mkdir -p' with plain `mkdir'.
-m4_define([AS_MKDIR_P],
-[AS_REQUIRE([_$0_PREPARE])dnl
-{ as_dir=$1
+# _AS_MKDIR_P(DIR)
+# ----------------
+# Emulate `mkdir -p` with plain `mkdir'.
+m4_define([_AS_MKDIR_P],
+[as_dir=$1
   case $as_dir in #(
   -*) as_dir=./$as_dir;;
   esac
-  test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || {
+  test -d "$as_dir" || eval $as_mkdir_p || {
     as_dirs=
     while :; do
       case $as_dir in #(
@@ -1016,15 +1059,25 @@ m4_define([AS_MKDIR_P],
       test -d "$as_dir" && break
     done
     test -z "$as_dirs" || eval "mkdir $as_dirs"
-  } || test -d "$as_dir" || AS_ERROR([cannot create directory $as_dir]); }dnl
-])# AS_MKDIR_P
+  } || test -d "$as_dir" || AS_ERROR([cannot create directory $as_dir])
+])
+
+# AS_MKDIR_P(DIR)
+# ---------------
+# Emulate `mkdir -p' with plain `mkdir' if needed.
+m4_define([AS_MKDIR_P],
+[AS_REQUIRE([_$0_PREPARE])dnl
+as_dir=$1; as_func_mkdir_p "$as_dir"])# AS_MKDIR_P
 
 
 # _AS_MKDIR_P_PREPARE
 # -------------------
 m4_defun([_AS_MKDIR_P_PREPARE],
-[if mkdir -p . 2>/dev/null; then
-  as_mkdir_p=:
+[AS_REQUIRE_SHELL_FN([as_func_mkdir_p], [
+  _AS_MKDIR_P([$[]1])
+])
+if mkdir -p . 2>/dev/null; then
+  as_mkdir_p='mkdir -p "$as_dir"'
 else
   test -d ./-p && rmdir ./-p
   as_mkdir_p=false




reply via email to

[Prev in Thread] Current Thread [Next in Thread]