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