change the minimum requrired value for sysroot_len to 1 in case of identifying sysroot=/
[platform/upstream/gcc48.git] / gcc / incpath.c
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 > 1 && 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