Mercurial > hg > CbC > CbC_gcc
diff gcc/d/d-incpath.cc @ 145:1830386684a0
gcc-9.2.0
author | anatofuz |
---|---|
date | Thu, 13 Feb 2020 11:34:05 +0900 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gcc/d/d-incpath.cc Thu Feb 13 11:34:05 2020 +0900 @@ -0,0 +1,195 @@ +/* d-incpath.cc -- Set up combined import paths for the D frontend. + Copyright (C) 2006-2020 Free Software Foundation, Inc. + +GCC is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 3, or (at your option) +any later version. + +GCC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with GCC; see the file COPYING3. If not see +<http://www.gnu.org/licenses/>. */ + +#include "config.h" +#include "system.h" +#include "coretypes.h" + +#include "dmd/globals.h" + +#include "cppdefault.h" + +/* Look for directories that start with the standard prefix. + "Translate" them, i.e: replace /usr/local/lib/gcc with + IPREFIX and search them first. Based on incpath.c. */ + +static char * +prefixed_path (const char *path, const char *iprefix) +{ + size_t len; + + if (cpp_relocated () && (len = cpp_PREFIX_len) != 0) + { + if (!strncmp (path, cpp_PREFIX, len)) + { + static const char *relocated_prefix; + /* If this path starts with the configure-time prefix, + but the compiler has been relocated, replace it + with the run-time prefix. */ + if (!relocated_prefix) + { + /* Make relative prefix expects the first argument + to be a program, not a directory. */ + char *dummy = concat (gcc_exec_prefix, "dummy", NULL); + relocated_prefix + = make_relative_prefix (dummy, + cpp_EXEC_PREFIX, + cpp_PREFIX); + free (dummy); + } + + return concat (relocated_prefix, path + len, NULL); + } + } + + if (iprefix && (len = cpp_GCC_INCLUDE_DIR_len) != 0) + { + if (!strncmp (path, cpp_GCC_INCLUDE_DIR, len)) + return concat (iprefix, path + len, NULL); + } + + return xstrdup (path); +} + +/* Add PATHS to the global import lookup path. */ + +static void +add_globalpaths (Strings *paths) +{ + if (paths) + { + if (!global.path) + global.path = new Strings (); + + for (size_t i = 0; i < paths->dim; i++) + { + const char *path = (*paths)[i]; + const char *target = lrealpath (path); + + if (target == NULL || !FileName::exists (target)) + { + if (target) + free (CONST_CAST (char *, target)); + continue; + } + + global.path->push (target); + } + } +} + +/* Add PATHS to the global file import lookup path. */ + +static void +add_filepaths (Strings *paths) +{ + if (paths) + { + if (!global.filePath) + global.filePath = new Strings (); + + for (size_t i = 0; i < paths->dim; i++) + { + const char *path = (*paths)[i]; + const char *target = lrealpath (path); + + if (!FileName::exists (target)) + { + free (CONST_CAST (char *, target)); + continue; + } + + global.filePath->push (target); + } + } +} + +/* Add all search directories to compiler runtime. + if STDINC, also include standard library paths. */ + +void +add_import_paths (const char *iprefix, const char *imultilib, bool stdinc) +{ + if (stdinc) + { + for (const default_include *p = cpp_include_defaults; p->fname; p++) + { + char *path; + + /* Ignore C++ paths. */ + if (p->cplusplus) + continue; + + if (!p->add_sysroot) + path = prefixed_path (p->fname, iprefix); + else + path = xstrdup (p->fname); + + /* Add D-specific suffix. */ + path = concat (path, "/d", NULL); + + /* Ignore duplicate entries. */ + bool found = false; + for (size_t i = 0; i < global.params.imppath->dim; i++) + { + if (strcmp (path, (*global.params.imppath)[i]) == 0) + { + found = true; + break; + } + } + + if (found) + { + free (path); + continue; + } + + /* Multilib support. */ + if (imultilib) + { + char *target_path = concat (path, "/", imultilib, NULL); + global.params.imppath->shift (target_path); + } + + global.params.imppath->shift (path); + } + } + + /* Add import search paths. */ + if (global.params.imppath) + { + for (size_t i = 0; i < global.params.imppath->dim; i++) + { + const char *path = (*global.params.imppath)[i]; + if (path) + add_globalpaths (FileName::splitPath (path)); + } + } + + /* Add string import search paths. */ + if (global.params.fileImppath) + { + for (size_t i = 0; i < global.params.fileImppath->dim; i++) + { + const char *path = (*global.params.fileImppath)[i]; + if (path) + add_filepaths (FileName::splitPath (path)); + } + } +} +