]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/c-incpath.c
Remove docs for removed option.
[thirdparty/gcc.git] / gcc / c-incpath.c
CommitLineData
5793b276
NB
1/* Set up combined include path chain for the preprocessor.
2 Copyright (C) 1986, 1987, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
35fd3193 3 1999, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
5793b276
NB
4
5 Broken out of cppinit.c and cppfiles.c and rewritten Mar 2003.
6
7This program is free software; you can redistribute it and/or modify it
8under the terms of the GNU General Public License as published by the
9Free Software Foundation; either version 2, or (at your option) any
10later version.
11
12This program is distributed in the hope that it will be useful,
13but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15GNU General Public License for more details.
16
17You should have received a copy of the GNU General Public License
18along with this program; if not, write to the Free Software
19Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
20
21#include "config.h"
22#include "system.h"
23#include "coretypes.h"
94d1613b
MS
24#include "machmode.h"
25#include "target.h"
5793b276
NB
26#include "tm.h"
27#include "cpplib.h"
28#include "prefix.h"
29#include "intl.h"
30#include "c-incpath.h"
31#include "cppdefault.h"
32
33/* Windows does not natively support inodes, and neither does MSDOS.
34 Cygwin's emulation can generate non-unique inodes, so don't use it.
35 VMS has non-numeric inodes. */
36#ifdef VMS
37# define INO_T_EQ(A, B) (!memcmp (&(A), &(B), sizeof (A)))
38# define INO_T_COPY(DEST, SRC) memcpy(&(DEST), &(SRC), sizeof (SRC))
39#else
3f75a254 40# if (defined _WIN32 && !defined (_UWIN)) || defined __MSDOS__
5793b276
NB
41# define INO_T_EQ(A, B) 0
42# else
43# define INO_T_EQ(A, B) ((A) == (B))
44# endif
45# define INO_T_COPY(DEST, SRC) (DEST) = (SRC)
46#endif
47
35b1a6fa
AJ
48static void add_env_var_paths (const char *, int);
49static void add_standard_paths (const char *, const char *, int);
8f9b4009 50static void free_path (struct cpp_dir *, int);
35b1a6fa 51static void merge_include_chains (cpp_reader *, int);
8f9b4009
NB
52static struct cpp_dir *remove_duplicates (cpp_reader *, struct cpp_dir *,
53 struct cpp_dir *,
54 struct cpp_dir *, int);
5793b276
NB
55
56/* Include chains heads and tails. */
8f9b4009
NB
57static struct cpp_dir *heads[4];
58static struct cpp_dir *tails[4];
5793b276
NB
59static bool quote_ignores_source_dir;
60enum { REASON_QUIET = 0, REASON_NOENT, REASON_DUP, REASON_DUP_SYS };
61
62/* Free an element of the include chain, possibly giving a reason. */
63static void
8f9b4009 64free_path (struct cpp_dir *path, int reason)
5793b276
NB
65{
66 switch (reason)
67 {
68 case REASON_DUP:
69 case REASON_DUP_SYS:
70 fprintf (stderr, _("ignoring duplicate directory \"%s\"\n"), path->name);
71 if (reason == REASON_DUP_SYS)
72 fprintf (stderr,
73 _(" as it is a non-system directory that duplicates a system directory\n"));
74 break;
75
76 case REASON_NOENT:
77 fprintf (stderr, _("ignoring nonexistent directory \"%s\"\n"),
78 path->name);
79 break;
80
81 case REASON_QUIET:
82 default:
83 break;
84 }
85
fad205ff 86 free (path->name);
5793b276
NB
87 free (path);
88}
89
90/* Read ENV_VAR for a PATH_SEPARATOR-separated list of file names; and
91 append all the names to the search path CHAIN. */
92static void
35b1a6fa 93add_env_var_paths (const char *env_var, int chain)
5793b276
NB
94{
95 char *p, *q, *path;
96
97 GET_ENVIRONMENT (q, env_var);
98
99 if (!q)
100 return;
101
102 for (p = q; *q; p = q + 1)
103 {
104 q = p;
105 while (*q != 0 && *q != PATH_SEPARATOR)
106 q++;
107
108 if (p == q)
109 path = xstrdup (".");
110 else
111 {
112 path = xmalloc (q - p + 1);
113 memcpy (path, p, q - p);
114 path[q - p] = '\0';
115 }
116
b02398bd 117 add_path (path, chain, chain == SYSTEM, false);
5793b276
NB
118 }
119}
120
121/* Append the standard include chain defined in cppdefault.c. */
122static void
35b1a6fa 123add_standard_paths (const char *sysroot, const char *iprefix, int cxx_stdinc)
5793b276
NB
124{
125 const struct default_include *p;
611f0729 126 size_t len;
5793b276 127
611f0729
AM
128 if (iprefix && (len = cpp_GCC_INCLUDE_DIR_len) != 0)
129 {
130 /* Look for directories that start with the standard prefix.
89dbed81 131 "Translate" them, i.e. replace /usr/local/lib/gcc... with
611f0729
AM
132 IPREFIX and search them first. */
133 for (p = cpp_include_defaults; p->fname; p++)
134 {
135 if (!p->cplusplus || cxx_stdinc)
136 {
137 /* Should we be translating sysrooted dirs too? Assume
138 that iprefix and sysroot are mutually exclusive, for
139 now. */
140 if (sysroot && p->add_sysroot)
141 continue;
142 if (!strncmp (p->fname, cpp_GCC_INCLUDE_DIR, len))
143 {
144 char *str = concat (iprefix, p->fname + len, NULL);
b02398bd 145 add_path (str, SYSTEM, p->cxx_aware, false);
611f0729
AM
146 }
147 }
148 }
149 }
5793b276
NB
150
151 for (p = cpp_include_defaults; p->fname; p++)
152 {
153 if (!p->cplusplus || cxx_stdinc)
154 {
155 char *str;
156
157 /* Should this directory start with the sysroot? */
158 if (sysroot && p->add_sysroot)
159 str = concat (sysroot, p->fname, NULL);
5793b276
NB
160 else
161 str = update_path (p->fname, p->component);
162
b02398bd 163 add_path (str, SYSTEM, p->cxx_aware, false);
5793b276
NB
164 }
165 }
166}
167
168/* For each duplicate path in chain HEAD, keep just the first one.
169 Remove each path in chain HEAD that also exists in chain SYSTEM.
170 Set the NEXT pointer of the last path in the resulting chain to
171 JOIN, unless it duplicates JOIN in which case the last path is
172 removed. Return the head of the resulting chain. Any of HEAD,
173 JOIN and SYSTEM can be NULL. */
4bed3787 174
8f9b4009
NB
175static struct cpp_dir *
176remove_duplicates (cpp_reader *pfile, struct cpp_dir *head,
177 struct cpp_dir *system, struct cpp_dir *join,
35b1a6fa 178 int verbose)
5793b276 179{
8f9b4009 180 struct cpp_dir **pcur, *tmp, *cur;
5793b276
NB
181 struct stat st;
182
183 for (pcur = &head; *pcur; )
184 {
185 int reason = REASON_QUIET;
186
187 cur = *pcur;
5793b276
NB
188
189 if (stat (cur->name, &st))
190 {
191 /* Dirs that don't exist are silently ignored, unless verbose. */
192 if (errno != ENOENT)
0527bc4e 193 cpp_errno (pfile, CPP_DL_ERROR, cur->name);
5793b276 194 else
b02398bd 195 {
9cf737f8 196 /* If -Wmissing-include-dirs is given, warn. */
b02398bd
BE
197 cpp_options *opts = cpp_get_options (pfile);
198 if (opts->warn_missing_include_dirs && cur->user_supplied_p)
199 cpp_errno (pfile, CPP_DL_WARNING, cur->name);
200 reason = REASON_NOENT;
201 }
5793b276
NB
202 }
203 else if (!S_ISDIR (st.st_mode))
0527bc4e 204 cpp_error_with_line (pfile, CPP_DL_ERROR, 0, 0,
5793b276
NB
205 "%s: not a directory", cur->name);
206 else
207 {
208 INO_T_COPY (cur->ino, st.st_ino);
209 cur->dev = st.st_dev;
210
211 /* Remove this one if it is in the system chain. */
212 reason = REASON_DUP_SYS;
213 for (tmp = system; tmp; tmp = tmp->next)
8748c00f
MR
214 if (INO_T_EQ (tmp->ino, cur->ino) && tmp->dev == cur->dev
215 && cur->construct == tmp->construct)
5793b276
NB
216 break;
217
218 if (!tmp)
219 {
4d6922ee 220 /* Duplicate of something earlier in the same chain? */
5793b276
NB
221 reason = REASON_DUP;
222 for (tmp = head; tmp != cur; tmp = tmp->next)
8748c00f
MR
223 if (INO_T_EQ (cur->ino, tmp->ino) && cur->dev == tmp->dev
224 && cur->construct == tmp->construct)
5793b276
NB
225 break;
226
227 if (tmp == cur
228 /* Last in the chain and duplicate of JOIN? */
229 && !(cur->next == NULL && join
230 && INO_T_EQ (cur->ino, join->ino)
8748c00f
MR
231 && cur->dev == join->dev
232 && cur->construct == join->construct))
5793b276
NB
233 {
234 /* Unique, so keep this directory. */
235 pcur = &cur->next;
236 continue;
237 }
238 }
239 }
240
241 /* Remove this entry from the chain. */
242 *pcur = cur->next;
243 free_path (cur, verbose ? reason: REASON_QUIET);
244 }
245
246 *pcur = join;
247 return head;
248}
249
250/* Merge the four include chains together in the order quote, bracket,
251 system, after. Remove duplicate dirs (as determined by
252 INO_T_EQ()).
253
254 We can't just merge the lists and then uniquify them because then
255 we may lose directories from the <> search path that should be
4bed3787
MS
256 there; consider -iquote foo -iquote bar -Ifoo -Iquux. It is
257 however safe to treat -iquote bar -iquote foo -Ifoo -Iquux as if
258 written -iquote bar -Ifoo -Iquux. */
259
5793b276 260static void
35b1a6fa 261merge_include_chains (cpp_reader *pfile, int verbose)
5793b276
NB
262{
263 /* Join the SYSTEM and AFTER chains. Remove duplicates in the
264 resulting SYSTEM chain. */
265 if (heads[SYSTEM])
266 tails[SYSTEM]->next = heads[AFTER];
267 else
268 heads[SYSTEM] = heads[AFTER];
269 heads[SYSTEM] = remove_duplicates (pfile, heads[SYSTEM], 0, 0, verbose);
270
271 /* Remove duplicates from BRACKET that are in itself or SYSTEM, and
272 join it to SYSTEM. */
273 heads[BRACKET] = remove_duplicates (pfile, heads[BRACKET], heads[SYSTEM],
274 heads[SYSTEM], verbose);
275
276 /* Remove duplicates from QUOTE that are in itself or SYSTEM, and
277 join it to BRACKET. */
278 heads[QUOTE] = remove_duplicates (pfile, heads[QUOTE], heads[SYSTEM],
279 heads[BRACKET], verbose);
280
281 /* If verbose, print the list of dirs to search. */
282 if (verbose)
283 {
8f9b4009 284 struct cpp_dir *p;
5793b276
NB
285
286 fprintf (stderr, _("#include \"...\" search starts here:\n"));
287 for (p = heads[QUOTE];; p = p->next)
288 {
289 if (p == heads[BRACKET])
290 fprintf (stderr, _("#include <...> search starts here:\n"));
291 if (!p)
292 break;
293 fprintf (stderr, " %s\n", p->name);
294 }
295 fprintf (stderr, _("End of search list.\n"));
296 }
297}
298
299/* Use given -I paths for #include "..." but not #include <...>, and
300 don't search the directory of the present file for #include "...".
301 (Note that -I. -I- is not the same as the default setup; -I. uses
302 the compiler's working dir.) */
303void
35b1a6fa 304split_quote_chain (void)
5793b276
NB
305{
306 heads[QUOTE] = heads[BRACKET];
307 tails[QUOTE] = tails[BRACKET];
308 heads[BRACKET] = NULL;
309 tails[BRACKET] = NULL;
310 /* This is NOT redundant. */
311 quote_ignores_source_dir = true;
312}
313
94d1613b
MS
314/* Add P to the chain specified by CHAIN. */
315
316void
317add_cpp_dir_path (cpp_dir *p, int chain)
318{
319 if (tails[chain])
320 tails[chain]->next = p;
321 else
322 heads[chain] = p;
323 tails[chain] = p;
324}
325
5793b276
NB
326/* Add PATH to the include chain CHAIN. PATH must be malloc-ed and
327 NUL-terminated. */
328void
b02398bd 329add_path (char *path, int chain, int cxx_aware, bool user_supplied_p)
5793b276 330{
94d1613b 331 cpp_dir *p;
5793b276 332
421563d5
DS
333#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
334 /* Convert all backslashes to slashes. The native CRT stat()
35fd3193 335 function does not recognize a directory that ends in a backslash
421563d5
DS
336 (unless it is a drive root dir, such "c:\"). Forward slashes,
337 trailing or otherwise, cause no problems for stat(). */
338 char* c;
339 for (c = path; *c; c++)
340 if (*c == '\\') *c = '/';
341#endif
342
94d1613b 343 p = xmalloc (sizeof (cpp_dir));
5793b276
NB
344 p->next = NULL;
345 p->name = path;
346 if (chain == SYSTEM || chain == AFTER)
82f6e3eb 347 p->sysp = 1 + !cxx_aware;
5793b276
NB
348 else
349 p->sysp = 0;
94d1613b 350 p->construct = 0;
b02398bd 351 p->user_supplied_p = user_supplied_p;
5793b276 352
b02398bd 353 add_cpp_dir_path (p, chain);
5793b276
NB
354}
355
356/* Exported function to handle include chain merging, duplicate
357 removal, and registration with cpplib. */
358void
35b1a6fa
AJ
359register_include_chains (cpp_reader *pfile, const char *sysroot,
360 const char *iprefix, int stdinc, int cxx_stdinc,
361 int verbose)
5793b276
NB
362{
363 static const char *const lang_env_vars[] =
364 { "C_INCLUDE_PATH", "CPLUS_INCLUDE_PATH",
365 "OBJC_INCLUDE_PATH", "OBJCPLUS_INCLUDE_PATH" };
366 cpp_options *cpp_opts = cpp_get_options (pfile);
367 size_t idx = (cpp_opts->objc ? 2: 0);
368
369 if (cpp_opts->cplusplus)
370 idx++;
371 else
372 cxx_stdinc = false;
373
374 /* CPATH and language-dependent environment variables may add to the
375 include chain. */
376 add_env_var_paths ("CPATH", BRACKET);
377 add_env_var_paths (lang_env_vars[idx], SYSTEM);
3dd53121
AP
378
379 target_c_incpath.extra_pre_includes (sysroot, iprefix, stdinc);
5793b276
NB
380
381 /* Finally chain on the standard directories. */
382 if (stdinc)
383 add_standard_paths (sysroot, iprefix, cxx_stdinc);
384
3dd53121 385 target_c_incpath.extra_includes (sysroot, iprefix, stdinc);
94d1613b 386
5793b276
NB
387 merge_include_chains (pfile, verbose);
388
389 cpp_set_include_chains (pfile, heads[QUOTE], heads[BRACKET],
390 quote_ignores_source_dir);
391}
3dd53121
AP
392#if !(defined TARGET_EXTRA_INCLUDES) || !(defined TARGET_EXTRA_PRE_INCLUDES)
393static void hook_void_charptr_charptr_int (const char *sysroot ATTRIBUTE_UNUSED,
394 const char *iprefix ATTRIBUTE_UNUSED,
395 int stdinc ATTRIBUTE_UNUSED)
396{
397}
398#endif
94d1613b
MS
399
400#ifndef TARGET_EXTRA_INCLUDES
3dd53121 401#define TARGET_EXTRA_INCLUDES hook_void_charptr_charptr_int
94d1613b 402#endif
3dd53121
AP
403#ifndef TARGET_EXTRA_PRE_INCLUDES
404#define TARGET_EXTRA_PRE_INCLUDES hook_void_charptr_charptr_int
405#endif
406
407struct target_c_incpath_s target_c_incpath = { TARGET_EXTRA_PRE_INCLUDES, TARGET_EXTRA_INCLUDES };
408