]> granicus.if.org Git - clang/commitdiff
[Driver] Use the parent_path of the clang executable as the default InstalledDir
authorBenjamin Kramer <benny.kra@googlemail.com>
Tue, 13 Oct 2015 15:19:32 +0000 (15:19 +0000)
committerBenjamin Kramer <benny.kra@googlemail.com>
Tue, 13 Oct 2015 15:19:32 +0000 (15:19 +0000)
This is what most people want anyways. Clang -cc1's main() will override
this but for other tools this is the most sensible default and avoids
some work.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@250164 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Driver/Driver.cpp
unittests/Driver/ToolChainTest.cpp

index 025e2de2603d8559885ce69f2bb8c50d716c2bc6..dc95ed2e9c260b83fdbea3f400a3e3ad7e6b2264 100644 (file)
@@ -65,6 +65,7 @@ Driver::Driver(StringRef ClangExecutable, StringRef DefaultTargetTriple,
 
   Name = llvm::sys::path::filename(ClangExecutable);
   Dir = llvm::sys::path::parent_path(ClangExecutable);
+  InstalledDir = Dir; // Provide a sensible default installed dir.
 
   // Compute the path to the resource directory.
   StringRef ClangResourceDir(CLANG_RESOURCE_DIR);
index a2d6f29e126de0647cd9a1e044f8453f6e560767..5159e80cc7a12502a6ce23937da8f51f4021be7c 100644 (file)
@@ -33,12 +33,12 @@ TEST(ToolChainTest, VFSGCCInstallation) {
   DiagnosticsEngine Diags(DiagID, &*DiagOpts, new TestDiagnosticConsumer);
   IntrusiveRefCntPtr<vfs::InMemoryFileSystem> InMemoryFileSystem(
       new vfs::InMemoryFileSystem);
-  Driver TheDriver("/usr/bin/clang", "arm-linux-gnueabihf", Diags,
+  Driver TheDriver("/bin/clang", "arm-linux-gnueabihf", Diags,
                    InMemoryFileSystem);
 
   const char *EmptyFiles[] = {
       "foo.cpp",
-      "/usr/bin/clang",
+      "/bin/clang",
       "/usr/lib/gcc/arm-linux-gnueabi/4.6.1/crtbegin.o",
       "/usr/lib/gcc/arm-linux-gnueabi/4.6.1/crtend.o",
       "/usr/lib/gcc/arm-linux-gnueabihf/4.6.3/crtbegin.o",
@@ -78,4 +78,43 @@ TEST(ToolChainTest, VFSGCCInstallation) {
       S);
 }
 
+TEST(ToolChainTest, VFSGCCInstallationRelativeDir) {
+  IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts = new DiagnosticOptions();
+
+  IntrusiveRefCntPtr<DiagnosticIDs> DiagID(new DiagnosticIDs());
+  struct TestDiagnosticConsumer : public DiagnosticConsumer {};
+  DiagnosticsEngine Diags(DiagID, &*DiagOpts, new TestDiagnosticConsumer);
+  IntrusiveRefCntPtr<vfs::InMemoryFileSystem> InMemoryFileSystem(
+      new vfs::InMemoryFileSystem);
+  Driver TheDriver("/home/test/bin/clang", "arm-linux-gnueabi", Diags,
+                   InMemoryFileSystem);
+
+  const char *EmptyFiles[] = {
+      "foo.cpp", "/home/test/lib/gcc/arm-linux-gnueabi/4.6.1/crtbegin.o",
+      "/home/test/include/arm-linux-gnueabi/.keep"};
+
+  for (const char *Path : EmptyFiles)
+    InMemoryFileSystem->addFile(Path, 0,
+                                llvm::MemoryBuffer::getMemBuffer("\n"));
+
+  std::unique_ptr<Compilation> C(
+      TheDriver.BuildCompilation({"-fsyntax-only", "foo.cpp"}));
+
+  std::string S;
+  {
+    llvm::raw_string_ostream OS(S);
+    C->getDefaultToolChain().printVerboseInfo(OS);
+  }
+#if LLVM_ON_WIN32
+  std::replace(S.begin(), S.end(), '\\', '/');
+#endif
+  EXPECT_EQ("Found candidate GCC installation: "
+            "/home/test/lib/gcc/arm-linux-gnueabi/4.6.1\n"
+            "Selected GCC installation: "
+            "/home/test/bin/../lib/gcc/arm-linux-gnueabi/4.6.1\n"
+            "Candidate multilib: .;@m32\n"
+            "Selected multilib: .;@m32\n",
+            S);
+}
+
 } // end anonymous namespace