/* Set up combined include path chain for the preprocessor.
Copyright (C) 1986, 1987, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
- 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
+ 1999, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
Broken out of cppinit.c and cppfiles.c and rewritten Mar 2003.
#include "config.h"
#include "system.h"
#include "coretypes.h"
+#include "machmode.h"
+#include "target.h"
#include "tm.h"
#include "cpplib.h"
#include "prefix.h"
path[q - p] = '\0';
}
- add_path (path, chain, chain == SYSTEM);
+ add_path (path, chain, chain == SYSTEM, false);
}
}
if (!strncmp (p->fname, cpp_GCC_INCLUDE_DIR, len))
{
char *str = concat (iprefix, p->fname + len, NULL);
- add_path (str, SYSTEM, p->cxx_aware);
+ add_path (str, SYSTEM, p->cxx_aware, false);
}
}
}
else
str = update_path (p->fname, p->component);
- add_path (str, SYSTEM, p->cxx_aware);
+ add_path (str, SYSTEM, p->cxx_aware, false);
}
}
}
JOIN, unless it duplicates JOIN in which case the last path is
removed. Return the head of the resulting chain. Any of HEAD,
JOIN and SYSTEM can be NULL. */
+
static struct cpp_dir *
remove_duplicates (cpp_reader *pfile, struct cpp_dir *head,
struct cpp_dir *system, struct cpp_dir *join,
if (errno != ENOENT)
cpp_errno (pfile, CPP_DL_ERROR, cur->name);
else
- reason = REASON_NOENT;
+ {
+ /* If -Wmissing-include-dirs is given, warn. */
+ cpp_options *opts = cpp_get_options (pfile);
+ if (opts->warn_missing_include_dirs && cur->user_supplied_p)
+ cpp_errno (pfile, CPP_DL_WARNING, cur->name);
+ reason = REASON_NOENT;
+ }
}
else if (!S_ISDIR (st.st_mode))
cpp_error_with_line (pfile, CPP_DL_ERROR, 0, 0,
We can't just merge the lists and then uniquify them because then
we may lose directories from the <> search path that should be
- there; consider -Ifoo -Ibar -I- -Ifoo -Iquux. It is however safe
- to treat -Ibar -Ifoo -I- -Ifoo -Iquux as if written -Ibar -I- -Ifoo
- -Iquux. */
+ there; consider -iquote foo -iquote bar -Ifoo -Iquux. It is
+ however safe to treat -iquote bar -iquote foo -Ifoo -Iquux as if
+ written -iquote bar -Ifoo -Iquux. */
+
static void
merge_include_chains (cpp_reader *pfile, int verbose)
{
quote_ignores_source_dir = true;
}
+/* Add P to the chain specified by CHAIN. */
+
+void
+add_cpp_dir_path (cpp_dir *p, int chain)
+{
+ if (tails[chain])
+ tails[chain]->next = p;
+ else
+ heads[chain] = p;
+ tails[chain] = p;
+}
+
/* Add PATH to the include chain CHAIN. PATH must be malloc-ed and
NUL-terminated. */
void
-add_path (char *path, int chain, int cxx_aware)
+add_path (char *path, int chain, int cxx_aware, bool user_supplied_p)
{
- struct cpp_dir *p;
+ cpp_dir *p;
+
+#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
+ /* Convert all backslashes to slashes. The native CRT stat()
+ function does not recognise a directory that ends in a backslash
+ (unless it is a drive root dir, such "c:\"). Forward slashes,
+ trailing or otherwise, cause no problems for stat(). */
+ char* c;
+ for (c = path; *c; c++)
+ if (*c == '\\') *c = '/';
+#endif
- p = xmalloc (sizeof (struct cpp_dir));
+ p = xmalloc (sizeof (cpp_dir));
p->next = NULL;
p->name = path;
if (chain == SYSTEM || chain == AFTER)
p->sysp = 1 + !cxx_aware;
else
p->sysp = 0;
+ p->construct = 0;
+ p->user_supplied_p = user_supplied_p;
- if (tails[chain])
- tails[chain]->next = p;
- else
- heads[chain] = p;
- tails[chain] = p;
+ add_cpp_dir_path (p, chain);
}
/* Exported function to handle include chain merging, duplicate
if (stdinc)
add_standard_paths (sysroot, iprefix, cxx_stdinc);
+ target_c_incpath.extra_includes (stdinc);
+
merge_include_chains (pfile, verbose);
cpp_set_include_chains (pfile, heads[QUOTE], heads[BRACKET],
quote_ignores_source_dir);
}
+
+#ifndef TARGET_EXTRA_INCLUDES
+static void hook_void_int(int u ATTRIBUTE_UNUSED) { }
+
+struct target_c_incpath_s target_c_incpath = { hook_void_int };
+#endif