autoconf-patches
[Top][All Lists]
Advanced

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

Re: [PATCHv3] AC_COMPILE_IFELSE: Evaluate user supplied arguments


From: Nikolai Merinov
Subject: Re: [PATCHv3] AC_COMPILE_IFELSE: Evaluate user supplied arguments
Date: Fri, 15 Mar 2019 01:08:54 +0500
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/26.1 (gnu/linux)

Hi,

During work on a same issue in the libtool code I observed that it's
necessary to fix the _AC_DO macro in same manner in order to pass
compiler checks with flags like CFLAGS='"-Wall"'.

An updated version of the patch with changes to both _AC_DO and
_AC_DO_STDERR attached.

Regards,
Nikolai
>From 614d16f92a75a62652dc8c99e872576d9bfb7399 Mon Sep 17 00:00:00 2001
From: Nikolai Merinov <address@hidden>
Date: Thu, 7 Mar 2019 22:33:13 +0500
Subject: [PATCH] _AC_DO _AC_DO_STDERR: Evaluate argument twice

The `AC_COMPILE_IFELSE', `AC_LINK_IFELSE', `AC_PREPROC_IFELSE' macros
use the `_AC_DO_STDERR` macro in the following manner:

> ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
> _AC_DO_STDERR($ac_compile)

In order to have same behavior during a configuration stage and during
a compilation stage we should evaluate a passed argument twice: in
second time we'll be able to unquote strings in user-supplied
variables as it happens during make rules execution.

The `_AC_DO' macro used through the `_AC_DO_VAR' macro in similar
manner in many places and should work by same rules.

* lib/autoconf/general.m4 (_AC_DO_STDERR): Reuse `_AC_DO_ECHO' trick
to evaluate arguments twice if compile string have no '\"', '`', or
'\\' symbols.
  (_AC_DO): Same changes.
* tests/compile.at: Add test for CFLAGS evaluation.
---
 NEWS                    |  5 +++++
 lib/autoconf/general.m4 | 22 ++++++++++++++++++----
 tests/compile.at        | 11 +++++++++++
 3 files changed, 34 insertions(+), 4 deletions(-)

diff --git a/NEWS b/NEWS
index efade585..b6d0136a 100644
--- a/NEWS
+++ b/NEWS
@@ -123,6 +123,11 @@ GNU Autoconf NEWS - User visible changes.
   use with multiple languages, rather than forcing all checks in the
   language used by the first encounter of the macro.
 
+- The _AC_DO_STDERR and _AC_DO macros now evaluate a COMMAND argument
+  twice. This change consolidate behavior for user-supplied arguments
+  between the AC_COMPILE_IFELSE and AC_LINK_IFELSE macros and
+  compilation commands used in makefiles.
+
 ** Man pages for config.guess and config.sub are no longer provided.
 They were moved to the master source tree for config.guess and config.sub.
 
diff --git a/lib/autoconf/general.m4 b/lib/autoconf/general.m4
index e1d82b54..0af61b2a 100644
--- a/lib/autoconf/general.m4
+++ b/lib/autoconf/general.m4
@@ -2448,16 +2448,30 @@ AS_ECHO(["$ac_try_echo"])])
 # Eval COMMAND, save the exit status in ac_status, and log it.
 # For internal use only.
 AC_DEFUN([_AC_DO],
-[_AC_RUN_LOG([eval "$1"],
-            [_AC_DO_ECHO([$1])])])
+[m4_if([$1], [$ac_do], [], [ac_do="$1"
+])]dnl
+[[case "(($ac_do" in
+  *\"* | *\`* | *\\*) ac_do_command=\$ac_do;;
+  *) ac_do_command=$ac_do;;
+esac
+eval ac_do_command="\"$ac_do_command\""]
+_AC_RUN_LOG([eval "$ac_do_command"],
+                  [_AC_DO_ECHO([$ac_do])])])
 
 
 # _AC_DO_STDERR(COMMAND)
 # ----------------------
 # Like _AC_RUN_LOG_STDERR, but eval (instead of running) COMMAND.
 AC_DEFUN([_AC_DO_STDERR],
-[_AC_RUN_LOG_STDERR([eval "$1"],
-                   [_AC_DO_ECHO([$1])])])
+[m4_if([$1], [$ac_do_stderr], [], [ac_do_stderr="$1"
+])]dnl
+[[case "(($ac_do_stderr" in
+  *\"* | *\`* | *\\*) ac_do_stderr_command=\$ac_do_stderr;;
+  *) ac_do_stderr_command=$ac_do_stderr;;
+esac
+eval ac_do_stderr_command="\"$ac_do_stderr_command\""]
+_AC_RUN_LOG_STDERR([eval "$ac_do_stderr_command"],
+                  [_AC_DO_ECHO([$ac_do_stderr])])])
 
 
 # _AC_DO_VAR(VARIABLE)
diff --git a/tests/compile.at b/tests/compile.at
index 29374529..9af8cb38 100644
--- a/tests/compile.at
+++ b/tests/compile.at
@@ -301,6 +301,17 @@ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [return 2])],
 AT_CHECK_AUTOCONF
 AT_CHECK_CONFIGURE([-q])
 
+AT_DATA([configure.ac],
+[[AC_INIT
+AC_PROG_CC
+test x$GCC = xyes && CFLAGS='"-Wall"'
+AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [return 0])], [],
+  [AC_MSG_ERROR([compiling trivial program failed])])
+]])
+
+AT_CHECK_AUTOCONF
+AT_CHECK_CONFIGURE([-q])
+
 AT_CLEANUP
 
 ## --------------- ##
-- 
2.21.0


reply via email to

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