bug-gnulib
[Top][All Lists]
Advanced

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

Re: gl_SILENT


From: Bruno Haible
Subject: Re: gl_SILENT
Date: Sat, 19 Sep 2020 02:25:38 +0200
User-agent: KMail/5.1.3 (Linux/4.4.0-189-generic; KDE/5.18.0; x86_64; ; )

Paul Eggert wrote:
> > The file descriptor 2 is unaffected by the file descriptor
> > reshuffle. Only file descriptor 6 is affected, which is the one used by
> > AC_MSG_CHECKING/AC_MSG_RESULT. No one is supposed to use this file 
> > descriptor
> > in a 'trap' action.
> 
> Ah, sorry, I misread it.
> 
> >> Looking into it further, gl_SILENT is iffy as a general macro, as 
> >> discarding
> >> stderr could make scripts harder to debug.
> > 
> > I disagree. I want gl_SILENT for the purpose of doing more complex checks 
> > inside
> > an AC_CACHE_CHECK invocation. Without gl_SILENT, the message output 
> > dictates the
> > structure of the AC_CACHE_CHECKs. This is not good.

Stated differently: Currently, AC_CACHE_CHECKs cannot be nested. This forces
macro authors to define the checks one after the other, with the lowest level
first and the highest level last. Quite often this is reasonable and sufficient.
But the fact that I invented two different mechanisms to get around it
(1. pushdef/popdef of AC_MSG_CHECKING and AC_MSG_RESULT, 2. gl_SILENT) proves
that it is a persistent thorn.

> Agreed, but isn't gl_SILENT an unnecessarily tricky way to go about it? I 
> worry 
> we'll eventually need a gl_NOISY macro to counteract the effect of gl_SILENT.

If we document clearly that nested AC_CACHE_CHECKs have no output, no gl_NOISY
will be needed - as macro authors can revert to the "inner check first" style.

> If this approach was that useful in practice, why doesn't C's stdio package 
> have 
> a function that does something similar, e.g., stdio_silent (stderr, FOO) 
> calls 
> FOO and arranges for FOO's fprintf (stderr, ....) calls to have no effect?

In C it is natural to introduce function parameters or static variables for 
this.

> If the problem is that AC_CACHE_CHECK is always noisy, do we simply need a 
> quiet 
> variant? Something like gl_CACHE_VAL_SILENT vs AC_CACHE_VAL?

That is one possible way. We would then have gl_CACHE_CHECK_SILENT,
gl_CHECK_FUNC_SILENT, gl_CHECK_HEADER_SILENT, and maybe more.

> Or perhaps we 
> should change what Autoconf does (admittedly this is a longer-term project)?

This is a longer-term project, yes. There are multiple problems for Autoconf
macro authors:
  - You can't nest AC_CACHE_CHECK, or the configure output will be messy.
  - When investigating problems, I need to look at 4 files: the configure 
output,
    config.status, config.cache, and config.log. And they are partly redundant.
  - The configure output is so long that most people skip reading it, only
    WARNINGs that stay out get read.
  - Especially the lines with '(cached)' are useless.
  - A summary section that lists the external dependencies and most important
    details (ABI, compiler, compiler options) but not the hundreds of other
    test results is useful. But Autoconf has no standard macro for doing this.

These problems are all somewhat related.

gl_SILENT is only one brick that allows to experiment with solutions of the 
first
problem.

> If it's needed then by all means please reinstate it as needed for 
> getaddrinfo etc.

Reinstated:


2020-09-18  Bruno Haible  <bruno@clisp.org>

        Add back gl_SILENT.
        * m4/gnulib-common.m4 (GL_TMP_FD, gl_SILENT): New macros.

diff --git a/m4/gnulib-common.m4 b/m4/gnulib-common.m4
index c9f8ca6..57343e4 100644
--- a/m4/gnulib-common.m4
+++ b/m4/gnulib-common.m4
@@ -1,4 +1,4 @@
-# gnulib-common.m4 serial 59
+# gnulib-common.m4 serial 60
 dnl Copyright (C) 2007-2020 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
@@ -630,6 +630,22 @@ AC_DEFUN([gl_BIGENDIAN],
   AC_C_BIGENDIAN
 ])
 
+# A temporary file descriptor.
+# Must be less than 10, because dash 0.5.8 does not support redirections
+# with multi-digit file descriptors.
+m4_define([GL_TMP_FD], 9)
+
+# gl_SILENT(command)
+# executes command, but without the normal configure output.
+# This is useful when you want to invoke AC_CACHE_CHECK (or AC_CHECK_FUNC etc.)
+# inside another AC_CACHE_CHECK.
+AC_DEFUN([gl_SILENT],
+[
+  exec GL_TMP_FD>&AS_MESSAGE_FD AS_MESSAGE_FD>/dev/null
+  $1
+  exec AS_MESSAGE_FD>&GL_TMP_FD GL_TMP_FD>&-
+])
+
 # gl_CACHE_VAL_SILENT(cache-id, command-to-set-it)
 # is like AC_CACHE_VAL(cache-id, command-to-set-it), except that it does not
 # output a spurious "(cached)" mark in the midst of other configure output.




reply via email to

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