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