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
4 Free Software Foundation, Inc.
6 Broken out of cppinit.c and cppfiles.c and rewritten Mar 2003.
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 2, or (at your option) any
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.
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
27 #include "c-incpath.h"
28 #include "cppdefault.h"
30 /* Windows does not natively support inodes, and neither does MSDOS.
31 Cygwin's emulation can generate non-unique inodes, so don't use it.
32 VMS has non-numeric inodes. */
34 # define INO_T_EQ(A, B) (!memcmp (&(A), &(B), sizeof (A)))
35 # define INO_T_COPY(DEST, SRC) memcpy(&(DEST), &(SRC), sizeof (SRC))
37 # if (defined _WIN32 && !defined (_UWIN)) || defined __MSDOS__
38 # define INO_T_EQ(A, B) 0
40 # define INO_T_EQ(A, B) ((A) == (B))
42 # define INO_T_COPY(DEST, SRC) (DEST) = (SRC)
45 static const char dir_separator_str[] = { DIR_SEPARATOR, 0 };
47 static void add_env_var_paths (const char *, int);
48 static void add_standard_paths (const char *, const char *, const char *, int);
49 static void free_path (struct cpp_dir *, int);
50 static void merge_include_chains (cpp_reader *, int);
51 static struct cpp_dir *remove_duplicates (cpp_reader *, struct cpp_dir *,
53 struct cpp_dir *, int);
55 /* Include chains heads and tails. */
56 static struct cpp_dir *heads[4];
57 static struct cpp_dir *tails[4];
58 static bool quote_ignores_source_dir;
59 enum { REASON_QUIET = 0, REASON_NOENT, REASON_DUP, REASON_DUP_SYS };
61 /* Free an element of the include chain, possibly giving a reason. */
63 free_path (struct cpp_dir *path, int reason)
69 fprintf (stderr, _("ignoring duplicate directory \"%s\"\n"), path->name);
70 if (reason == REASON_DUP_SYS)
72 _(" as it is a non-system directory that duplicates a system directory\n"));
76 fprintf (stderr, _("ignoring nonexistent directory \"%s\"\n"),
89 /* Read ENV_VAR for a PATH_SEPARATOR-separated list of file names; and
90 append all the names to the search path CHAIN. */
92 add_env_var_paths (const char *env_var, int chain)
96 GET_ENVIRONMENT (q, env_var);
101 for (p = q; *q; p = q + 1)
104 while (*q != 0 && *q != PATH_SEPARATOR)
108 path = xstrdup (".");
111 path = XNEWVEC (char, q - p + 1);
112 memcpy (path, p, q - p);
116 add_path (path, chain, chain == SYSTEM, false);
120 /* Append the standard include chain defined in cppdefault.c. */
122 add_standard_paths (const char *sysroot, const char *iprefix,
123 const char *imultilib, int cxx_stdinc)
125 const struct default_include *p;
128 if (iprefix && (len = cpp_GCC_INCLUDE_DIR_len) != 0)
130 /* Look for directories that start with the standard prefix.
131 "Translate" them, i.e. replace /usr/local/lib/gcc... with
132 IPREFIX and search them first. */
133 for (p = cpp_include_defaults; p->fname; p++)
135 if (!p->cplusplus || cxx_stdinc)
137 /* Should we be translating sysrooted dirs too? Assume
138 that iprefix and sysroot are mutually exclusive, for
140 if (sysroot && p->add_sysroot)
142 if (!strncmp (p->fname, cpp_GCC_INCLUDE_DIR, len))
144 char *str = concat (iprefix, p->fname + len, NULL);
145 if (p->multilib && imultilib)
146 str = concat (str, dir_separator_str, imultilib, NULL);
147 add_path (str, SYSTEM, p->cxx_aware, false);
153 for (p = cpp_include_defaults; p->fname; p++)
155 if (!p->cplusplus || cxx_stdinc)
159 /* Should this directory start with the sysroot? */
160 if (sysroot && p->add_sysroot)
161 str = concat (sysroot, p->fname, NULL);
163 str = update_path (p->fname, p->component);
165 if (p->multilib && imultilib)
166 str = concat (str, dir_separator_str, imultilib, NULL);
168 add_path (str, SYSTEM, p->cxx_aware, false);
173 /* For each duplicate path in chain HEAD, keep just the first one.
174 Remove each path in chain HEAD that also exists in chain SYSTEM.
175 Set the NEXT pointer of the last path in the resulting chain to
176 JOIN, unless it duplicates JOIN in which case the last path is
177 removed. Return the head of the resulting chain. Any of HEAD,
178 JOIN and SYSTEM can be NULL. */
180 static struct cpp_dir *
181 remove_duplicates (cpp_reader *pfile, struct cpp_dir *head,
182 struct cpp_dir *system, struct cpp_dir *join,
185 struct cpp_dir **pcur, *tmp, *cur;
188 for (pcur = &head; *pcur; )
190 int reason = REASON_QUIET;
194 if (stat (cur->name, &st))
196 /* Dirs that don't exist are silently ignored, unless verbose. */
198 cpp_errno (pfile, CPP_DL_ERROR, cur->name);
201 /* If -Wmissing-include-dirs is given, warn. */
202 cpp_options *opts = cpp_get_options (pfile);
203 if (opts->warn_missing_include_dirs && cur->user_supplied_p)
204 cpp_errno (pfile, CPP_DL_WARNING, cur->name);
205 reason = REASON_NOENT;
208 else if (!S_ISDIR (st.st_mode))
209 cpp_error_with_line (pfile, CPP_DL_ERROR, 0, 0,
210 "%s: not a directory", cur->name);
213 INO_T_COPY (cur->ino, st.st_ino);
214 cur->dev = st.st_dev;
216 /* Remove this one if it is in the system chain. */
217 reason = REASON_DUP_SYS;
218 for (tmp = system; tmp; tmp = tmp->next)
219 if (INO_T_EQ (tmp->ino, cur->ino) && tmp->dev == cur->dev
220 && cur->construct == tmp->construct)
225 /* Duplicate of something earlier in the same chain? */
227 for (tmp = head; tmp != cur; tmp = tmp->next)
228 if (INO_T_EQ (cur->ino, tmp->ino) && cur->dev == tmp->dev
229 && cur->construct == tmp->construct)
233 /* Last in the chain and duplicate of JOIN? */
234 && !(cur->next == NULL && join
235 && INO_T_EQ (cur->ino, join->ino)
236 && cur->dev == join->dev
237 && cur->construct == join->construct))
239 /* Unique, so keep this directory. */
246 /* Remove this entry from the chain. */
248 free_path (cur, verbose ? reason: REASON_QUIET);
255 /* Merge the four include chains together in the order quote, bracket,
256 system, after. Remove duplicate dirs (as determined by
259 We can't just merge the lists and then uniquify them because then
260 we may lose directories from the <> search path that should be
261 there; consider -iquote foo -iquote bar -Ifoo -Iquux. It is
262 however safe to treat -iquote bar -iquote foo -Ifoo -Iquux as if
263 written -iquote bar -Ifoo -Iquux. */
266 merge_include_chains (cpp_reader *pfile, int verbose)
268 /* Join the SYSTEM and AFTER chains. Remove duplicates in the
269 resulting SYSTEM chain. */
271 tails[SYSTEM]->next = heads[AFTER];
273 heads[SYSTEM] = heads[AFTER];
274 heads[SYSTEM] = remove_duplicates (pfile, heads[SYSTEM], 0, 0, verbose);
276 /* Remove duplicates from BRACKET that are in itself or SYSTEM, and
277 join it to SYSTEM. */
278 heads[BRACKET] = remove_duplicates (pfile, heads[BRACKET], heads[SYSTEM],
279 heads[SYSTEM], verbose);
281 /* Remove duplicates from QUOTE that are in itself or SYSTEM, and
282 join it to BRACKET. */
283 heads[QUOTE] = remove_duplicates (pfile, heads[QUOTE], heads[SYSTEM],
284 heads[BRACKET], verbose);
286 /* If verbose, print the list of dirs to search. */
291 fprintf (stderr, _("#include \"...\" search starts here:\n"));
292 for (p = heads[QUOTE];; p = p->next)
294 if (p == heads[BRACKET])
295 fprintf (stderr, _("#include <...> search starts here:\n"));
298 fprintf (stderr, " %s\n", p->name);
300 fprintf (stderr, _("End of search list.\n"));
304 /* Use given -I paths for #include "..." but not #include <...>, and
305 don't search the directory of the present file for #include "...".
306 (Note that -I. -I- is not the same as the default setup; -I. uses
307 the compiler's working dir.) */
309 split_quote_chain (void)
311 heads[QUOTE] = heads[BRACKET];
312 tails[QUOTE] = tails[BRACKET];
313 heads[BRACKET] = NULL;
314 tails[BRACKET] = NULL;
315 /* This is NOT redundant. */
316 quote_ignores_source_dir = true;
319 /* Add P to the chain specified by CHAIN. */
322 add_cpp_dir_path (cpp_dir *p, int chain)
325 tails[chain]->next = p;
331 /* Add PATH to the include chain CHAIN. PATH must be malloc-ed and
334 add_path (char *path, int chain, int cxx_aware, bool user_supplied_p)
338 #if defined (HAVE_DOS_BASED_FILE_SYSTEM)
339 /* Convert all backslashes to slashes. The native CRT stat()
340 function does not recognize a directory that ends in a backslash
341 (unless it is a drive root dir, such "c:\"). Forward slashes,
342 trailing or otherwise, cause no problems for stat(). */
344 for (c = path; *c; c++)
345 if (*c == '\\') *c = '/';
351 if (chain == SYSTEM || chain == AFTER)
352 p->sysp = 1 + !cxx_aware;
356 p->user_supplied_p = user_supplied_p;
358 add_cpp_dir_path (p, chain);
361 /* Exported function to handle include chain merging, duplicate
362 removal, and registration with cpplib. */
364 register_include_chains (cpp_reader *pfile, const char *sysroot,
365 const char *iprefix, const char *imultilib,
366 int stdinc, int cxx_stdinc, int verbose)
368 static const char *const lang_env_vars[] =
369 { "C_INCLUDE_PATH", "CPLUS_INCLUDE_PATH",
370 "OBJC_INCLUDE_PATH", "OBJCPLUS_INCLUDE_PATH" };
371 cpp_options *cpp_opts = cpp_get_options (pfile);
372 size_t idx = (cpp_opts->objc ? 2: 0);
374 if (cpp_opts->cplusplus)
379 /* CPATH and language-dependent environment variables may add to the
381 add_env_var_paths ("CPATH", BRACKET);
382 add_env_var_paths (lang_env_vars[idx], SYSTEM);
384 target_c_incpath.extra_pre_includes (sysroot, iprefix, stdinc);
386 /* Finally chain on the standard directories. */
388 add_standard_paths (sysroot, iprefix, imultilib, cxx_stdinc);
390 target_c_incpath.extra_includes (sysroot, iprefix, stdinc);
392 merge_include_chains (pfile, verbose);
394 cpp_set_include_chains (pfile, heads[QUOTE], heads[BRACKET],
395 quote_ignores_source_dir);
397 #if !(defined TARGET_EXTRA_INCLUDES) || !(defined TARGET_EXTRA_PRE_INCLUDES)
398 static void hook_void_charptr_charptr_int (const char *sysroot ATTRIBUTE_UNUSED,
399 const char *iprefix ATTRIBUTE_UNUSED,
400 int stdinc ATTRIBUTE_UNUSED)
405 #ifndef TARGET_EXTRA_INCLUDES
406 #define TARGET_EXTRA_INCLUDES hook_void_charptr_charptr_int
408 #ifndef TARGET_EXTRA_PRE_INCLUDES
409 #define TARGET_EXTRA_PRE_INCLUDES hook_void_charptr_charptr_int
412 struct target_c_incpath_s target_c_incpath = { TARGET_EXTRA_PRE_INCLUDES, TARGET_EXTRA_INCLUDES };