1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
| | Clang attempts to guess file names based on the OS and distro (yes!),
but unfortunately, that doesn't work for us.
This patch makes it easy to insert libc's $libdir so that Clang passes the
correct absolute file name of crt1.o etc. to 'ld'. It also disables all
the distro-specific stuff and removes the hard-coded FHS directory names
to make sure Clang also works on non-GuixSD systems.
This patch makes slight adjustments over "clang-libc-search-path.patch" for
changes in clang 3.8.
--- cfe-3.8.0.src/lib/Driver/ToolChains.cpp
+++ cfe-3.8.0.src/lib/Driver/ToolChains.cpp
@@ -3661,6 +3661,9 @@
GCCInstallation.getTriple().str() + "/bin")
.str());
+ // Comment out the distro-specific tweaks so that they don't bite when
+ // using Guix on a foreign distro.
+#if 0
Distro Distro = DetectDistro(D, Arch);
if (IsOpenSUSE(Distro) || IsUbuntu(Distro)) {
@@ -3702,6 +3705,7 @@
if (IsOpenSUSE(Distro))
ExtraOpts.push_back("--enable-new-dtags");
+#endif
// The selection of paths to try here is designed to match the patterns which
// the GCC driver itself uses, as this is part of the GCC-compatible driver.
@@ -3817,6 +3821,10 @@
addPathIfExists(D, SysRoot + "/lib", Paths);
addPathIfExists(D, SysRoot + "/usr/lib", Paths);
+
+ // Add libc's lib/ directory to the search path, so that crt1.o, crti.o,
+ // and friends can be found.
+ addPathIfExists(D, "@GLIBC_LIBDIR@", Paths);
}
bool Linux::HasNativeLLVMSupport() const { return true; }
@@ -4026,6 +4034,34 @@
addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + "/include");
addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + "/usr/include");
+
+ // Check for configure-time "extra" C include directories. When constructing a
+ // toolchain, @C_EXTRA_INCLUDE_DIRS@ should be replaced with something like a
+ // colon-separated string of the include dirs of libc and kernel headers.
+ //
+ // The reason why we use this mechanism instead of C_INCLUDE_DIRS above is
+ // because when a user supplies clang with --sysroot, the normal expectation
+ // is that clang will detect and add the proper $SYSROOT/$MULTIARCHINCL,
+ // $SYSROOT/include, and $SYSROOT/usr/include to its list of search paths.
+ // However, if C_INCLUDE_DIRS is not empty, this function will return early
+ // and not attempt to add the aforementioned search paths, which is not
+ // desirable.
+ //
+ // By adding our configure-time "extra" C include directories here, after
+ // we've added $SYSROOT/include and $SYSROOT/usr/include, we make sure that IF
+ // --sysroot is supplied on the command line, we pick up the expected search
+ // paths in the $SYSROOT, and that they come before our configure-time "extra"
+ // C include directories.
+ StringRef CExtraIncludeDirs("@C_EXTRA_INCLUDE_DIRS@");
+ if (CExtraIncludeDirs != "") {
+ SmallVector<StringRef, 5> dirs;
+ CExtraIncludeDirs.split(dirs, ":");
+ for (StringRef dir : dirs) {
+ StringRef Prefix =
+ llvm::sys::path::is_absolute(dir) ? StringRef(SysRoot) : "";
+ addExternCSystemInclude(DriverArgs, CC1Args, Prefix + dir);
+ }
+ }
}
|