Skip to content

Commit b4334f5

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 8068286 commit b4334f5

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 "clang/Config/config.h" // for GCC_INSTALL_PREFIX
1919
#include "clang/Driver/CommonArgs.h"
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"
@@ -2798,6 +2799,7 @@ void Generic_GCC::GCCInstallationDetector::ScanLibDirForGCCTriple(
27982799
const llvm::Triple &TargetTriple, const ArgList &Args,
27992800
const std::string &LibDir, StringRef CandidateTriple,
28002801
bool NeedsBiarchSuffix, bool GCCDirExists, bool GCCCrossDirExists) {
2802+
Distro Distro(D.getVFS(), TargetTriple);
28012803
// Locations relative to the system lib directory where GCC's triple-specific
28022804
// directories might reside.
28032805
struct GCCLibSuffix {
@@ -2809,19 +2811,20 @@ void Generic_GCC::GCCInstallationDetector::ScanLibDirForGCCTriple(
28092811
// Whether this library suffix is relevant for the triple.
28102812
bool Active;
28112813
} Suffixes[] = {
2812-
// This is the normal place.
2813-
{"gcc/" + CandidateTriple.str(), "../..", GCCDirExists},
2814-
2815-
// Debian puts cross-compilers in gcc-cross.
2816-
{"gcc-cross/" + CandidateTriple.str(), "../..", GCCCrossDirExists},
2817-
28182814
// The Freescale PPC SDK has the gcc libraries in
28192815
// <sysroot>/usr/lib/<triple>/x.y.z so have a look there as well. Only do
28202816
// this on Freescale triples, though, since some systems put a *lot* of
28212817
// files in that location, not just GCC installation data.
28222818
{CandidateTriple.str(), "..",
28232819
TargetTriple.getVendor() == llvm::Triple::Freescale ||
2824-
TargetTriple.getVendor() == llvm::Triple::OpenEmbedded}};
2820+
TargetTriple.getVendor() == llvm::Triple::OpenEmbedded ||
2821+
Distro.IsOpenEmbedded()},
2822+
2823+
// This is the normal place.
2824+
{"gcc/" + CandidateTriple.str(), "../..", GCCDirExists},
2825+
2826+
// Debian puts cross-compilers in gcc-cross.
2827+
{"gcc-cross/" + CandidateTriple.str(), "../..", GCCCrossDirExists}};
28252828

28262829
for (auto &Suffix : Suffixes) {
28272830
if (!Suffix.Active)
@@ -3212,8 +3215,11 @@ Generic_GCC::addLibCxxIncludePaths(const llvm::opt::ArgList &DriverArgs,
32123215
// incompatible with the NDK libraries.
32133216
SmallString<128> DriverIncludeDir(getDriver().Dir);
32143217
llvm::sys::path::append(DriverIncludeDir, "..", "include");
3218+
3219+
// do not add it when --sysroot is specified, since it would expect
3220+
// libc++ headers from sysroot and not relative to compiler install location
32153221
if (AddIncludePath(DriverIncludeDir,
3216-
/*TargetDirRequired=*/getTriple().isAndroid()))
3222+
/*TargetDirRequired=*/getTriple().isAndroid() | !computeSysRoot().empty()))
32173223
return;
32183224
// If this is a development, non-installed, clang, libcxx will
32193225
// not be found at ../include/c++ but it likely to be found at

0 commit comments

Comments
 (0)