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
51static const char dir_separator_str[] = { DIR_SEPARATOR, 0 };
52
53static void add_env_var_paths (const char *, int);
54static void add_standard_paths (const char *, const char *, const char *, int);
55static void free_path (struct cpp_dir *, int);
56static void merge_include_chains (const char *, cpp_reader *, int);
57static void add_sysroot_to_chain (const char *, int);
58static 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.  */
63static struct cpp_dir *heads[4];
64static struct cpp_dir *tails[4];
65static bool quote_ignores_source_dir;
66enum { REASON_QUIET = 0, REASON_NOENT, REASON_DUP, REASON_DUP_SYS };
67
68/* Free an element of the include chain, possibly giving a reason.  */
69static void
70free_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.  */
98static void
99add_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.  */
128static void
129add_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
213static struct cpp_dir *
214remove_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
290static void
291add_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
310static void
311merge_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.)  */
362void
363split_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
375void
376add_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.  */
387void
388add_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.  */
425void
426register_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)
460static 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
474struct target_c_incpath_s target_c_incpath = { TARGET_EXTRA_PRE_INCLUDES, TARGET_EXTRA_INCLUDES };
475
476