Bruno Haible <bruno <at> clisp.org> writes: > > I have no idea why: > > #include <math.h> > > behaves differently than: > > #include "///usr/vac/include/math.h" > > You'd figure with the #include_next <math.h> in /usr/vac/include/math.h > > the behavior would be the same. However, the #include_next <math.h> in > > /usr/vac/include/math.h is turned into a no-op. > > Thanks for this problem summary. Since #include <math.h> works, it's not > a problem with the inclusion guards (the "#ifdef _H_MATH" or similar), but > - as you say - a problem with #include_next itself. > > What's the result of > $ grep include_next /usr/vac/include/*.h /usr/vac/include/*/*.h > ? > > Probably the only solution is to use #include_next only in gnulib's math.in.h > but not in the other header files that are overridden by gnulib. I'm applying > this; please let us know whether it works. > > Bruno > > 2008-11-20 Bruno Haible <bruno <at> clisp.org> > > Attempt to work around an AIX 5.3, 6.1 compiler bug with include_next. > * lib/math.in.h: Use INCLUDE_NEXT_AS_FIRST_DIRECTIVE instead of > INCLUDE_NEXT.
I think I see a logic bug in this patch which explains why Jens Rehsack still saw a failure in m4 1.4.13: > +++ lib/math.in.h 2008-11-20 23:26:08.000000000 +0100 > @@ -22,7 +22,7 @@ > #endif > > /* The include_next requires a split double-inclusion guard. */ > -...@include_next@ @NEXT_MATH_H@ > +...@include_next_as_first_directive@ @NEXT_MATH_H@ NEXT_MATH_H is still of the form "///usr/vac/include/math.h" here, but that's exactly what we said was the second of two bugs in xlc's include_next implementation - #include_next "absolute" is a no-op. Let's examine the three classes of compilers: > if test $gl_cv_have_include_next = yes; then > INCLUDE_NEXT=include_next > + INCLUDE_NEXT_AS_FIRST_DIRECTIVE=include_next > if test -n "$GCC"; then > PRAGMA_SYSTEM_HEADER='#pragma GCC system_header' > fi For this compiler type (including gcc), #include_next always works, NEXT_MATH_H is always <math.h>, and we are okay. > else > - INCLUDE_NEXT=include > + if test $gl_cv_have_include_next = buggy; then > + INCLUDE_NEXT=include > + INCLUDE_NEXT_AS_FIRST_DIRECTIVE=include_next For this compiler (AIX's xlc), we want @INCLUDE_NEXT_AS_FIRST_DIRECTIVE@ <math.h> But we must also ensure that, for other headers, @INCLUDE_NEXT@ @NEXT_header@ we are using the absolute path in @NEXT_header@ since @INCLUDE_NEXT@ is only include. > + else > + INCLUDE_NEXT=include > + INCLUDE_NEXT_AS_FIRST_DIRECTIVE=include And for this type of compiler, we always want NEXT_MATH_H to be "///usr/vac/include/math.h", and @INCLUDE_NEXT_AS_FIRST_DIRECTIVE@ <math.h> would be a bug. So, the problem is basically that NEXT_MATH_H is usable with @INCLUDE_NEXT@ regardless of whether it expands to include or include_next, but it is NOT usable with @INCLUDE_NEXT_AS_FIRST_DIRECTIVE@ in the case of xlc. On the converse side, @INCLUDE_NEXT_AS_FIRST_DIRECTIVE@ <math.h> would work for gcc and xlc, but will break for compilers that lack include_next altogether. The solution - add another substituted variable. By the way, m4_quote(m4_defn([foo])) is overkill - m4_defn already properly quotes its output as a single m4 argument, so the m4_quote is a no-op (m4_quote is only useful when collecting multiple unquoted m4 arguments into a single string). What do you think of this patch? From: Eric Blake <e...@byu.net> Date: Wed, 20 May 2009 14:45:07 -0600 Subject: [PATCH] Another try at making math.h work for AIX xlc. * m4/include_next.m4: Avoid redundant m4_quote. (gl_CHECK_NEXT_HEADERS): Also define NEXT_header_AS_FIRST_DIRECTIVE. * lib/math.in.h (includes): Use it. Reported by Jens Rehsack. Signed-off-by: Eric Blake <e...@byu.net> --- ChangeLog | 9 +++++++++ lib/math.in.h | 2 +- m4/include_next.m4 | 31 ++++++++++++++++++++----------- 3 files changed, 30 insertions(+), 12 deletions(-) diff --git a/ChangeLog b/ChangeLog index eeab720..2f9ff72 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2009-05-20 Eric Blake <e...@byu.net> + + Another try at making math.h work for AIX xlc. + * m4/include_next.m4: Avoid redundant m4_quote. + (gl_CHECK_NEXT_HEADERS): Also define + NEXT_header_AS_FIRST_DIRECTIVE. + * lib/math.in.h (includes): Use it. + Reported by Jens Rehsack. + 2009-05-20 Bruno Haible <br...@clisp.org> Make zeroptr.h work on mingw. diff --git a/lib/math.in.h b/lib/math.in.h index a0efefd..22f47c6 100644 --- a/lib/math.in.h +++ b/lib/math.in.h @@ -22,7 +22,7 @@ #endif /* The include_next requires a split double-inclusion guard. */ -...@include_next_as_first_directive@ @NEXT_MATH_H@ +...@include_next_as_first_directive@ @NEXT_MATH_H_AS_FIRST_DIRECTIVE@ #ifndef _GL_MATH_H #define _GL_MATH_H diff --git a/m4/include_next.m4 b/m4/include_next.m4 index d6101fe..20b8ca1 100644 --- a/m4/include_next.m4 +++ b/m4/include_next.m4 @@ -1,4 +1,4 @@ -# include_next.m4 serial 12 +# include_next.m4 serial 13 dnl Copyright (C) 2006-2009 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, @@ -71,9 +71,9 @@ EOF AC_COMPILE_IFELSE([#include <conftest.h>], [gl_cv_have_include_next=yes], [CPPFLAGS="$gl_save_CPPFLAGS -Iconftestd1a -Iconftestd2" - AC_COMPILE_IFELSE([#include <conftest.h>], - [gl_cv_have_include_next=buggy], - [gl_cv_have_include_next=no]) + AC_COMPILE_IFELSE([[#include <conftest.h>]], + [gl_cv_have_include_next=buggy], + [gl_cv_have_include_next=no]) ]) CPPFLAGS="$gl_save_CPPFLAGS" rm -rf conftestd1a conftestd1b conftestd2 @@ -123,15 +123,15 @@ AC_DEFUN([gl_CHECK_NEXT_HEADERS], m4_foreach_w([gl_HEADER_NAME], [$1], [AS_VAR_PUSHDEF([gl_next_header], - [gl_cv_next_]m4_quote(m4_defn([gl_HEADER_NAME]))) + [gl_cv_next_]m4_defn([gl_HEADER_NAME])) if test $gl_cv_have_include_next = yes; then AS_VAR_SET([gl_next_header], ['<'gl_HEADER_NAME'>']) else AC_CACHE_CHECK( - [absolute name of <]m4_quote(m4_defn([gl_HEADER_NAME]))[>], - m4_quote(m4_defn([gl_next_header])), + [absolute name of <]m4_defn([gl_HEADER_NAME])[>], + m4_defn([gl_next_header]), [AS_VAR_PUSHDEF([gl_header_exists], - [ac_cv_header_]m4_quote(m4_defn([gl_HEADER_NAME]))) + [ac_cv_header_]m4_defn([gl_HEADER_NAME])) if test AS_VAR_GET(gl_header_exists) = yes; then AC_LANG_CONFTEST( [AC_LANG_SOURCE( @@ -153,8 +153,8 @@ AC_DEFUN([gl_CHECK_NEXT_HEADERS], dnl so use subshell. AS_VAR_SET([gl_next_header], ['"'`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&AS_MESSAGE_LOG_FD | - sed -n '\#/]m4_quote(m4_defn([gl_HEADER_NAME]))[#{ - s#.*"\(.*/]m4_quote(m4_defn([gl_HEADER_NAME]))[\)".*#\1# + sed -n '\#/]m4_defn([gl_HEADER_NAME])[#{ + s#.*"\(.*/]m4_defn([gl_HEADER_NAME])[\)".*#\1# s#^/[^/]#//&# p q @@ -165,7 +165,16 @@ AC_DEFUN([gl_CHECK_NEXT_HEADERS], AS_VAR_POPDEF([gl_header_exists])]) fi AC_SUBST( - AS_TR_CPP([NEXT_]m4_quote(m4_defn([gl_HEADER_NAME]))), + AS_TR_CPP([NEXT_]m4_defn([gl_HEADER_NAME])), [AS_VAR_GET([gl_next_header])]) + if test $gl_cv_have_include_next == no; then + AC_SUBST( + AS_TR_CPP([NEXT_]m4_defn([gl_HEADER_NAME])[_AS_FIRST_DIRECTIVE]), + [AS_VAR_GET([gl_next_header])]) + else + AC_SUBST( + AS_TR_CPP([NEXT_]m4_defn([gl_HEADER_NAME])[_AS_FIRST_DIRECTIVE]), + ['<'gl_HEADER_NAME'>']) + fi AS_VAR_POPDEF([gl_next_header])]) ]) -- 1.6.2.4