Skip to content

Commit b67ebf0

Browse files
committed
clang: Define / releative gcc installation dir
This is required for OE gcc installation to work. Without this its not able to find the paths for libgcc and other standard headers and libraries from gcc installation in OE * Do not use install relative libc++ headers In OE we use same clang for native and cross builds, therefore we need to ensure that native sysroot install of libc++ is not searched for headers when doing cross compile instead it searches the target sysroot this is especially troublesome when libcxx-native is staged along with libcxx e.g. chromium * Fix lib paths for OpenEmbedded Host Under OpenEmbedded Host, while building with clang-native, it cannot find the GCCInstallPath, which causing following error: [snip] compiler-rt-native/13.0.1-r0/recipe-sysroot-native/usr/bin/clang -target x86_64-linux -isystem/path/to/x86_64-linux/compiler-rt-native/13.0.1-r0/recipe-sysroot-native/usr/include -O2 -pipe /path/to/compiler-rt-native/13.0.1-r0/recipe-sysroot-native/usr/share/cmake-3.21/Modules/CMakeCCompilerABI.c` hosttools/ld: cannot find crtbeginS.o: No such file or directory [snip] Before this patch: compiler-rt-native/13.0.1-r0/recipe-sysroot-native/usr/bin/clang clang version 13.0.1 (https://github.com/llvm/llvm-project 08e3a5c) Target: x86_64-unknown-linux-gnu Thread model: posix InstalledDir: /build/tmp-glibc/work/x86_64-linux/compiler-rt-native/13.0.1-r0/recipe-sysroot-native/usr/bin Found candidate GCC installation: /usr/lib/gcc/x86_64-wrs-linux/10.2.0 After this patch: compiler-rt-native/13.0.1-r0/recipe-sysroot-native/usr/bin/clang clang version 13.0.1 (https://github.com/llvm/llvm-project 08e3a5c) Thread model: posix InstalledDir: /build/tmp-glibc/work/x86_64-linux/compiler-rt-native/13.0.1-r0/recipe-sysroot-native/usr/bin Found candidate GCC installation: /usr/lib/gcc/x86_64-wrs-linux/10.2.0 Found candidate GCC installation: /usr/lib/x86_64-wrs-linux/10.2.0 Selected GCC installation: /usr/lib/x86_64-wrs-linux/10.2.0 Candidate multilib: .;@m64 Selected multilib: .;@m64 For OpenEmbedded Host, sysroots are of the form<sysroot>/usr/lib/<triple>/x.y.z. Take x86-64 as example, the default triple is x86_64-unknown-linux-gnu. For clang-native, the target vendor is '-unknown', need to test current distro to follow above form. Upstream-Status: Inappropriate [oe specific] Signed-off-by: Changqing Li <changqing.li@windriver.com> Signed-off-by: Khem Raj <raj.khem@gmail.com>
1 parent 1a594a4 commit b67ebf0

File tree

1 file changed

+14
-8
lines changed

1 file changed

+14
-8
lines changed

clang/lib/Driver/ToolChains/Gnu.cpp

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
#include "CommonArgs.h"
1919
#include "clang/Config/config.h" // for GCC_INSTALL_PREFIX
2020
#include "clang/Driver/Compilation.h"
21+
#include "clang/Driver/Distro.h"
2122
#include "clang/Driver/Driver.h"
2223
#include "clang/Driver/MultilibBuilder.h"
2324
#include "clang/Driver/Options.h"
@@ -2866,6 +2867,7 @@ void Generic_GCC::GCCInstallationDetector::ScanLibDirForGCCTriple(
28662867
const llvm::Triple &TargetTriple, const ArgList &Args,
28672868
const std::string &LibDir, StringRef CandidateTriple,
28682869
bool NeedsBiarchSuffix, bool GCCDirExists, bool GCCCrossDirExists) {
2870+
Distro Distro(D.getVFS(), TargetTriple);
28692871
// Locations relative to the system lib directory where GCC's triple-specific
28702872
// directories might reside.
28712873
struct GCCLibSuffix {
@@ -2877,19 +2879,20 @@ void Generic_GCC::GCCInstallationDetector::ScanLibDirForGCCTriple(
28772879
// Whether this library suffix is relevant for the triple.
28782880
bool Active;
28792881
} Suffixes[] = {
2880-
// This is the normal place.
2881-
{"gcc/" + CandidateTriple.str(), "../..", GCCDirExists},
2882-
2883-
// Debian puts cross-compilers in gcc-cross.
2884-
{"gcc-cross/" + CandidateTriple.str(), "../..", GCCCrossDirExists},
2885-
28862882
// The Freescale PPC SDK has the gcc libraries in
28872883
// <sysroot>/usr/lib/<triple>/x.y.z so have a look there as well. Only do
28882884
// this on Freescale triples, though, since some systems put a *lot* of
28892885
// files in that location, not just GCC installation data.
28902886
{CandidateTriple.str(), "..",
28912887
TargetTriple.getVendor() == llvm::Triple::Freescale ||
2892-
TargetTriple.getVendor() == llvm::Triple::OpenEmbedded}};
2888+
TargetTriple.getVendor() == llvm::Triple::OpenEmbedded ||
2889+
Distro.IsOpenEmbedded()},
2890+
2891+
// This is the normal place.
2892+
{"gcc/" + CandidateTriple.str(), "../..", GCCDirExists},
2893+
2894+
// Debian puts cross-compilers in gcc-cross.
2895+
{"gcc-cross/" + CandidateTriple.str(), "../..", GCCCrossDirExists}};
28932896

28942897
for (auto &Suffix : Suffixes) {
28952898
if (!Suffix.Active)
@@ -3280,8 +3283,11 @@ Generic_GCC::addLibCxxIncludePaths(const llvm::opt::ArgList &DriverArgs,
32803283
// incompatible with the NDK libraries.
32813284
SmallString<128> DriverIncludeDir(getDriver().Dir);
32823285
llvm::sys::path::append(DriverIncludeDir, "..", "include");
3286+
3287+
// do not add it when --sysroot is specified, since it would expect
3288+
// libc++ headers from sysroot and not relative to compiler install location
32833289
if (AddIncludePath(DriverIncludeDir,
3284-
/*TargetDirRequired=*/getTriple().isAndroid()))
3290+
/*TargetDirRequired=*/getTriple().isAndroid() | !computeSysRoot().empty()))
32853291
return;
32863292
// If this is a development, non-installed, clang, libcxx will
32873293
// not be found at ../include/c++ but it likely to be found at

0 commit comments

Comments
 (0)