From: Chris Lattner Date: Mon, 3 Mar 2008 03:16:03 +0000 (+0000) Subject: Find clang headers in the clang headers dir, search it before X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=dcaa0962401a59c5888a12f6e00e27f5e1d29c5b;p=clang Find clang headers in the clang headers dir, search it before the system headers dir. This produces an annoying warning: clang.cpp:883: warning: ISO C++ forbids casting between pointer-to-function and pointer-to-object I'm not sure how to remove it. :( git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@47836 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/Driver/clang.cpp b/Driver/clang.cpp index 36a7f16d7c..0f6e7fad57 100644 --- a/Driver/clang.cpp +++ b/Driver/clang.cpp @@ -43,6 +43,7 @@ #include "llvm/System/Signals.h" #include "llvm/Config/config.h" #include "llvm/ADT/OwningPtr.h" +#include "llvm/System/Path.h" #include #include using namespace clang; @@ -805,8 +806,8 @@ static void AddEnvVarPaths(const char *Name, HeaderSearch &Headers) { /// InitializeIncludePaths - Process the -I options and set them in the /// HeaderSearch object. -static void InitializeIncludePaths(HeaderSearch &Headers, FileManager &FM, - const LangOptions &Lang) { +static void InitializeIncludePaths(const char *Argv0, HeaderSearch &Headers, + FileManager &FM, const LangOptions &Lang) { // Handle -F... options. for (unsigned i = 0, e = F_dirs.size(); i != e; ++i) AddPath(F_dirs[i], Angled, false, true, true, Headers); @@ -877,6 +878,16 @@ static void InitializeIncludePaths(HeaderSearch &Headers, FileManager &FM, else AddEnvVarPaths("C_INCLUDE_PATH", Headers); + // Add the clang headers, which are relative to the clang driver. + llvm::sys::Path MainExecutablePath = + llvm::sys::Path::GetMainExecutable(Argv0, (void*)InitializeIncludePaths); + if (!MainExecutablePath.isEmpty()) { + MainExecutablePath.eraseComponent(); // Remove /clang from foo/bin/clang + MainExecutablePath.eraseComponent(); // Remove /bin from foo/bin + MainExecutablePath.appendComponent("Headers"); // Get foo/Headers + AddPath(MainExecutablePath.c_str(), System, false, false, false, Headers); + } + // FIXME: temporary hack: hard-coded paths. // FIXME: get these from the target? if (!nostdinc) { @@ -1230,7 +1241,7 @@ static bool isSerializedFile(const std::string& InFile) { int main(int argc, char **argv) { - llvm::cl::ParseCommandLineOptions(argc, argv, " llvm cfe\n"); + llvm::cl::ParseCommandLineOptions(argc, argv, " llvm clang cfe\n"); llvm::sys::PrintStackTraceOnErrorSignal(); // If no input was specified, read from stdin. @@ -1290,7 +1301,7 @@ int main(int argc, char **argv) { // Process the -I options and set them in the HeaderInfo. HeaderSearch HeaderInfo(FileMgr); DiagClient->setHeaderSearch(HeaderInfo); - InitializeIncludePaths(HeaderInfo, FileMgr, LangInfo); + InitializeIncludePaths(argv[0], HeaderInfo, FileMgr, LangInfo); // Get information about the targets being compiled for. Note that this // pointer and the TargetInfoImpl objects are never deleted by this toy