r199769 - Teach Clang to look in its installation libdir for libraries (such as

Alexey Samsonov samsonov at google.com
Mon Jan 27 06:15:29 PST 2014


Thanks! FTR, I still can't use libc++ from the Clang build directory due to
problems described in http://llvm.org/bugs/show_bug.cgi?id=18569


On Wed, Jan 22, 2014 at 2:49 AM, Chandler Carruth <chandlerc at gmail.com>wrote:

> Author: chandlerc
> Date: Tue Jan 21 16:49:05 2014
> New Revision: 199769
>
> URL: http://llvm.org/viewvc/llvm-project?rev=199769&view=rev
> Log:
> Teach Clang to look in its installation libdir for libraries (such as
> libc++) when the installation is within the system root.
>
> This doesn't really help cross compiles much, but we don't (currently)
> have a great story around libc++, cross compiles, and who is responsible
> for building and/or installing the libraries. However, it handles the
> very common case of non-cross builds in a way entirely consistent with
> GCC, so I'm hopeful this won't really hose anyone.
>
> This is the second patch that I think should be backported to 3.4 to
> give folks an easy to checkout and install working Clang+libc++
> toolchain.
>
> Modified:
>     cfe/trunk/lib/Driver/ToolChains.cpp
>     cfe/trunk/test/Driver/linux-ld.c
>
> Modified: cfe/trunk/lib/Driver/ToolChains.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/ToolChains.cpp?rev=199769&r1=199768&r2=199769&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/Driver/ToolChains.cpp (original)
> +++ cfe/trunk/lib/Driver/ToolChains.cpp Tue Jan 21 16:49:05 2014
> @@ -2695,6 +2695,17 @@ Linux::Linux(const Driver &D, const llvm
>        addPathIfExists(LibPath + "/../" + Multilib, Paths);
>      }
>    }
> +
> +  // Similar to the logic for GCC above, if we currently running Clang
> inside
> +  // of the requested system root, add its parent multilib library paths
> to
> +  // those searched.
> +  // FIXME: It's not clear whether we should use the driver's installed
> +  // directory ('Dir' below) or the ResourceDir.
> +  if (StringRef(D.Dir).startswith(SysRoot)) {
> +    addPathIfExists(D.Dir + "/../lib/" + MultiarchTriple, Paths);
> +    addPathIfExists(D.Dir + "/../" + Multilib, Paths);
> +  }
> +
>    addPathIfExists(SysRoot + "/lib/" + MultiarchTriple, Paths);
>    addPathIfExists(SysRoot + "/lib/../" + Multilib, Paths);
>    addPathIfExists(SysRoot + "/usr/lib/" + MultiarchTriple, Paths);
> @@ -2723,6 +2734,15 @@ Linux::Linux(const Driver &D, const llvm
>      if (StringRef(LibPath).startswith(SysRoot))
>        addPathIfExists(LibPath, Paths);
>    }
> +
> +  // Similar to the logic for GCC above, if we are currently running Clang
> +  // inside of the requested system root, add its parent library path to
> those
> +  // searched.
> +  // FIXME: It's not clear whether we should use the driver's installed
> +  // directory ('Dir' below) or the ResourceDir.
> +  if (StringRef(D.Dir).startswith(SysRoot))
> +    addPathIfExists(D.Dir + "/../lib", Paths);
> +
>    addPathIfExists(SysRoot + "/lib", Paths);
>    addPathIfExists(SysRoot + "/usr/lib", Paths);
>  }
>
> Modified: cfe/trunk/test/Driver/linux-ld.c
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/linux-ld.c?rev=199769&r1=199768&r2=199769&view=diff
>
> ==============================================================================
> --- cfe/trunk/test/Driver/linux-ld.c (original)
> +++ cfe/trunk/test/Driver/linux-ld.c Tue Jan 21 16:49:05 2014
> @@ -214,6 +214,32 @@
>  // CHECK-GCC-VERSION4:
> "{{.*}}/Inputs/gcc_version_parsing4/bin/../lib/gcc/i386-unknown-linux/4.7.99{{/|\\\\}}crtbegin.o"
>  // CHECK-GCC-VERSION4:
> "-L{{.*}}/Inputs/gcc_version_parsing4/bin/../lib/gcc/i386-unknown-linux/4.7.99"
>  //
> +// Test a simulated installation of libc++ on Linux, both through sysroot
> and
> +// the installation path of Clang.
> +// RUN: %clangxx -no-canonical-prefixes -x c++ %s -### -o %t.o 2>&1 \
> +// RUN:     -target x86_64-unknown-linux-gnu \
> +// RUN:     -stdlib=libc++ \
> +// RUN:     -ccc-install-dir %S/Inputs/basic_linux_tree/usr/bin \
> +// RUN:     --sysroot=%S/Inputs/basic_linux_libcxx_tree \
> +// RUN:   | FileCheck --check-prefix=CHECK-BASIC-LIBCXX-SYSROOT %s
> +// CHECK-BASIC-LIBCXX-SYSROOT: "{{[^"]*}}clang{{[^"]*}}" "-cc1"
> +// CHECK-BASIC-LIBCXX-SYSROOT: "-isysroot" "[[SYSROOT:[^"]+]]"
> +// CHECK-BASIC-LIBCXX-SYSROOT: "-internal-isystem"
> "[[SYSROOT]]/usr/include/c++/v1"
> +// CHECK-BASIC-LIBCXX-SYSROOT: "-internal-isystem"
> "[[SYSROOT]]/usr/local/include"
> +// CHECK-BASIC-LIBCXX-SYSROOT: "--sysroot=[[SYSROOT]]"
> +// RUN: %clang -no-canonical-prefixes -x c++ %s -### -o %t.o 2>&1 \
> +// RUN:     -target x86_64-unknown-linux-gnu \
> +// RUN:     -stdlib=libc++ \
> +// RUN:     -ccc-install-dir %S/Inputs/basic_linux_libcxx_tree/usr/bin \
> +// RUN:     --sysroot=%S/Inputs/basic_linux_libcxx_tree \
> +// RUN:   | FileCheck --check-prefix=CHECK-BASIC-LIBCXX-INSTALL %s
> +// CHECK-BASIC-LIBCXX-INSTALL: "{{[^"]*}}clang{{[^"]*}}" "-cc1"
> +// CHECK-BASIC-LIBCXX-INSTALL: "-isysroot" "[[SYSROOT:[^"]+]]"
> +// CHECK-BASIC-LIBCXX-INSTALL: "-internal-isystem"
> "[[SYSROOT]]/usr/bin/../include/c++/v1"
> +// CHECK-BASIC-LIBCXX-INSTALL: "-internal-isystem"
> "[[SYSROOT]]/usr/local/include"
> +// CHECK-BASIC-LIBCXX-INSTALL: "--sysroot=[[SYSROOT]]"
> +// CHECK-BASIC-LIBCXX-INSTALL: "-L[[SYSROOT]]/usr/bin/../lib"
> +//
>  // Test a very broken version of multiarch that shipped in Ubuntu 11.04.
>  // RUN: %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \
>  // RUN:     --target=i386-unknown-linux \
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>



-- 
Alexey Samsonov, MSK
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20140127/8554e5d8/attachment.html>


More information about the cfe-commits mailing list