bug-gnulib
[Top][All Lists]
Advanced

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

Re: Tru64 5.1 cc #include_next header name expansion


From: Bruno Haible
Subject: Re: Tru64 5.1 cc #include_next header name expansion
Date: Sun, 17 Jan 2010 22:04:54 +0100
User-agent: KMail/1.9.9

Ralf Wildenhues wrote:
> This one is funny: Tru64 5.1 cc, which is
> Compaq C V6.5-303 (dtk) on Compaq Tru64 UNIX V5.1 (Rev. 732)
> 
> treats include_next different from include:
> 
> $ echo '#define foo bar
> #include <foo.h>' | cc -E -
> # 1 ""
> 
> 
> cc: Error: , line 2: Cannot find file <foo.h> specified in #include
> directive. (noinclfile)
> #include <foo.h>
> -^
> 
> $ echo '#define foo bar
> #include_next <foo.h>' | cc -E -
> # 1 ""
> 
> 
> cc: Error: , line 2: Cannot find file <bar.h> specified in #include
> directive. (noinclfile)
> #include_next <foo.h>
> -^

A very peculiar preprocessor behaviour, indeed.

> Consequently, it fails like this when building gnulib:
> 
> source='../../gllib/accept4.c' object='accept4.o' libtool=no \
> DEPDIR=.deps depmode=tru64 /bin/ksh ../../build-aux/depcomp \
> cc -DHAVE_CONFIG_H -DEXEEXT=\"\" -DEXEEXT=\"\" -DNO_XMALLOC -DEXEEXT=\"\" -I. 
> -I../../gllib -I..  -I../intl -ieee  -g -c -o accept4.o ../../gllib/accept4.c
> cc: Severe: ./fcntl.h, line 46: Cannot find file <rpl_fcntl.h> specified in 
> #include directive. (noinclfilef)
> #include_next <fcntl.h>
> -^
> gmake[4]: *** [accept4.o] Error 1
> 
> I'm not sure how to best avoid this for the two include_next instances
> in fcntl.h.  Suggestions?

You will notice that
  1) the  '#define fcntl rpl_fcntl' occurs only after '#define _GL_FCNTL_H'.
     So, whenever  #include_next <fcntl.h>  behaves like this, _GL_FCNTL_H must
     be already defined.
  2) the  #include_next <fcntl.h>  is guarded by a
       #ifndef _GL_FCNTL_H

The only explanation therefore is that the problem occurs due to fcntl.in.h
doing
  # include <unistd.h>
which itself then again does
  # include <fcntl.h>

For a fix, one of the two include statements need to be conditionalized so that
it does not happen any more on this platform.

Since I've never heard that <fcntl.h> would require <unistd.h> as a prerequisite
(e.g. the manual page of 'open' does not mention <unistd.h>), I propose this
change:


2010-01-17  Bruno Haible  <address@hidden>

        Avoid compilation error with cc on OSF/1 5.1.
        * lib/fcntl.in.h: Include <unistd.h> after the #include_next <fcntl.h>
        statement, not before.
        Reported by Ralf Wildenhues.

--- lib/fcntl.in.h.orig Sun Jan 17 22:02:28 2010
+++ lib/fcntl.in.h      Sun Jan 17 22:02:03 2010
@@ -27,7 +27,6 @@
 #include <sys/types.h>
 #ifndef __GLIBC__ /* Avoid namespace pollution on glibc systems.  */
 # include <sys/stat.h>
-# include <unistd.h>
 #endif
 address@hidden@ @NEXT_FCNTL_H@
 
@@ -39,7 +38,6 @@
 #include <sys/types.h>
 #ifndef __GLIBC__ /* Avoid namespace pollution on glibc systems.  */
 # include <sys/stat.h>
-# include <unistd.h>
 #endif
 /* The include_next requires a split double-inclusion guard.  */
 address@hidden@ @NEXT_FCNTL_H@
@@ -47,6 +45,10 @@
 #ifndef _GL_FCNTL_H
 #define _GL_FCNTL_H
 
+#ifndef __GLIBC__ /* Avoid namespace pollution on glibc systems.  */
+# include <unistd.h>
+#endif
+
 
 /* The definition of GL_LINK_WARNING is copied here.  */
 




reply via email to

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