autoconf-commit
[Top][All Lists]
Advanced

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

[SCM] GNU Autoconf source repository branch, master, updated. v2.63-226-


From: Eric Blake
Subject: [SCM] GNU Autoconf source repository branch, master, updated. v2.63-226-g2cc7d57
Date: Sat, 22 Nov 2008 13:51:53 +0000

This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "GNU Autoconf source repository".

http://git.sv.gnu.org/gitweb/?p=autoconf.git;a=commitdiff;h=2cc7d57a17490d96a310a8a329b86bca10e564c1

The branch, master has been updated
       via  2cc7d57a17490d96a310a8a329b86bca10e564c1 (commit)
      from  48d8391ff3fe67729ae4131691e5aef827edb500 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit 2cc7d57a17490d96a310a8a329b86bca10e564c1
Author: Eric Blake <address@hidden>
Date:   Fri Nov 21 15:50:37 2008 -0700

    Clean up AS_MESSAGE_LOG_FD usage.
    
    * lib/m4sugar/m4sh.m4 (AS_MESSAGE_FD, AS_MESSAGE_LOG_FD)
    (AS_ORIGINAL_STDIN_FD): Provide default M4sh values.
    (_AS_ECHO_LOG, AS_MESSAGE, _AS_ERROR_PREPARE, AS_ERROR): Simplify
    usage.
    (AS_INIT_GENERATED): Don't shuffle an unchanged AS_MESSAGE_FD.
    * tests/m4sh.at (AS@&address@hidden): Update test.
    (AS@&address@hidden): New test.
    * doc/autoconf.texi (Initialization Macros) <AS_INIT_GENERATED>:
    Give more details about fd manipulation.
    (File Descriptor Macros): Describe M4sh defaults for the fds.
    
    Signed-off-by: Eric Blake <address@hidden>

-----------------------------------------------------------------------

Summary of changes:
 ChangeLog           |   14 ++++++++
 doc/autoconf.texi   |   35 +++++++++++++++------
 lib/m4sugar/m4sh.m4 |   46 +++++++++++++++++++++-------
 tests/m4sh.at       |   84 ++++++++++++++++++++++++++++++++++++++++++++++++++-
 4 files changed, 157 insertions(+), 22 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index ec79176..d72ad1f 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,19 @@
 2008-11-21  Eric Blake  <address@hidden>
 
+       Clean up AS_MESSAGE_LOG_FD usage.
+       * lib/m4sugar/m4sh.m4 (AS_MESSAGE_FD, AS_MESSAGE_LOG_FD)
+       (AS_ORIGINAL_STDIN_FD): Provide default M4sh values.
+       (_AS_ECHO_LOG, AS_MESSAGE, _AS_ERROR_PREPARE, AS_ERROR): Simplify
+       usage.
+       (AS_INIT_GENERATED): Don't shuffle an unchanged AS_MESSAGE_FD.
+       * tests/m4sh.at (AS@&address@hidden): Update test.
+       (AS@&address@hidden): New test.
+       * doc/autoconf.texi (Initialization Macros) <AS_INIT_GENERATED>:
+       Give more details about fd manipulation.
+       (File Descriptor Macros): Describe M4sh defaults for the fds.
+
+2008-11-21  Eric Blake  <address@hidden>
+
        Use shell function for AS_ERROR.
        * lib/m4sugar/m4sh.m4 (_AS_ERROR_PREPARE): New macro, defining a
        new shell function.
diff --git a/doc/autoconf.texi b/doc/autoconf.texi
index e8cab41..957b8be 100644
--- a/doc/autoconf.texi
+++ b/doc/autoconf.texi
@@ -12500,15 +12500,21 @@ populates the child script with information learned 
from the parent
 (thus, the emitted code is equivalent in effect, but more efficient,
 than the code output by @code{AS_INIT}, @code{AS_BOURNE_COMPATIBLE}, and
 @code{AS_SHELL_SANITIZE}).  If present, @var{comment} is output near the
-beginning of the child, prior to the shell initialization code.  The
+beginning of the child, prior to the shell initialization code, and is
+subject to parameter expansion, command substitution, and backslash
+quote removal.  The
 parent script should check the exit status after this macro, in case
 @var{file} could not be properly created (for example, if the disk was
 full).  If successfully created, the parent script can then proceed to
 append additional M4sh constructs into the child script.
 
-Note that the child script starts life without a log file open, so you
+Note that the child script starts life without a log file open, so if
+the parent script uses logging (@pxref{AS_MESSAGE_LOG_FD}), you
 must temporarily disable any attempts to use the log file until after
-emitting code to open a log within the child.  Currently, the suggested
+emitting code to open a log within the child.  On the other hand, if the
+parent script has @code{AS_MESSAGE_FD} redirected somewhere besides
address@hidden, then the child script already has code that copies stdout to
+that descriptor.  Currently, the suggested
 idiom for writing a M4sh shell script from within another script is:
 
 @example
@@ -12583,27 +12589,36 @@ level macros as described below.
 @defmac AS_MESSAGE_FD
 @asindex{MESSAGE_FD}
 The file descriptor for @samp{checking for...}  messages and results.
-Normally this directs messages to the standard output, however when
address@hidden is run with the @option{-q} option, messages sent to
address@hidden are discarded.
+By default, @code{AS_INIT} sets this to @samp{1} for standalone M4sh
+clients.  However, @code{AC_INIT} shuffles things around to another file
+descriptor, in order to allow the @option{-q} option of
address@hidden to choose whether messages should go to the script's
+standard output or be discarded.
 
 If you want to display some messages, consider using one of the printing
 macros (@pxref{Printing Messages}) instead.  Copies of messages output
 via these macros are also recorded in @file{config.log}.
 @end defmac
 
address@hidden
 @defmac AS_MESSAGE_LOG_FD
 @asindex{MESSAGE_LOG_FD}
-
-The file descriptor for messages logged to @file{config.log}.  Macros
-that run tools, like @code{AC_COMPILE_IFELSE} (@pxref{Running the
+This must either be empty, or expand to a file descriptor for log
+messages.  By default, @code{AS_INIT} sets this macro to the empty
+string for standalone M4sh clients, thus disabling logging.  However,
address@hidden shuffles things around so that both @command{configure}
+and @command{config.status} use @file{config.log} for log messages.
+Macros that run tools, like @code{AC_COMPILE_IFELSE} (@pxref{Running the
 Compiler}), redirect all output to this descriptor.  You may want to do
 so if you develop such a low-level macro.
 @end defmac
 
 @defmac AS_ORIGINAL_STDIN_FD
 @asindex{ORIGINAL_STDIN_FD}
-The file descriptor for the original standard input.
+This must expand to a file descriptor for the original standard input.
+By default, @code{AS_INIT} sets this macro to @samp{0} for standalone
+M4sh clients.  However, @code{AC_INIT} shuffles things around for
+safety.
 
 When @command{configure} runs, it may accidentally execute an
 interactive command that has the same name as the non-interactive meant
diff --git a/lib/m4sugar/m4sh.m4 b/lib/m4sugar/m4sh.m4
index f3dc4ac..0faa934 100644
--- a/lib/m4sugar/m4sh.m4
+++ b/lib/m4sugar/m4sh.m4
@@ -658,8 +658,30 @@ m4_defun([AS_UNSET],
 ## 3. Error and warnings at the shell level.  ##
 ## ------------------------------------------ ##
 
-# If AS_MESSAGE_LOG_FD is defined, shell messages are duplicated there
-# too.
+
+# AS_MESSAGE_FD
+# -------------
+# Must expand to the fd where messages will be sent.  Defaults to 1,
+# although a script may reassign this value and use exec to either
+# copy stdout to the new fd, or open the new fd on /dev/null.
+m4_define([AS_MESSAGE_FD], [1])
+
+# AS_MESSAGE_LOG_FD
+# -----------------
+# Must expand to either the empty string (when no logging is
+# performed), or to the fd of a log file.  Defaults to empty, although
+# a script may reassign this value and use exec to open a log.  When
+# not empty, messages to AS_MESSAGE_FD are duplicated to the log,
+# along with a LINENO reference.
+m4_define([AS_MESSAGE_LOG_FD])
+
+
+# AS_ORIGINAL_STDIN_FD
+# --------------------
+# Must expand to the fd of the script's original stdin.  Defaults to
+# 0, although the script may reassign this value and use exec to
+# shuffle fd's.
+m4_define([AS_ORIGINAL_STDIN_FD], [0])
 
 
 # AS_ESCAPE(STRING, [CHARS = $"`\])
@@ -730,7 +752,7 @@ m4_define([_AS_ECHO],
 # Log the string to AS_MESSAGE_LOG_FD.
 m4_defun_init([_AS_ECHO_LOG],
 [AS_REQUIRE([_AS_LINENO_PREPARE])],
-[_AS_ECHO([$as_me:${as_lineno-$LINENO}: $1], [AS_MESSAGE_LOG_FD])])
+[_AS_ECHO([$as_me:${as_lineno-$LINENO}: $1], AS_MESSAGE_LOG_FD)])
 
 
 # _AS_ECHO_N_PREPARE
@@ -765,10 +787,11 @@ m4_define([_AS_ECHO_N],
 
 # AS_MESSAGE(STRING, [FD = AS_MESSAGE_FD])
 # ----------------------------------------
-# Output "`basename $0`: "STRING to the open file FD.
+# Output "`basename $0`: STRING" to the open file FD, and if logging
+# is enabled, copy it to the log with a reference to LINENO.
 m4_defun_init([AS_MESSAGE],
 [AS_REQUIRE([_AS_ME_PREPARE])],
-[m4_ifset([AS_MESSAGE_LOG_FD],
+[m4_ifval(AS_MESSAGE_LOG_FD,
          [{ _AS_ECHO_LOG([$1])
 _AS_ECHO([$as_me: $1], [$2]);}],
          [_AS_ECHO([$as_me: $1], [$2])])[]])
@@ -792,15 +815,15 @@ m4_define([AS_WARN],
 # otherwise, assume the entire script does not do logging.
 m4_define([_AS_ERROR_PREPARE],
 [AS_REQUIRE_SHELL_FN([as_fn_error],
-  [AS_FUNCTION_DESCRIBE([as_fn_error], [ERROR]m4_ifset([AS_MESSAGE_LOG_FD],
+  [AS_FUNCTION_DESCRIBE([as_fn_error], [ERROR]m4_ifval(AS_MESSAGE_LOG_FD,
       [[ [[LINENO LOG_FD]]]]),
     [Output "`basename @S|@0`: error: ERROR" to stderr.]
-m4_ifset([AS_MESSAGE_LOG_FD],
+m4_ifval(AS_MESSAGE_LOG_FD,
     [[If LINENO and LOG_FD are provided, also output the error to LOG_FD,
       referencing LINENO.]])
     [Then exit the script with status $?, using 1 if that was 0.])],
 [  as_status=$?; test $as_status -eq 0 && as_status=1
-m4_ifset([AS_MESSAGE_LOG_FD],
+m4_ifval(AS_MESSAGE_LOG_FD,
 [m4_pushdef([AS_MESSAGE_LOG_FD], [$[3]])dnl
   if test "$[3]"; then
     AS_LINENO_PUSH([$[2]])
@@ -819,7 +842,7 @@ m4_defun_init([AS_ERROR],
 [m4_append_uniq([_AS_CLEANUP],
   [m4_divert_text([M4SH-INIT-FN], [_AS_ERROR_PREPARE[]])])],
 [m4_ifvaln([$2], [{ AS_SET_STATUS([$2])])]dnl
-[as_fn_error "_AS_QUOTE([$1])"m4_ifset([AS_MESSAGE_LOG_FD],
+[as_fn_error "_AS_QUOTE([$1])"m4_ifval([AS_MESSAGE_LOG_FD],
   [ "$LINENO" AS_MESSAGE_LOG_FD])[]m4_ifval([$2], [; }])])
 
 
@@ -1986,8 +2009,9 @@ _ASEOF
 cat >>$1 <<\_ASEOF || as_write_fail=1
 _AS_SHELL_SANITIZE
 _AS_PREPARE
-exec AS_MESSAGE_FD>&1
-m4_text_box([Main body of $1 script.])
+m4_if(AS_MESSAGE_FD, [1], [], [exec AS_MESSAGE_FD>&1
+])]dnl
+[m4_text_box([Main body of $1 script.])
 _ASEOF
 test $as_write_fail = 0 && chmod +x $1[]dnl
 _m4_popdef([AS_MESSAGE_LOG_FD])])# AS_INIT_GENERATED
diff --git a/tests/m4sh.at b/tests/m4sh.at
index e85aabe..0c575de 100644
--- a/tests/m4sh.at
+++ b/tests/m4sh.at
@@ -1259,9 +1259,10 @@ AT_CLEANUP
 ## ------------------- ##
 
 AT_SETUP([AS@&address@hidden)
+AT_KEYWORDS([AS@&address@hidden AS@&address@hidden)
 
+dnl First run, no logging, tests shell selection
 AT_DATA_M4SH([script.as], [[dnl
-m4_define([AS_MESSAGE_FD], [1])
 AS_INIT
 AS_INIT_GENERATED([child], [echo hello from child])
 cat >>child <<\EOF
@@ -1286,4 +1287,85 @@ AT_CHECK([grep 'SHELL=.' stdout], [0], [ignore])
 sed s/parent/child/ <stdout >expout
 AT_CHECK([./child], [0], [expout])
 
+
+dnl Second run, with logging from parent and child, tests fd handling
+AT_DATA_M4SH([script.as], [[dnl
+AS_INIT
+child=${1-child}
+m4_define([AS_MESSAGE_LOG_FD], [5])
+exec AS_MESSAGE_LOG_FD>log
+AS_INIT_GENERATED([$child], [echo hello1 from $child]) || AS_EXIT([1])
+cat >>$child <<\EOF
+m4_pushdef([AS_MESSAGE_LOG_FD])
+AS_MESSAGE([hello2 from ${child}child])
+m4_popdef([AS_MESSAGE_LOG_FD])
+exec AS_MESSAGE_LOG_FD>>log
+AS_MESSAGE([hello3 from child])
+EOF
+AS_MESSAGE([hello from parent])
+dnl close log in parent before spawning child, for mingw
+exec AS_MESSAGE_LOG_FD>-
+./$child
+]])
+
+AT_CHECK_M4SH
+AT_CHECK([./script], [0], [[script: hello from parent
+hello1 from child
+child: hello2 from child
+child: hello3 from child
+]])
+AT_CHECK([[sed 's,:[0-9][0-9]*:,:0:,' log]], [0],
+[[script:0: hello from parent
+child:0: hello3 from child
+]])
+
+# Force write error creating a file on stdout
+if test -w /dev/full && test -c /dev/full; then
+  AT_CHECK([./script /dev/full], [1], [ignore], [ignore])
+fi
+
+AT_CLEANUP
+
+
+## --------------- ##
+## AS_MESSAGE_FD.  ##
+## --------------- ##
+
+AT_SETUP([AS@&address@hidden)
+AT_KEYWORDS([AS@&address@hidden AS@&address@hidden AS@&t_ORIGINAL_STDIN_FD])
+AT_KEYWORDS([AS@&address@hidden)
+
+AT_DATA_M4SH([script.as], [[dnl
+AS_INIT
+m4_define([AS_ORIGINAL_STDIN_FD], [5])
+m4_define([AS_MESSAGE_LOG_FD], [6])
+m4_define([AS_MESSAGE_FD], [7])
+exec AS_ORIGINAL_STDIN_FD<&0 </dev/null AS_MESSAGE_LOG_FD>log
+if test $[#] -gt 0; then
+  exec AS_MESSAGE_FD>/dev/null
+else
+  exec AS_MESSAGE_FD>&1
+fi
+AS_LINENO_PUSH([100])
+cat # tests that stdin is neutralized
+AS_MESSAGE([hello world])
+cat <&AS_ORIGINAL_STDIN_FD
+]])
+
+AT_CHECK_M4SH
+AT_CHECK([echo goodbye | ./script], [0],
+[[script: hello world
+goodbye
+]])
+AT_CHECK([cat log], [0],
+[[script:100: hello world
+]])
+rm log
+AT_CHECK([echo goodbye | ./script silent], [0],
+[[goodbye
+]])
+AT_CHECK([cat log], [0],
+[[script:100: hello world
+]])
+
 AT_CLEANUP


hooks/post-receive
--
GNU Autoconf source repository




reply via email to

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