Hi Chandler, Fixing include paths is not enough - you should also fix library lookup paths for dynamic linker in Clang driver. Currently if the build tree has both Clang binary and built libc++ like this: <...>/bin/clang++ <...>/lib/libc++.so
Clang binary is not able to locate libc++.so with -stdlib=libc++ provided. Therefore the following brute-force bootstrap process wouldn't work: (1) configure a new build tree with default options and build Clang and libc++ (2) configure a new build tree with just-built Clang as c/c++ compiler and specify LLVM_ENABLE_LIBCXX=ON I'll try to take a closer look at this (and potentially fix the driver) tomorrow, unless someone who has more understanding picks it up from here. On Mon, Jan 20, 2014 at 1:42 PM, Chandler Carruth <[email protected]> wrote: > Author: chandlerc > Date: Mon Jan 20 03:42:24 2014 > New Revision: 199632 > > URL: http://llvm.org/viewvc/llvm-project?rev=199632&view=rev > Log: > Make the Linux support for finding libc++ somewhat less braindead. > > Now instead of just looking in the system root for it, we also look > relative to the clang binary's directory. This should "just work" in > almost all cases. I've added test cases accordingly. > > This is probably *very* worthwhile to backport to the 3.4 branch so that > folks can check it out, build it, and use that as their host compiler > going forward. > > Modified: > cfe/trunk/lib/Driver/ToolChains.cpp > cfe/trunk/test/Driver/linux-header-search.cpp > > Modified: cfe/trunk/lib/Driver/ToolChains.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/ToolChains.cpp?rev=199632&r1=199631&r2=199632&view=diff > ============================================================================== > --- cfe/trunk/lib/Driver/ToolChains.cpp (original) > +++ cfe/trunk/lib/Driver/ToolChains.cpp Mon Jan 20 03:42:24 2014 > @@ -2945,9 +2945,24 @@ void Linux::AddClangCXXStdlibIncludeArgs > > // Check if libc++ has been enabled and provide its include paths if so. > if (GetCXXStdlibType(DriverArgs) == ToolChain::CST_Libcxx) { > - // libc++ is always installed at a fixed path on Linux currently. > - addSystemInclude(DriverArgs, CC1Args, > - getDriver().SysRoot + "/usr/include/c++/v1"); > + const std::string LibCXXIncludePathCandidates[] = { > + // The primary location is within the Clang installation. > + // FIXME: We shouldn't hard code 'v1' here to make Clang future proof > to > + // newer ABI versions. > + getDriver().Dir + "/../include/c++/v1", > + > + // We also check the system as for a long time this is the only place > Clang looked. > + // FIXME: We should really remove this. It doesn't make any sense. > + getDriver().SysRoot + "/usr/include/c++/v1" > + }; > + for (unsigned i = 0; i < > llvm::array_lengthof(LibCXXIncludePathCandidates); > + ++i) { > + if (!llvm::sys::fs::exists(LibCXXIncludePathCandidates[i])) > + continue; > + // Add the first candidate that exists. > + addSystemInclude(DriverArgs, CC1Args, LibCXXIncludePathCandidates[i]); > + break; > + } > return; > } > > @@ -2971,7 +2986,7 @@ void Linux::AddClangCXXStdlibIncludeArgs > MIPSABIDirSuffix, DriverArgs, CC1Args)) > return; > > - const std::string IncludePathCandidates[] = { > + const std::string LibStdCXXIncludePathCandidates[] = { > // Gentoo is weird and places its headers inside the GCC install, so if > the > // first attempt to find the headers fails, try these patterns. > InstallDir.str() + "/include/g++-v" + Version.MajorStr + "." + > @@ -2984,8 +2999,9 @@ void Linux::AddClangCXXStdlibIncludeArgs > LibDir.str() + "/../include/c++", > }; > > - for (unsigned i = 0; i < llvm::array_lengthof(IncludePathCandidates); ++i) > { > - if (addLibStdCXXIncludePaths(IncludePathCandidates[i], > + for (unsigned i = 0; i < > llvm::array_lengthof(LibStdCXXIncludePathCandidates); > + ++i) { > + if (addLibStdCXXIncludePaths(LibStdCXXIncludePathCandidates[i], > TripleStr + MIPSABIDirSuffix + BiarchSuffix, > DriverArgs, CC1Args)) > break; > > Modified: cfe/trunk/test/Driver/linux-header-search.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/linux-header-search.cpp?rev=199632&r1=199631&r2=199632&view=diff > ============================================================================== > --- cfe/trunk/test/Driver/linux-header-search.cpp (original) > +++ cfe/trunk/test/Driver/linux-header-search.cpp Mon Jan 20 03:42:24 2014 > @@ -1,6 +1,29 @@ > // General tests that the header search paths detected by the driver and > passed > // to CC1 are sane. > // > +// Test a simulated installation of libc++ on Linux, both through sysroot and > +// the installation path of Clang. > +// RUN: %clang -no-canonical-prefixes %s -### -fsyntax-only 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" > +// RUN: %clang -no-canonical-prefixes %s -### -fsyntax-only 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" > +// > // Test a very broken version of multiarch that shipped in Ubuntu 11.04. > // RUN: %clang -no-canonical-prefixes %s -### -fsyntax-only 2>&1 \ > // RUN: -target i386-unknown-linux \ > > > _______________________________________________ > cfe-commits mailing list > [email protected] > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits -- Alexey Samsonov, MSK _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
