cppinit.c (remove_dup_dir): Add head_ptr argument to handle removal at head.

* cppinit.c (remove_dup_dir): Add head_ptr argument to handle removal
	at head.
	(remove_dup_nonsys_dirs): New function.
	(remove_dup_dirs): Change argument head to head_ptr.  Remove warnings.
	(merge_include_chains): Remove non-system include directories from
	quote and bracket include chains when they duplicate equivalent system
	directories.
	* doc/cpp.texi (-I): Update.
        * doc/cppopts.texi (-I): Update.
        * doc/install.texi (--with-local-prefix): Further document usage of
	this option.
	* doc/invoke.texi (-I): Update.

From-SVN: r56468
This commit is contained in:
John David Anglin 2002-08-20 19:56:30 +00:00 committed by John David Anglin
parent 4ca79136cf
commit 48209ce53a
6 changed files with 160 additions and 63 deletions

View File

@ -1,3 +1,18 @@
2002-08-20 John David Anglin <dave@hiauly1.hia.nrc.ca>
* cppinit.c (remove_dup_dir): Add head_ptr argument to handle removal
at head.
(remove_dup_nonsys_dirs): New function.
(remove_dup_dirs): Change argument head to head_ptr. Remove warnings.
(merge_include_chains): Remove non-system include directories from
quote and bracket include chains when they duplicate equivalent system
directories.
* doc/cpp.texi (-I): Update.
* doc/cppopts.texi (-I): Update.
* doc/install.texi (--with-local-prefix): Further document usage of
this option.
* doc/invoke.texi (-I): Update.
2002-08-20 Richard Henderson <rth@redhat.com>
* expr.c (TARGET_MEM_FUNCTIONS): Transform to boolean.

View File

@ -94,9 +94,13 @@ static void mark_named_operators PARAMS ((cpp_reader *));
static void append_include_chain PARAMS ((cpp_reader *,
char *, int, int));
static struct search_path * remove_dup_dir PARAMS ((cpp_reader *,
struct search_path *,
struct search_path **));
static struct search_path * remove_dup_nonsys_dirs PARAMS ((cpp_reader *,
struct search_path **,
struct search_path *));
static struct search_path * remove_dup_dirs PARAMS ((cpp_reader *,
struct search_path *));
struct search_path **));
static void merge_include_chains PARAMS ((cpp_reader *));
static bool push_include PARAMS ((cpp_reader *,
struct pending_option *));
@ -257,55 +261,92 @@ append_include_chain (pfile, dir, path, cxx_aware)
}
/* Handle a duplicated include path. PREV is the link in the chain
before the duplicate. The duplicate is removed from the chain and
freed. Returns PREV. */
before the duplicate, or NULL if the duplicate is at the head of
the chain. The duplicate is removed from the chain and freed.
Returns PREV. */
static struct search_path *
remove_dup_dir (pfile, prev)
remove_dup_dir (pfile, prev, head_ptr)
cpp_reader *pfile;
struct search_path *prev;
struct search_path **head_ptr;
{
struct search_path *cur = prev->next;
struct search_path *cur;
if (prev != NULL)
{
cur = prev->next;
prev->next = cur->next;
}
else
{
cur = *head_ptr;
*head_ptr = cur->next;
}
if (CPP_OPTION (pfile, verbose))
fprintf (stderr, _("ignoring duplicate directory \"%s\"\n"), cur->name);
prev->next = cur->next;
free ((PTR) cur->name);
free (cur);
return prev;
}
/* Remove duplicate non-system directories for which there is an equivalent
system directory latter in the chain. The range for removal is between
*HEAD_PTR and END. Returns the directory before END, or NULL if none.
This algorithm is quadratic in the number system directories, which is
acceptable since there aren't usually that many of them. */
static struct search_path *
remove_dup_nonsys_dirs (pfile, head_ptr, end)
cpp_reader *pfile;
struct search_path **head_ptr;
struct search_path *end;
{
struct search_path *prev, *cur, *other;
for (cur = *head_ptr; cur; cur = cur->next)
{
if (cur->sysp)
{
for (other = *head_ptr, prev = NULL;
other != end;
other = other ? other->next : *head_ptr)
{
if (!other->sysp
&& INO_T_EQ (cur->ino, other->ino)
&& cur->dev == other->dev)
{
other = remove_dup_dir (pfile, prev, head_ptr);
if (CPP_OPTION (pfile, verbose))
fprintf (stderr,
_(" as it is a non-system directory that duplicates a system directory\n"));
}
prev = other;
}
}
}
return prev;
}
/* Remove duplicate directories from a chain. Returns the tail of the
chain, or NULL if the chain is empty. This algorithm is quadratic
in the number of -I switches, which is acceptable since there
aren't usually that many of them. */
static struct search_path *
remove_dup_dirs (pfile, head)
remove_dup_dirs (pfile, head_ptr)
cpp_reader *pfile;
struct search_path *head;
struct search_path **head_ptr;
{
struct search_path *prev = NULL, *cur, *other;
for (cur = head; cur; cur = cur->next)
for (cur = *head_ptr; cur; cur = cur->next)
{
for (other = head; other != cur; other = other->next)
for (other = *head_ptr; other != cur; other = other->next)
if (INO_T_EQ (cur->ino, other->ino) && cur->dev == other->dev)
{
if (cur->sysp && !other->sysp)
{
cpp_error (pfile, DL_WARNING,
"changing search order for system directory \"%s\"",
cur->name);
if (strcmp (cur->name, other->name))
cpp_error (pfile, DL_WARNING,
" as it is the same as non-system directory \"%s\"",
other->name);
else
cpp_error (pfile, DL_WARNING,
" as it has already been specified as a non-system directory");
}
cur = remove_dup_dir (pfile, prev);
cur = remove_dup_dir (pfile, prev, head_ptr);
break;
}
prev = cur;
@ -343,28 +384,33 @@ merge_include_chains (pfile)
else
brack = systm;
/* This is a bit tricky. First we drop dupes from the quote-include
list. Then we drop dupes from the bracket-include list.
Finally, if qtail and brack are the same directory, we cut out
brack and move brack up to point to qtail.
/* This is a bit tricky. First we drop non-system dupes of system
directories from the merged bracket-include list. Next we drop
dupes from the bracket and quote include lists. Then we drop
non-system dupes from the merged quote-include list. Finally,
if qtail and brack are the same directory, we cut out brack and
move brack up to point to qtail.
We can't just merge the lists and then uniquify them because
then we may lose directories from the <> search path that should
be there; consider -Ifoo -Ibar -I- -Ifoo -Iquux. It is however
be there; consider -Ifoo -Ibar -I- -Ifoo -Iquux. It is however
safe to treat -Ibar -Ifoo -I- -Ifoo -Iquux as if written
-Ibar -I- -Ifoo -Iquux. */
remove_dup_dirs (pfile, brack);
qtail = remove_dup_dirs (pfile, quote);
remove_dup_nonsys_dirs (pfile, &brack, systm);
remove_dup_dirs (pfile, &brack);
if (quote)
{
qtail = remove_dup_dirs (pfile, &quote);
qtail->next = brack;
qtail = remove_dup_nonsys_dirs (pfile, &quote, brack);
/* If brack == qtail, remove brack as it's simpler. */
if (brack && INO_T_EQ (qtail->ino, brack->ino)
if (qtail && brack && INO_T_EQ (qtail->ino, brack->ino)
&& qtail->dev == brack->dev)
brack = remove_dup_dir (pfile, qtail);
brack = remove_dup_dir (pfile, qtail, &quote);
}
else
quote = brack;

View File

@ -823,11 +823,22 @@ version of GCC in use.
You can add to this list with the @option{-I@var{dir}} command line
option. All the directories named by @option{-I} are searched, in
left-to-right order, @emph{before} the default directories. You can
also prevent GCC from searching any of the default directories with the
@option{-nostdinc} option. This is useful when you are compiling an
left-to-right order, @emph{before} the default directories. The only
exception is when @file{dir} is already searched by default. In
this case, the option is ignored and the search order for system
directories remains unchanged.
Duplicate directories are removed from the quote and bracket search
chains before the two chains are merged to make the final search chain.
Thus, it is possible for a directory to occur twice in the final search
chain if it was specified in both the quote and bracket chains.
You can prevent GCC from searching any of the default directories with
the @option{-nostdinc} option. This is useful when you are compiling an
operating system kernel or some other program that does not use the
standard C library facilities, or the standard C library itself.
@option{-I} options are not ignored as described above when
@option{-nostdinc} is in effect.
GCC looks for headers requested with @code{@w{#include "@var{file}"}}
first in the directory containing the current file, then in the same
@ -836,12 +847,6 @@ For example, if @file{/usr/include/sys/stat.h} contains
@code{@w{#include "types.h"}}, GCC looks for @file{types.h} first in
@file{/usr/include/sys}, then in its usual search path.
If you name a search directory with @option{-I@var{dir}} that is also a
system include directory, the @option{-I} wins; the directory will be
searched according to the @option{-I} ordering, and it will not be
treated as a system include directory. GCC will warn you when a system
include directory is hidden in this way.
@samp{#line} (@pxref{Line Control}) does not change GCC's idea of the
directory containing the current file.
@ -1074,8 +1079,8 @@ found in that directory will be considered system headers.
All directories named by @option{-isystem} are searched @emph{after} all
directories named by @option{-I}, no matter what their order was on the
command line. If the same directory is named by both @option{-I} and
@option{-isystem}, @option{-I} wins; it is as if the @option{-isystem} option
had never been specified at all. GCC warns you when this happens.
@option{-isystem}, the @option{-I} option is ignored. GCC provides an
informative message when this occurs if @option{-v} is used.
@findex #pragma GCC system_header
There is also a directive, @code{@w{#pragma GCC system_header}}, which
@ -1817,9 +1822,7 @@ conformance to the C Standard. CPP follows the host convention when
processing system header files, but when processing user files
@code{__STDC__} is always 1. This has been reported to cause problems;
for instance, some versions of Solaris provide X Windows headers that
expect @code{__STDC__} to be either undefined or 1. You may be able to
work around this sort of problem by using an @option{-I} option to
cancel treatment of those headers as system headers. @xref{Invocation}.
expect @code{__STDC__} to be either undefined or 1. @xref{Invocation}.
@item __STDC_VERSION__
This macro expands to the C Standard's version number, a long integer

View File

@ -51,16 +51,14 @@ for header files.
@xref{Search Path}.
@end ifset
Directories named by @option{-I} are searched before the standard
system include directories.
It is dangerous to specify a standard system include directory in an
@option{-I} option. This defeats the special treatment of system
headers
system include directories. If the directory @var{dir} is a standard
system include directory, the option is ignored to ensure that the
default search order for system directories and the special treatment
of system headers are not defeated
@ifset cppmanual
(@pxref{System Headers})
@end ifset
. It can also defeat the repairs to buggy system headers which GCC
makes when it is installed.
.
@item -o @var{file}
@opindex o

View File

@ -467,6 +467,43 @@ any in that directory---are not part of GCC@. They are part of other
programs---perhaps many others. (GCC installs its own header files in
another directory which is based on the @option{--prefix} value.)
Both the local-prefix include directory and the GCC-prefix include
directory are part of GCC's "system include" directories. Although these
two directories are not fixed, they need to be searched in the proper
order for the correct processing of the include_next directive. The
local-prefix include directory is searched before the GCC-prefix
include directory. Another characteristic of system include directories
is that pedantic warnings are turned off for headers in these directories.
Some autoconf macros add @option{-I @var{directory}} options to the
compiler command line, to ensure that directories containing installed
packages' headers are searched. When @var{directory} is one of GCC's
system include directories, GCC will ignore the option so that system
directories continue to be processed in the correct order. This
may result in a search order different from what was specified but the
directory will still be searched.
GCC automatically searches for ordinary libraries using
@env{GCC_EXEC_PREFIX}. Thus, when the same installation prefix is
used for both GCC and packages, GCC will automatically search for
both headers and libraries. This provides a configuration that is
easy to use. GCC behaves in a manner similar to that when it is
installed as a system compiler in @file{/usr}.
Sites that need to install multiple versions of GCC may not want to
use the above simple configuration. It is possible to use the
@option{--program-prefix}, @option{--program-suffix} and
@option{--program-transform-name} options to install multiple versions
into a single directory, but it may be simpler to use different prefixes
and the @option{--with-local-prefix} option to specify the location of the
site-specific files for each version. It will then be necessary for
users to specify explicitly the location of local site libraries
(e.g., with @env{LIBRARY_PATH}).
The same value can be used for both @option{--with-local-prefix} and
@option{--prefix} provided it is not @file{/usr}. This can be used
to avoid the default search of @file{/usr/local/include}.
@strong{Do not} specify @file{/usr} as the @option{--with-local-prefix}!
The directory you use for @option{--with-local-prefix} @strong{must not}
contain any of the system's standard header files. If it did contain

View File

@ -4281,15 +4281,13 @@ one @option{-I} option, the directories are scanned in left-to-right
order; the standard system directories come after.
If a standard system include directory, or a directory specified with
@option{-isystem}, is also specified with @option{-I}, it will be
searched only in the position requested by @option{-I}. Also, it will
not be considered a system include directory. If that directory really
does contain system headers, there is a good chance that they will
break. For instance, if GCC's installation procedure edited the headers
in @file{/usr/include} to fix bugs, @samp{-I/usr/include} will cause the
original, buggy headers to be found instead of the corrected ones. GCC
will issue a warning when a system include directory is hidden in this
way.
@option{-isystem}, is also specified with @option{-I}, the @option{-I}
option will be ignored. The directory will still be searched but as a
system directory at its normal position in the system include chain.
This is to ensure that GCC's procedure to fix buggy system headers and
the ordering for the include_next directive are not inadvertantly changed.
If you really need to change the search order for system directories,
use the @option{-nostdinc} and/or @option{-isystem} options.
@item -I-
@opindex I-