Skip to content

Commit be494d0

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 8958117 commit be494d0

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
@@ -19,6 +19,7 @@
1919
#include "Linux.h"
2020
#include "clang/Config/config.h" // for GCC_INSTALL_PREFIX
2121
#include "clang/Driver/Compilation.h"
22+
#include "clang/Driver/Distro.h"
2223
#include "clang/Driver/Driver.h"
2324
#include "clang/Driver/DriverDiagnostic.h"
2425
#include "clang/Driver/MultilibBuilder.h"
@@ -2860,6 +2861,7 @@ void Generic_GCC::GCCInstallationDetector::ScanLibDirForGCCTriple(
28602861
const llvm::Triple &TargetTriple, const ArgList &Args,
28612862
const std::string &LibDir, StringRef CandidateTriple,
28622863
bool NeedsBiarchSuffix, bool GCCDirExists, bool GCCCrossDirExists) {
2864+
Distro Distro(D.getVFS(), TargetTriple);
28632865
// Locations relative to the system lib directory where GCC's triple-specific
28642866
// directories might reside.
28652867
struct GCCLibSuffix {
@@ -2871,19 +2873,20 @@ void Generic_GCC::GCCInstallationDetector::ScanLibDirForGCCTriple(
28712873
// Whether this library suffix is relevant for the triple.
28722874
bool Active;
28732875
} Suffixes[] = {
2874-
// This is the normal place.
2875-
{"gcc/" + CandidateTriple.str(), "../..", GCCDirExists},
2876-
2877-
// Debian puts cross-compilers in gcc-cross.
2878-
{"gcc-cross/" + CandidateTriple.str(), "../..", GCCCrossDirExists},
2879-
28802876
// The Freescale PPC SDK has the gcc libraries in
28812877
// <sysroot>/usr/lib/<triple>/x.y.z so have a look there as well. Only do
28822878
// this on Freescale triples, though, since some systems put a *lot* of
28832879
// files in that location, not just GCC installation data.
28842880
{CandidateTriple.str(), "..",
28852881
TargetTriple.getVendor() == llvm::Triple::Freescale ||
2886-
TargetTriple.getVendor() == llvm::Triple::OpenEmbedded}};
2882+
TargetTriple.getVendor() == llvm::Triple::OpenEmbedded ||
2883+
Distro.IsOpenEmbedded()},
2884+
2885+
// This is the normal place.
2886+
{"gcc/" + CandidateTriple.str(), "../..", GCCDirExists},
2887+
2888+
// Debian puts cross-compilers in gcc-cross.
2889+
{"gcc-cross/" + CandidateTriple.str(), "../..", GCCCrossDirExists}};
28872890

28882891
for (auto &Suffix : Suffixes) {
28892892
if (!Suffix.Active)
@@ -3274,8 +3277,11 @@ Generic_GCC::addLibCxxIncludePaths(const llvm::opt::ArgList &DriverArgs,
32743277
// incompatible with the NDK libraries.
32753278
SmallString<128> DriverIncludeDir(getDriver().Dir);
32763279
llvm::sys::path::append(DriverIncludeDir, "..", "include");
3280+
3281+
// do not add it when --sysroot is specified, since it would expect
3282+
// libc++ headers from sysroot and not relative to compiler install location
32773283
if (AddIncludePath(DriverIncludeDir,
3278-
/*TargetDirRequired=*/getTriple().isAndroid()))
3284+
/*TargetDirRequired=*/getTriple().isAndroid() | !computeSysRoot().empty()))
32793285
return;
32803286
// If this is a development, non-installed, clang, libcxx will
32813287
// not be found at ../include/c++ but it likely to be found at

0 commit comments

Comments
 (0)