]> granicus.if.org Git - clang/commitdiff
Add initial support for applying the sysroot to library search paths.
authorChandler Carruth <chandlerc@gmail.com>
Mon, 3 Oct 2011 06:41:08 +0000 (06:41 +0000)
committerChandler Carruth <chandlerc@gmail.com>
Mon, 3 Oct 2011 06:41:08 +0000 (06:41 +0000)
This is still very much a WIP, but sysroot was completely broken before
this so we are moving closer to correctness.

The crux of this is that 'ld' (on Linux, the only place I'm touching
here) doesn't apply the sysroot to any flags given to it. Instead, the
driver must translate all the paths it adds to the link step with the
system root. This is easily observed by building a GCC that supports
sysroot, and checking its driver output.

This patch just fixes the non-multilib library search paths. We should
also use this in many other places, but first things first.

This also allows us to make the Linux 'ld' test independent of the host
system. This in turn will allow me to check in test tree configurations
based on various different distro's configuration. Again, WIP.

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

lib/Driver/ToolChains.cpp
test/Driver/Inputs/basic_linux_tree/lib/.keep [new file with mode: 0644]
test/Driver/Inputs/basic_linux_tree/usr/lib/.keep [new file with mode: 0644]
test/Driver/linux-ld.c

index 1b2ff2ecb7374327bcb67e0c1412d45156f37b09..dd35172402cba8a973998cb672c2d1153e88946e 100644 (file)
@@ -1560,6 +1560,7 @@ Linux::Linux(const HostInfo &Host, const llvm::Triple &Triple)
   : Generic_ELF(Host, Triple) {
   llvm::Triple::ArchType Arch =
     llvm::Triple(getDriver().DefaultHostTriple).getArch();
+  const std::string &SysRoot = getDriver().SysRoot;
 
   bool Exists;
   std::string GccTriple = "";
@@ -1703,8 +1704,8 @@ Linux::Linux(const HostInfo &Host, const llvm::Triple &Triple)
                       Multilib, Paths);
       addPathIfExists(Base + "/../../../../" + Multilib, Paths);
     }
-    addPathIfExists("/lib/../" + Multilib, Paths);
-    addPathIfExists("/usr/lib/../" + Multilib, Paths);
+    addPathIfExists(SysRoot + "/lib/../" + Multilib, Paths);
+    addPathIfExists(SysRoot + "/usr/lib/../" + Multilib, Paths);
   }
 
   // Add the non-multiplib suffixed paths (if potentially different).
@@ -1714,11 +1715,11 @@ Linux::Linux(const HostInfo &Host, const llvm::Triple &Triple)
     addPathIfExists(Base + "/../../../../" + GccTriple + "/lib", Paths);
     addPathIfExists(Base + "/../../..", Paths);
   }
-  addPathIfExists("/lib", Paths);
-  addPathIfExists("/usr/lib", Paths);
+  addPathIfExists(SysRoot + "/lib", Paths);
+  addPathIfExists(SysRoot + "/usr/lib", Paths);
 
   if (Arch == getArch() && IsUbuntu(Distro))
-    Paths.push_back("/usr/lib/" + GccTriple);
+    Paths.push_back(SysRoot + "/usr/lib/" + GccTriple);
 }
 
 bool Linux::HasNativeLLVMSupport() const {
diff --git a/test/Driver/Inputs/basic_linux_tree/lib/.keep b/test/Driver/Inputs/basic_linux_tree/lib/.keep
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/test/Driver/Inputs/basic_linux_tree/usr/lib/.keep b/test/Driver/Inputs/basic_linux_tree/usr/lib/.keep
new file mode 100644 (file)
index 0000000..e69de29
index 745b03c7a6a3890c1eead892b932c47ba4fe91a0..8896afc5e8cf1d3303fc740ee9af1dd3334f7f22 100644 (file)
@@ -1,9 +1,16 @@
-// General tests that ld invocations on Linux targets sane.
+// General tests that ld invocations on Linux targets sane. Note that we use
+// sysroot to make these tests independent of the host system.
 //
-// RUN: %clang -no-canonical-prefixes -ccc-host-triple i386-unknown-linux %s -### -o %t.o 2>&1 \
+// RUN: %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \
+// RUN:     -ccc-host-triple i386-unkown-linux \
+// RUN:     --sysroot=%S/Inputs/basic_linux_tree \
 // RUN:   | FileCheck --check-prefix=CHECK-LD-32 %s
-// CHECK-LD-32: "{{.*}}ld{{(.exe)?}}" {{.*}} "-L/lib" "-L/usr/lib"
+// CHECK-LD-32: "{{.*}}ld{{(.exe)?}}" "--sysroot=[[SYSROOT:[^"]+]]"
+// CHECK-LD-32: {{.*}} "-L[[SYSROOT]]/lib" "-L[[SYSROOT]]/usr/lib"
 //
-// RUN: %clang -no-canonical-prefixes -ccc-host-triple x86_64-unknown-linux %s -### -o %t.o 2>&1 \
+// RUN: %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \
+// RUN:     -ccc-host-triple x86_64-unknown-linux \
+// RUN:     --sysroot=%S/Inputs/basic_linux_tree \
 // RUN:   | FileCheck --check-prefix=CHECK-LD-64 %s
-// CHECK-LD-64: "{{.*}}ld{{(.exe)?}}" {{.*}} "-L/lib" "-L/usr/lib"
+// CHECK-LD-64: "{{.*}}ld{{(.exe)?}}" "--sysroot=[[SYSROOT:[^"]+]]"
+// CHECK-LD-64: {{.*}} "-L[[SYSROOT]]/lib" "-L[[SYSROOT]]/usr/lib"