We build a large amount of software using a src tree and a separate object
tree.
We have recently upgraded from gcc v3.4 to gcc v4.3
 $ gcc --version                    
gcc (GCC) 4.3.2
Copyright (C) 2008 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

We are having a problem with include paths. The mechanisms for controlling the
algorithm used to select which header files are included has been deprecated
and the proposed replacement mechanism (-iquote) does not provide the same
functionality as the old mechanism (-I-). For example: 

Using a representative build tree of:
 src/
  t.c
  a.h
  b.h

 obj/

For the purposes of this example, t.c includes a.h and a.h subsequently
includes b.h.

$ cat ../src/t.c
#include "a.h"

$ cat ../src/a.h
#ifndef A_H
#define A_H
#include "b.h"

#endif

$ cat ../src/b.h
#ifndef B_H
#define B_H
#endif

In the obj directory, we build t.c:
 $ gcc -c ../src/t.c -I. -I../src -H
. ../src/a.h
.. ../src/b.h
$ 

A problem with b.h is detected, it is fixed and a patch is created, this
results in a version of b.h in the obj/ directory (The patching mechanism is
part of the build process and is thus automated, the result is a patched
version of b.h is created as obj/b.h - this is the file that should be used,
not src/b.h).

Now we have:
 src/
  t.c
  a.h
  b.h

 obj/
  b.h (patched)

In the obj directory, we build t.c:
 $ gcc -c ../src/t.c -I. -I- -I../src -H
cc1: note: obsolete option -I- used, please use -iquote instead
. ../src/a.h
.. ./b.h
$ 

The behaviour worked as required, but wanting to eliminate the warning and use
the recommended mechanism, I read the manual and found the description of
-iquote:

-iquotedir
    Add the directory dir to the head of the list of directories to be searched
for header files only for the case of `#include "file"'; they are not searched
for `#include <file>', otherwise just like -I. 

And changed my compile command to:

$ gcc -c ../src/t.c -iquote. -I../src -H
. ../src/a.h
.. ../src/b.h

Not what I wanted, so I tried all the other combinations of "-iquote.
-iquote../src" and "-I. -iquote../src" with the same result.

The manual is quite explicit that other than changing the order of search,
-iquote behaves just like -I, which means it is functioning as designed.

It appears the only way I can change the include search algorithm to achieve
the gcc v3.4 functionality is to use the '-I-' option which is now deprecated.
My fear of course is that it will go away in an upcoming release.

This is a documented feature in gcc versions prior to gcc 4, from the GNU CPP
(v3) man page:

     -I- Split the include path.  Any directories specified with
         -I options before -I- are searched only for headers
         requested with "#include "file""; they are not searched
         for "#include <file>".  If additional directories are
         specified with -I options after the -I-, those
         directories are searched for all #include directives.

         In addition, -I- inhibits the use of the directory of
         the current file directory as the first search directory
         for "#include "file"".


Is there another supported option to achieve the functionality we are relying
on?


-- 
           Summary: -I- deprecated, but AFAIK no fully equivalent
                    functionality is available
           Product: gcc
           Version: 4.3.2
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: preprocessor
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: steve dot gcc at telxio dot com
 GCC build triplet: sparc-sun-solaris2.10


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=37292

Reply via email to