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