GNU bug report logs - #31025
[core-updates] LLVM 6.0

Previous Next

Package: guix-patches;

Reported by: Marius Bakke <mbakke <at> fastmail.com>

Date: Mon, 2 Apr 2018 16:48:01 UTC

Severity: normal

Done: Marius Bakke <mbakke <at> fastmail.com>

Bug is archived. No further changes may be made.

To add a comment to this bug, you must first unarchive it, by sending
a message to control AT debbugs.gnu.org, with unarchive 31025 in the body.
You can then email your comments to 31025 AT debbugs.gnu.org in the normal way.

Toggle the display of automated, internal messages from the tracker.

View this report as an mbox folder, status mbox, maintainer mbox


Report forwarded to guix-patches <at> gnu.org:
bug#31025; Package guix-patches. (Mon, 02 Apr 2018 16:48:02 GMT) Full text and rfc822 format available.

Acknowledgement sent to Marius Bakke <mbakke <at> fastmail.com>:
New bug report received and forwarded. Copy sent to guix-patches <at> gnu.org. (Mon, 02 Apr 2018 16:48:03 GMT) Full text and rfc822 format available.

Message #5 received at submit <at> debbugs.gnu.org (full text, mbox):

From: Marius Bakke <mbakke <at> fastmail.com>
To: guix-patches <at> gnu.org
Subject: [core-updates] LLVM 6.0
Date: Mon, 02 Apr 2018 18:46:59 +0200
[Message part 1 (text/plain, inline)]
Hello!

This is an update for LLVM and Clang.  I haven't yet found a package
that actually works with this new version; the consumers I've tested
does not support LLVM >4.

However they can keep using the old version, and if there turns out to
be a problem with 6.0 we can fix it later since there are no dependents.

WDYT?

[0001-gnu-llvm-clang-Update-to-6.0.0.patch (text/x-patch, inline)]
From 28e48a152c99c4c0911c794dd449c4df5ed193f5 Mon Sep 17 00:00:00 2001
From: Marius Bakke <mbakke <at> fastmail.com>
Date: Sat, 31 Mar 2018 22:04:44 +0200
Subject: [PATCH] gnu: llvm, clang: Update to 6.0.0.

* gnu/packages/llvm.scm (llvm, clang-runtime, clang): Update to 6.0.0.
(clang-from-llvm)(patches): Set to empty list.
[arguments]: Set CLANG_RESOURCE_DIR in #:configure-flags.  Adjust
substitutions depending on major version.
(llvm-3.8, clang-runtime-3.8, clang-3.8): New public variables.
(clang-3.7, clang-3.6, clang-3.5)(patches): Add 'clang-3.5-libc-search-path.patch'.
(clang-3.9.1)(patches): Add 'clang-3.8-libc-search-path.patch'.
* gnu/packages/patches/clang-6.0-libc-search-path.patch: New file.
* gnu/packages/patches/clang-libc-search-path.patch: Rename to ...
* gnu/packages/patches/clang-3.5-libc-search-path.patch: ... this.
* gnu/local.mk (dist_patch_DATA): Adjust accordingly.

Add CLANG_RESOURCE_DIR (not sure if needed).
---
 gnu/local.mk                                       |   3 +-
 gnu/packages/llvm.scm                              | 100 +++++++++++++++------
 ...path.patch => clang-3.5-libc-search-path.patch} |   0
 .../patches/clang-6.0-libc-search-path.patch       |  67 ++++++++++++++
 4 files changed, 142 insertions(+), 28 deletions(-)
 rename gnu/packages/patches/{clang-libc-search-path.patch => clang-3.5-libc-search-path.patch} (100%)
 create mode 100644 gnu/packages/patches/clang-6.0-libc-search-path.patch

diff --git a/gnu/local.mk b/gnu/local.mk
index 2705fb37a..cf66d4bdf 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -590,8 +590,9 @@ dist_patch_DATA =						\
   %D%/packages/patches/ceph-skip-collect-sys-info-test.patch	\
   %D%/packages/patches/ceph-skip-unittest_blockdev.patch	\
   %D%/packages/patches/chmlib-inttypes.patch			\
-  %D%/packages/patches/clang-libc-search-path.patch		\
+  %D%/packages/patches/clang-3.5-libc-search-path.patch		\
   %D%/packages/patches/clang-3.8-libc-search-path.patch		\
+  %D%/packages/patches/clang-6.0-libc-search-path.patch		\
   %D%/packages/patches/clang-runtime-asan-build-fixes.patch	\
   %D%/packages/patches/clang-runtime-esan-build-fixes.patch	\
   %D%/packages/patches/classpath-aarch64-support.patch		\
diff --git a/gnu/packages/llvm.scm b/gnu/packages/llvm.scm
index 2dddbc436..6c20ce496 100644
--- a/gnu/packages/llvm.scm
+++ b/gnu/packages/llvm.scm
@@ -5,6 +5,7 @@
 ;;; Copyright © 2016 Dennis Mungai <dmngaie <at> gmail.com>
 ;;; Copyright © 2016 Ricardo Wurmus <rekado <at> elephly.net>
 ;;; Copyright © 2017 Roel Janssen <roel <at> gnu.org>
+;;; Copyright © 2018 Marius Bakke <mbakke <at> fastmail.com>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -40,7 +41,7 @@
 (define-public llvm
   (package
     (name "llvm")
-    (version "3.8.1")
+    (version "6.0.0")
     (source
      (origin
       (method url-fetch)
@@ -48,7 +49,7 @@
                           version "/llvm-" version ".src.tar.xz"))
       (sha256
        (base32
-        "1ybmnid4pw2hxn12ax5qa5kl1ldfns0njg8533y3mzslvd5cx0kf"))))
+        "0224xvfg6h40y5lrbnb9qaq3grmdc5rg00xq03s1wxjfbf8krx8z"))))
     (build-system cmake-build-system)
     (native-inputs
      `(("python" ,python-2) ;bytes->str conversion in clang>=3.7 needs python-2
@@ -131,7 +132,7 @@ compiler.  In LLVM this library is called \"compiler-rt\".")
     (supported-systems (delete "mips64el-linux" %supported-systems))))
 
 (define* (clang-from-llvm llvm clang-runtime hash
-                          #:key (patches '("clang-libc-search-path.patch")))
+                          #:key (patches '()))
   (package
     (name "clang")
     (version (package-version llvm))
@@ -158,6 +159,10 @@ compiler.  In LLVM this library is called \"compiler-rt\".")
      `(#:configure-flags
        (list "-DCLANG_INCLUDE_TESTS=True"
 
+             ;; Link to libclang_rt files from clang-runtime.
+             (string-append "-DCLANG_RESOURCE_DIR="
+                            (assoc-ref %build-inputs "clang-runtime"))
+
              ;; Find libgcc_s, crtbegin.o, and crtend.o.
              (string-append "-DGCC_INSTALL_PREFIX="
                             (assoc-ref %build-inputs "gcc-lib"))
@@ -176,22 +181,37 @@ compiler.  In LLVM this library is called \"compiler-rt\".")
                    (lambda* (#:key inputs #:allow-other-keys)
                      (let ((libc (assoc-ref inputs "libc"))
                            (compiler-rt (assoc-ref inputs "clang-runtime")))
-                       (substitute* "lib/Driver/Tools.cpp"
-                         ;; Patch the 'getLinuxDynamicLinker' function to that
-                         ;; it uses the right dynamic linker file name.
-                         (("/lib64/ld-linux-x86-64.so.2")
-                          (string-append libc
-                                         ,(glibc-dynamic-linker)))
-
-                         ;; Link to libclang_rt files from clang-runtime.
-                         (("TC\\.getDriver\\(\\)\\.ResourceDir")
-                          (string-append "\"" compiler-rt "\"")))
-
-                       ;; Same for libc's libdir, to allow crt1.o & co. to be
-                       ;; found.
-                       (substitute* "lib/Driver/ToolChains.cpp"
-                         (("@GLIBC_LIBDIR@")
-                          (string-append libc "/lib")))))))))
+                       (case (string->number ,(version-major (package-version
+                                                              clang-runtime)))
+                         ((6)
+                          ;; Make "LibDir" refer to <glibc>/lib so that it
+                          ;; uses the right dynamic linker file name.
+                          (substitute* "lib/Driver/ToolChains/Linux.cpp"
+                            (("(^[[:blank:]]+LibDir = ).*" _ declaration)
+                             (string-append declaration "\"" libc "/lib\";\n"))
+
+                            ;; Make sure libc's libdir is on the search path, to
+                            ;; allow crt1.o & co. to be found.
+                            (("@GLIBC_LIBDIR@")
+                             (string-append libc "/lib"))))
+                         ((3)
+                          (substitute* "lib/Driver/Tools.cpp"
+                            ;; Patch the 'getLinuxDynamicLinker' function so that
+                            ;; it uses the right dynamic linker file name.
+                            (("/lib64/ld-linux-x86-64.so.2")
+                             (string-append libc
+                                            ,(glibc-dynamic-linker)))
+
+                            ;; Link to libclang_rt files from clang-runtime.
+                            (("TC\\.getDriver\\(\\)\\.ResourceDir")
+                             (string-append "\"" compiler-rt "\"")))
+
+                          ;; Same for libc's libdir, to allow crt1.o & co. to be
+                          ;; found.
+                          (substitute* "lib/Driver/ToolChains.cpp"
+                            (("@GLIBC_LIBDIR@")
+                             (string-append libc "/lib")))))
+                       #t))))))
 
     ;; Clang supports the same environment variables as GCC.
     (native-search-paths
@@ -214,13 +234,12 @@ code analysis tools.")
 (define-public clang-runtime
   (clang-runtime-from-llvm
    llvm
-   "0p0y85c7izndbpg2l816z7z7558axq11d5pwkm4h11sdw7d13w0d"
-   '("clang-runtime-asan-build-fixes.patch")))
+   "16m7rvh3w6vq10iwkjrr1nn293djld3xm62l5zasisaprx117k6h"))
 
 (define-public clang
   (clang-from-llvm llvm clang-runtime
-                   "1prc72xmkgx8wrzmrr337776676nhsp1qd3mw2bvb22bzdnq7lsc"
-                   #:patches '("clang-3.8-libc-search-path.patch")))
+                   "0cnznvfyl3hgbg8gj58pmwf0pvd2sv5k3ccbivy6q6ggv7c6szg0"
+                   #:patches '("clang-6.0-libc-search-path.patch")))
 
 (define-public llvm-3.9.1
   (package (inherit llvm)
@@ -245,7 +264,31 @@ code analysis tools.")
 (define-public clang-3.9.1
   (clang-from-llvm llvm-3.9.1 clang-runtime-3.9.1
                    "0qsyyb40iwifhhlx9a3drf8z6ni6zwyk3bvh0kx2gs6yjsxwxi76"
-                   #:patches '()))
+                   #:patches '("clang-3.8-libc-search-path.patch")))
+
+(define-public llvm-3.8
+  (package (inherit llvm)
+    (name "llvm")
+    (version "3.8.1")
+    (source
+     (origin
+      (method url-fetch)
+      (uri (string-append "https://llvm.org/releases/"
+                          version "/llvm-" version ".src.tar.xz"))
+      (sha256
+       (base32
+        "1ybmnid4pw2hxn12ax5qa5kl1ldfns0njg8533y3mzslvd5cx0kf"))))))
+
+(define-public clang-runtime-3.8
+  (clang-runtime-from-llvm
+   llvm-3.8
+   "0p0y85c7izndbpg2l816z7z7558axq11d5pwkm4h11sdw7d13w0d"
+   '("clang-runtime-asan-build-fixes.patch")))
+
+(define-public clang-3.8
+  (clang-from-llvm llvm-3.8 clang-runtime-3.8
+                   "1prc72xmkgx8wrzmrr337776676nhsp1qd3mw2bvb22bzdnq7lsc"
+                   #:patches '("clang-3.8-libc-search-path.patch")))
 
 (define-public llvm-3.7
   (package (inherit llvm)
@@ -267,7 +310,8 @@ code analysis tools.")
 
 (define-public clang-3.7
   (clang-from-llvm llvm-3.7 clang-runtime-3.7
-                   "0x065d0w9b51xvdjxwfzjxng0gzpbx45fgiaxpap45ragi61dqjn"))
+                   "0x065d0w9b51xvdjxwfzjxng0gzpbx45fgiaxpap45ragi61dqjn"
+                   #:patches '("clang-3.5-libc-search-path.patch")))
 
 (define-public llvm-3.6
   (package (inherit llvm)
@@ -289,7 +333,8 @@ code analysis tools.")
 
 (define-public clang-3.6
   (clang-from-llvm llvm-3.6 clang-runtime-3.6
-                   "1wwr8s6lzr324hv4s1k6na4j5zv6n9kdhi14s4kb9b13d93814df"))
+                   "1wwr8s6lzr324hv4s1k6na4j5zv6n9kdhi14s4kb9b13d93814df"
+                   #:patches '("clang-3.5-libc-search-path.patch")))
 
 (define-public llvm-3.5
   (package (inherit llvm)
@@ -313,7 +358,8 @@ code analysis tools.")
 
 (define-public clang-3.5
   (clang-from-llvm llvm-3.5 clang-runtime-3.5
-                   "0846h8vn3zlc00jkmvrmy88gc6ql6014c02l4jv78fpvfigmgssg"))
+                   "0846h8vn3zlc00jkmvrmy88gc6ql6014c02l4jv78fpvfigmgssg"
+                   #:patches '("clang-3.5-libc-search-path.patch")))
 
 (define-public llvm-for-extempore
   (package (inherit llvm-3.7)
diff --git a/gnu/packages/patches/clang-libc-search-path.patch b/gnu/packages/patches/clang-3.5-libc-search-path.patch
similarity index 100%
rename from gnu/packages/patches/clang-libc-search-path.patch
rename to gnu/packages/patches/clang-3.5-libc-search-path.patch
diff --git a/gnu/packages/patches/clang-6.0-libc-search-path.patch b/gnu/packages/patches/clang-6.0-libc-search-path.patch
new file mode 100644
index 000000000..a62e8063c
--- /dev/null
+++ b/gnu/packages/patches/clang-6.0-libc-search-path.patch
@@ -0,0 +1,67 @@
+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.
+
+--- cfe-6.0.0.src/lib/Driver/ToolChains/Linux.cpp
++++ cfe-6.0.0.src/lib/Driver/ToolChains/Linux.cpp
+@@ -207,7 +207,9 @@
+   PPaths.push_back(Twine(GCCInstallation.getParentLibPath() + "/../" +
+                          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(D.getVFS());
+ 
+   if (Distro.IsAlpineLinux()) {
+@@ -255,6 +257,7 @@
+ 
+   if (IsAndroid || Distro.IsOpenSUSE())
+     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.
+@@ -329,14 +332,12 @@
+     addPathIfExists(D, D.Dir + "/../" + OSLibDir, Paths);
+   }
+ 
+-  addPathIfExists(D, SysRoot + "/lib/" + MultiarchTriple, Paths);
+-  addPathIfExists(D, SysRoot + "/lib/../" + OSLibDir, Paths);
+-  addPathIfExists(D, SysRoot + "/usr/lib/" + MultiarchTriple, Paths);
+-  addPathIfExists(D, SysRoot + "/usr/lib/../" + OSLibDir, Paths);
+-
+   // Try walking via the GCC triple path in case of biarch or multiarch GCC
+   // installations with strange symlinks.
+   if (GCCInstallation.isValid()) {
++    // The following code would end up adding things like
++    // "/usr/lib/x86_64-unknown-linux-gnu/../../lib64" to the search path.
++#if 0
+     addPathIfExists(D,
+                     SysRoot + "/usr/lib/" + GCCInstallation.getTriple().str() +
+                         "/../../" + OSLibDir,
+@@ -349,6 +350,7 @@
+                              BiarchSibling.gccSuffix(),
+                       Paths);
+     }
++#endif
+ 
+     // See comments above on the multilib variant for details of why this is
+     // included even from outside the sysroot.
+@@ -373,8 +375,9 @@
+   if (StringRef(D.Dir).startswith(SysRoot))
+     addPathIfExists(D, D.Dir + "/../lib", Paths);
+ 
+-  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; }
-- 
2.16.3

[signature.asc (application/pgp-signature, inline)]

Information forwarded to guix-patches <at> gnu.org:
bug#31025; Package guix-patches. (Wed, 04 Apr 2018 11:51:02 GMT) Full text and rfc822 format available.

Message #8 received at 31025 <at> debbugs.gnu.org (full text, mbox):

From: ludo <at> gnu.org (Ludovic Courtès)
To: Marius Bakke <mbakke <at> fastmail.com>
Cc: 31025 <at> debbugs.gnu.org
Subject: Re: [bug#31025] [core-updates] LLVM 6.0
Date: Wed, 04 Apr 2018 13:50:35 +0200
Hello!

Marius Bakke <mbakke <at> fastmail.com> skribis:

> This is an update for LLVM and Clang.  I haven't yet found a package
> that actually works with this new version; the consumers I've tested
> does not support LLVM >4.
>
> However they can keep using the old version, and if there turns out to
> be a problem with 6.0 we can fix it later since there are no dependents.

Sounds good!

> From 28e48a152c99c4c0911c794dd449c4df5ed193f5 Mon Sep 17 00:00:00 2001
> From: Marius Bakke <mbakke <at> fastmail.com>
> Date: Sat, 31 Mar 2018 22:04:44 +0200
> Subject: [PATCH] gnu: llvm, clang: Update to 6.0.0.
>
> * gnu/packages/llvm.scm (llvm, clang-runtime, clang): Update to 6.0.0.
> (clang-from-llvm)(patches): Set to empty list.
> [arguments]: Set CLANG_RESOURCE_DIR in #:configure-flags.  Adjust
> substitutions depending on major version.
> (llvm-3.8, clang-runtime-3.8, clang-3.8): New public variables.
> (clang-3.7, clang-3.6, clang-3.5)(patches): Add 'clang-3.5-libc-search-path.patch'.
> (clang-3.9.1)(patches): Add 'clang-3.8-libc-search-path.patch'.
> * gnu/packages/patches/clang-6.0-libc-search-path.patch: New file.
> * gnu/packages/patches/clang-libc-search-path.patch: Rename to ...
> * gnu/packages/patches/clang-3.5-libc-search-path.patch: ... this.
> * gnu/local.mk (dist_patch_DATA): Adjust accordingly.
>
> Add CLANG_RESOURCE_DIR (not sure if needed).

Hmm?

Otherwise LGTM!

Does this change the derivation of ‘llvm’ proper?  If not, this could
even go to ‘master’.

Thanks,
Ludo’.




Information forwarded to guix-patches <at> gnu.org:
bug#31025; Package guix-patches. (Wed, 04 Apr 2018 13:28:01 GMT) Full text and rfc822 format available.

Message #11 received at 31025 <at> debbugs.gnu.org (full text, mbox):

From: Eric Bavier <ericbavier <at> centurylink.net>
To: Marius Bakke <mbakke <at> fastmail.com>
Cc: 31025 <at> debbugs.gnu.org
Subject: Re: [bug#31025] [core-updates] LLVM 6.0
Date: Wed, 4 Apr 2018 08:27:03 -0500
[Message part 1 (text/plain, inline)]
On Mon, 02 Apr 2018 18:46:59 +0200
Marius Bakke <mbakke <at> fastmail.com> wrote:

> Hello!
> 
> This is an update for LLVM and Clang.  I haven't yet found a package
> that actually works with this new version; the consumers I've tested
> does not support LLVM >4.

Thanks for all the work here.  It builds fine for me.

> 
> However they can keep using the old version, and if there turns out to
> be a problem with 6.0 we can fix it later since there are no dependents.
> 
> WDYT?
> 

Sounds good.

`~Eric
[Message part 2 (application/pgp-signature, inline)]

Information forwarded to guix-patches <at> gnu.org:
bug#31025; Package guix-patches. (Wed, 04 Apr 2018 14:56:02 GMT) Full text and rfc822 format available.

Message #14 received at 31025 <at> debbugs.gnu.org (full text, mbox):

From: Marius Bakke <mbakke <at> fastmail.com>
To: Ludovic Courtès <ludo <at> gnu.org>
Cc: 31025 <at> debbugs.gnu.org
Subject: Re: [bug#31025] [core-updates] LLVM 6.0
Date: Wed, 04 Apr 2018 16:55:03 +0200
[Message part 1 (text/plain, inline)]
Ludovic Courtès <ludo <at> gnu.org> writes:

> Hello!
>
> Marius Bakke <mbakke <at> fastmail.com> skribis:
>
>> This is an update for LLVM and Clang.  I haven't yet found a package
>> that actually works with this new version; the consumers I've tested
>> does not support LLVM >4.
>>
>> However they can keep using the old version, and if there turns out to
>> be a problem with 6.0 we can fix it later since there are no dependents.
>
> Sounds good!
>
>> From 28e48a152c99c4c0911c794dd449c4df5ed193f5 Mon Sep 17 00:00:00 2001
>> From: Marius Bakke <mbakke <at> fastmail.com>
>> Date: Sat, 31 Mar 2018 22:04:44 +0200
>> Subject: [PATCH] gnu: llvm, clang: Update to 6.0.0.
>>
>> * gnu/packages/llvm.scm (llvm, clang-runtime, clang): Update to 6.0.0.
>> (clang-from-llvm)(patches): Set to empty list.
>> [arguments]: Set CLANG_RESOURCE_DIR in #:configure-flags.  Adjust
>> substitutions depending on major version.
>> (llvm-3.8, clang-runtime-3.8, clang-3.8): New public variables.
>> (clang-3.7, clang-3.6, clang-3.5)(patches): Add 'clang-3.5-libc-search-path.patch'.
>> (clang-3.9.1)(patches): Add 'clang-3.8-libc-search-path.patch'.
>> * gnu/packages/patches/clang-6.0-libc-search-path.patch: New file.
>> * gnu/packages/patches/clang-libc-search-path.patch: Rename to ...
>> * gnu/packages/patches/clang-3.5-libc-search-path.patch: ... this.
>> * gnu/local.mk (dist_patch_DATA): Adjust accordingly.
>>
>> Add CLANG_RESOURCE_DIR (not sure if needed).
>
> Hmm?

Oops, squashing error.  It turns out that was not needed and removed in
the updated patch below.

The updated patch fixes another problem: in 3.8 (the current "clang"
variable) and 3.9, the getDriver.ResourceDir substitution was actually
ineffective, so "clang-runtime" would never be referenced.

> Does this change the derivation of ‘llvm’ proper?  If not, this could
> even go to ‘master’.

LLVM is unaffected by this patch, only "clang" is changed.  So I believe
master is fine indeed.

However as it stands, many packages would break since the "clang"
variable changes from 3.8 to 6.0.  I'll test out each dependent and
see if they can be updated or change back to 3.8/3.9 for those.

I'm busy today, but can probably commit this tomorrow.  Meanwhile, how
does the updated patch look?

FWIW I've managed to build much of Chromium 65 with this new Clang; it
still fails, but I at least get further than with GCC 5 :-/

[0001-gnu-llvm-clang-Update-to-6.0.0.patch (text/x-patch, inline)]
From f070313904415cdb486a07215ae3c5011d468573 Mon Sep 17 00:00:00 2001
From: Marius Bakke <mbakke <at> fastmail.com>
Date: Sat, 31 Mar 2018 22:04:44 +0200
Subject: [PATCH] gnu: llvm, clang: Update to 6.0.0.

* gnu/packages/llvm.scm (llvm, clang-runtime, clang): Update to 6.0.0.
(clang-from-llvm)(patches): Set to empty list.
[arguments]: Adjust substitutions depending on major version.
(llvm-3.8, clang-runtime-3.8, clang-3.8): New public variables.
(clang-3.7, clang-3.6, clang-3.5)(patches): Add 'clang-3.5-libc-search-path.patch'.
(clang-3.9.1)(patches): Add 'clang-3.8-libc-search-path.patch'.
* gnu/packages/patches/clang-6.0-libc-search-path.patch: New file.
* gnu/packages/patches/clang-libc-search-path.patch: Rename to ...
* gnu/packages/patches/clang-3.5-libc-search-path.patch: ... this.
* gnu/local.mk (dist_patch_DATA): Adjust accordingly.
---
 gnu/local.mk                                  |   3 +-
 gnu/packages/llvm.scm                         | 109 +++++++++++++-----
 ...patch => clang-3.5-libc-search-path.patch} |   0
 .../patches/clang-6.0-libc-search-path.patch  |  67 +++++++++++
 4 files changed, 151 insertions(+), 28 deletions(-)
 rename gnu/packages/patches/{clang-libc-search-path.patch => clang-3.5-libc-search-path.patch} (100%)
 create mode 100644 gnu/packages/patches/clang-6.0-libc-search-path.patch

diff --git a/gnu/local.mk b/gnu/local.mk
index 270aee26b..91668fc29 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -593,8 +593,9 @@ dist_patch_DATA =						\
   %D%/packages/patches/chmlib-inttypes.patch			\
   %D%/packages/patches/chromium-gcc5.patch			\
   %D%/packages/patches/chromium-remove-default-history.patch	\
-  %D%/packages/patches/clang-libc-search-path.patch		\
+  %D%/packages/patches/clang-3.5-libc-search-path.patch		\
   %D%/packages/patches/clang-3.8-libc-search-path.patch		\
+  %D%/packages/patches/clang-6.0-libc-search-path.patch		\
   %D%/packages/patches/clang-runtime-asan-build-fixes.patch	\
   %D%/packages/patches/clang-runtime-esan-build-fixes.patch	\
   %D%/packages/patches/classpath-aarch64-support.patch		\
diff --git a/gnu/packages/llvm.scm b/gnu/packages/llvm.scm
index 2dddbc436..98592ad09 100644
--- a/gnu/packages/llvm.scm
+++ b/gnu/packages/llvm.scm
@@ -5,6 +5,7 @@
 ;;; Copyright © 2016 Dennis Mungai <dmngaie <at> gmail.com>
 ;;; Copyright © 2016 Ricardo Wurmus <rekado <at> elephly.net>
 ;;; Copyright © 2017 Roel Janssen <roel <at> gnu.org>
+;;; Copyright © 2018 Marius Bakke <mbakke <at> fastmail.com>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -40,7 +41,7 @@
 (define-public llvm
   (package
     (name "llvm")
-    (version "3.8.1")
+    (version "6.0.0")
     (source
      (origin
       (method url-fetch)
@@ -48,7 +49,7 @@
                           version "/llvm-" version ".src.tar.xz"))
       (sha256
        (base32
-        "1ybmnid4pw2hxn12ax5qa5kl1ldfns0njg8533y3mzslvd5cx0kf"))))
+        "0224xvfg6h40y5lrbnb9qaq3grmdc5rg00xq03s1wxjfbf8krx8z"))))
     (build-system cmake-build-system)
     (native-inputs
      `(("python" ,python-2) ;bytes->str conversion in clang>=3.7 needs python-2
@@ -131,7 +132,7 @@ compiler.  In LLVM this library is called \"compiler-rt\".")
     (supported-systems (delete "mips64el-linux" %supported-systems))))
 
 (define* (clang-from-llvm llvm clang-runtime hash
-                          #:key (patches '("clang-libc-search-path.patch")))
+                          #:key (patches '()))
   (package
     (name "clang")
     (version (package-version llvm))
@@ -176,22 +177,50 @@ compiler.  In LLVM this library is called \"compiler-rt\".")
                    (lambda* (#:key inputs #:allow-other-keys)
                      (let ((libc (assoc-ref inputs "libc"))
                            (compiler-rt (assoc-ref inputs "clang-runtime")))
-                       (substitute* "lib/Driver/Tools.cpp"
-                         ;; Patch the 'getLinuxDynamicLinker' function to that
-                         ;; it uses the right dynamic linker file name.
-                         (("/lib64/ld-linux-x86-64.so.2")
-                          (string-append libc
-                                         ,(glibc-dynamic-linker)))
-
-                         ;; Link to libclang_rt files from clang-runtime.
-                         (("TC\\.getDriver\\(\\)\\.ResourceDir")
-                          (string-append "\"" compiler-rt "\"")))
-
-                       ;; Same for libc's libdir, to allow crt1.o & co. to be
-                       ;; found.
-                       (substitute* "lib/Driver/ToolChains.cpp"
-                         (("@GLIBC_LIBDIR@")
-                          (string-append libc "/lib")))))))))
+                       (case (string->number ,(version-major
+                                               (package-version clang-runtime)))
+                         ((6)
+                          ;; Link to libclang_rt files from clang-runtime.
+                          (substitute* "lib/Driver/ToolChain.cpp"
+                            (("getDriver\\(\\)\\.ResourceDir")
+                             (string-append "\"" compiler-rt "\"")))
+
+                          ;; Make "LibDir" refer to <glibc>/lib so that it
+                          ;; uses the right dynamic linker file name.
+                          (substitute* "lib/Driver/ToolChains/Linux.cpp"
+                            (("(^[[:blank:]]+LibDir = ).*" _ declaration)
+                             (string-append declaration "\"" libc "/lib\";\n"))
+
+                            ;; Make sure libc's libdir is on the search path, to
+                            ;; allow crt1.o & co. to be found.
+                            (("@GLIBC_LIBDIR@")
+                             (string-append libc "/lib"))))
+                         ((3)
+                          (substitute* "lib/Driver/Tools.cpp"
+                            ;; Patch the 'getLinuxDynamicLinker' function so that
+                            ;; it uses the right dynamic linker file name.
+                            (("/lib64/ld-linux-x86-64.so.2")
+                             (string-append libc
+                                            ,(glibc-dynamic-linker))))
+
+                          ;; Link to libclang_rt files from clang-runtime.
+                          ;; This substitution needed slight adjustment in 3.8.
+                          (if (< 3.8 (string->number ,(version-major+minor
+                                                       (package-version
+                                                        clang-runtime))))
+                              (substitute* "lib/Driver/Tools.cpp"
+                                (("TC\\.getDriver\\(\\)\\.ResourceDir")
+                                 (string-append "\"" compiler-rt "\"")))
+                              (substitute* "lib/Driver/ToolChain.cpp"
+                                (("getDriver\\(\\)\\.ResourceDir")
+                                 (string-append "\"" compiler-rt "\""))))
+
+                          ;; Make sure libc's libdir is on the search path, to
+                          ;; allow crt1.o & co. to be found.
+                          (substitute* "lib/Driver/ToolChains.cpp"
+                            (("@GLIBC_LIBDIR@")
+                             (string-append libc "/lib")))))
+                       #t))))))
 
     ;; Clang supports the same environment variables as GCC.
     (native-search-paths
@@ -214,13 +243,12 @@ code analysis tools.")
 (define-public clang-runtime
   (clang-runtime-from-llvm
    llvm
-   "0p0y85c7izndbpg2l816z7z7558axq11d5pwkm4h11sdw7d13w0d"
-   '("clang-runtime-asan-build-fixes.patch")))
+   "16m7rvh3w6vq10iwkjrr1nn293djld3xm62l5zasisaprx117k6h"))
 
 (define-public clang
   (clang-from-llvm llvm clang-runtime
-                   "1prc72xmkgx8wrzmrr337776676nhsp1qd3mw2bvb22bzdnq7lsc"
-                   #:patches '("clang-3.8-libc-search-path.patch")))
+                   "0cnznvfyl3hgbg8gj58pmwf0pvd2sv5k3ccbivy6q6ggv7c6szg0"
+                   #:patches '("clang-6.0-libc-search-path.patch")))
 
 (define-public llvm-3.9.1
   (package (inherit llvm)
@@ -245,7 +273,31 @@ code analysis tools.")
 (define-public clang-3.9.1
   (clang-from-llvm llvm-3.9.1 clang-runtime-3.9.1
                    "0qsyyb40iwifhhlx9a3drf8z6ni6zwyk3bvh0kx2gs6yjsxwxi76"
-                   #:patches '()))
+                   #:patches '("clang-3.8-libc-search-path.patch")))
+
+(define-public llvm-3.8
+  (package (inherit llvm)
+    (name "llvm")
+    (version "3.8.1")
+    (source
+     (origin
+      (method url-fetch)
+      (uri (string-append "https://llvm.org/releases/"
+                          version "/llvm-" version ".src.tar.xz"))
+      (sha256
+       (base32
+        "1ybmnid4pw2hxn12ax5qa5kl1ldfns0njg8533y3mzslvd5cx0kf"))))))
+
+(define-public clang-runtime-3.8
+  (clang-runtime-from-llvm
+   llvm-3.8
+   "0p0y85c7izndbpg2l816z7z7558axq11d5pwkm4h11sdw7d13w0d"
+   '("clang-runtime-asan-build-fixes.patch")))
+
+(define-public clang-3.8
+  (clang-from-llvm llvm-3.8 clang-runtime-3.8
+                   "1prc72xmkgx8wrzmrr337776676nhsp1qd3mw2bvb22bzdnq7lsc"
+                   #:patches '("clang-3.8-libc-search-path.patch")))
 
 (define-public llvm-3.7
   (package (inherit llvm)
@@ -267,7 +319,8 @@ code analysis tools.")
 
 (define-public clang-3.7
   (clang-from-llvm llvm-3.7 clang-runtime-3.7
-                   "0x065d0w9b51xvdjxwfzjxng0gzpbx45fgiaxpap45ragi61dqjn"))
+                   "0x065d0w9b51xvdjxwfzjxng0gzpbx45fgiaxpap45ragi61dqjn"
+                   #:patches '("clang-3.5-libc-search-path.patch")))
 
 (define-public llvm-3.6
   (package (inherit llvm)
@@ -289,7 +342,8 @@ code analysis tools.")
 
 (define-public clang-3.6
   (clang-from-llvm llvm-3.6 clang-runtime-3.6
-                   "1wwr8s6lzr324hv4s1k6na4j5zv6n9kdhi14s4kb9b13d93814df"))
+                   "1wwr8s6lzr324hv4s1k6na4j5zv6n9kdhi14s4kb9b13d93814df"
+                   #:patches '("clang-3.5-libc-search-path.patch")))
 
 (define-public llvm-3.5
   (package (inherit llvm)
@@ -313,7 +367,8 @@ code analysis tools.")
 
 (define-public clang-3.5
   (clang-from-llvm llvm-3.5 clang-runtime-3.5
-                   "0846h8vn3zlc00jkmvrmy88gc6ql6014c02l4jv78fpvfigmgssg"))
+                   "0846h8vn3zlc00jkmvrmy88gc6ql6014c02l4jv78fpvfigmgssg"
+                   #:patches '("clang-3.5-libc-search-path.patch")))
 
 (define-public llvm-for-extempore
   (package (inherit llvm-3.7)
diff --git a/gnu/packages/patches/clang-libc-search-path.patch b/gnu/packages/patches/clang-3.5-libc-search-path.patch
similarity index 100%
rename from gnu/packages/patches/clang-libc-search-path.patch
rename to gnu/packages/patches/clang-3.5-libc-search-path.patch
diff --git a/gnu/packages/patches/clang-6.0-libc-search-path.patch b/gnu/packages/patches/clang-6.0-libc-search-path.patch
new file mode 100644
index 000000000..a62e8063c
--- /dev/null
+++ b/gnu/packages/patches/clang-6.0-libc-search-path.patch
@@ -0,0 +1,67 @@
+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.
+
+--- cfe-6.0.0.src/lib/Driver/ToolChains/Linux.cpp
++++ cfe-6.0.0.src/lib/Driver/ToolChains/Linux.cpp
+@@ -207,7 +207,9 @@
+   PPaths.push_back(Twine(GCCInstallation.getParentLibPath() + "/../" +
+                          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(D.getVFS());
+ 
+   if (Distro.IsAlpineLinux()) {
+@@ -255,6 +257,7 @@
+ 
+   if (IsAndroid || Distro.IsOpenSUSE())
+     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.
+@@ -329,14 +332,12 @@
+     addPathIfExists(D, D.Dir + "/../" + OSLibDir, Paths);
+   }
+ 
+-  addPathIfExists(D, SysRoot + "/lib/" + MultiarchTriple, Paths);
+-  addPathIfExists(D, SysRoot + "/lib/../" + OSLibDir, Paths);
+-  addPathIfExists(D, SysRoot + "/usr/lib/" + MultiarchTriple, Paths);
+-  addPathIfExists(D, SysRoot + "/usr/lib/../" + OSLibDir, Paths);
+-
+   // Try walking via the GCC triple path in case of biarch or multiarch GCC
+   // installations with strange symlinks.
+   if (GCCInstallation.isValid()) {
++    // The following code would end up adding things like
++    // "/usr/lib/x86_64-unknown-linux-gnu/../../lib64" to the search path.
++#if 0
+     addPathIfExists(D,
+                     SysRoot + "/usr/lib/" + GCCInstallation.getTriple().str() +
+                         "/../../" + OSLibDir,
+@@ -349,6 +350,7 @@
+                              BiarchSibling.gccSuffix(),
+                       Paths);
+     }
++#endif
+ 
+     // See comments above on the multilib variant for details of why this is
+     // included even from outside the sysroot.
+@@ -373,8 +375,9 @@
+   if (StringRef(D.Dir).startswith(SysRoot))
+     addPathIfExists(D, D.Dir + "/../lib", Paths);
+ 
+-  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; }
-- 
2.17.0

[signature.asc (application/pgp-signature, inline)]

Information forwarded to guix-patches <at> gnu.org:
bug#31025; Package guix-patches. (Thu, 05 Apr 2018 08:21:02 GMT) Full text and rfc822 format available.

Message #17 received at 31025 <at> debbugs.gnu.org (full text, mbox):

From: ludo <at> gnu.org (Ludovic Courtès)
To: Marius Bakke <mbakke <at> fastmail.com>
Cc: 31025 <at> debbugs.gnu.org
Subject: Re: [bug#31025] [core-updates] LLVM 6.0
Date: Thu, 05 Apr 2018 10:20:37 +0200
Marius Bakke <mbakke <at> fastmail.com> skribis:

> Ludovic Courtès <ludo <at> gnu.org> writes:

[...]

>> Does this change the derivation of ‘llvm’ proper?  If not, this could
>> even go to ‘master’.
>
> LLVM is unaffected by this patch, only "clang" is changed.  So I believe
> master is fine indeed.
>
> However as it stands, many packages would break since the "clang"
> variable changes from 3.8 to 6.0.  I'll test out each dependent and
> see if they can be updated or change back to 3.8/3.9 for those.

Right, we could keep 3.8 as the default for now.

> I'm busy today, but can probably commit this tomorrow.  Meanwhile, how
> does the updated patch look?

LGTM, thanks!

Ludo’.




Information forwarded to guix-patches <at> gnu.org:
bug#31025; Package guix-patches. (Thu, 05 Apr 2018 08:53:01 GMT) Full text and rfc822 format available.

Message #20 received at 31025 <at> debbugs.gnu.org (full text, mbox):

From: Pjotr Prins <pjotr.public12 <at> thebird.nl>
To: Marius Bakke <mbakke <at> fastmail.com>
Cc: 31025 <at> debbugs.gnu.org
Subject: Re: [bug#31025] [core-updates] LLVM 6.0
Date: Thu, 5 Apr 2018 10:47:31 +0200
On Mon, Apr 02, 2018 at 06:46:59PM +0200, Marius Bakke wrote:
> Hello!
> 
> This is an update for LLVM and Clang.  I haven't yet found a package
> that actually works with this new version; the consumers I've tested
> does not support LLVM >4.
> 
> However they can keep using the old version, and if there turns out to
> be a problem with 6.0 we can fix it later since there are no dependents.
> 
> WDYT?

Excellent. dlang ldc supports 6.0. I'll have a go soon. I want that!

Pj.




Reply sent to Marius Bakke <mbakke <at> fastmail.com>:
You have taken responsibility. (Fri, 06 Apr 2018 18:26:01 GMT) Full text and rfc822 format available.

Notification sent to Marius Bakke <mbakke <at> fastmail.com>:
bug acknowledged by developer. (Fri, 06 Apr 2018 18:26:02 GMT) Full text and rfc822 format available.

Message #25 received at 31025-done <at> debbugs.gnu.org (full text, mbox):

From: Marius Bakke <mbakke <at> fastmail.com>
To: Ludovic Courtès <ludo <at> gnu.org>
Cc: 31025-done <at> debbugs.gnu.org
Subject: Re: [bug#31025] [core-updates] LLVM 6.0
Date: Fri, 06 Apr 2018 20:24:58 +0200
[Message part 1 (text/plain, inline)]
Ludovic Courtès <ludo <at> gnu.org> writes:

> Marius Bakke <mbakke <at> fastmail.com> skribis:
>
>> Ludovic Courtès <ludo <at> gnu.org> writes:
>
> [...]
>
>>> Does this change the derivation of ‘llvm’ proper?  If not, this could
>>> even go to ‘master’.
>>
>> LLVM is unaffected by this patch, only "clang" is changed.  So I believe
>> master is fine indeed.
>>
>> However as it stands, many packages would break since the "clang"
>> variable changes from 3.8 to 6.0.  I'll test out each dependent and
>> see if they can be updated or change back to 3.8/3.9 for those.
>
> Right, we could keep 3.8 as the default for now.

I built all dependents and only two packages needed 3.8, so I changed
those instead.  Pushed to master with 9bdbabe9.
[signature.asc (application/pgp-signature, inline)]

Information forwarded to guix-patches <at> gnu.org:
bug#31025; Package guix-patches. (Fri, 06 Apr 2018 20:59:02 GMT) Full text and rfc822 format available.

Message #28 received at 31025-done <at> debbugs.gnu.org (full text, mbox):

From: ludo <at> gnu.org (Ludovic Courtès)
To: Marius Bakke <mbakke <at> fastmail.com>
Cc: 31025-done <at> debbugs.gnu.org
Subject: Re: [bug#31025] [core-updates] LLVM 6.0
Date: Fri, 06 Apr 2018 22:58:45 +0200
Marius Bakke <mbakke <at> fastmail.com> skribis:

> Ludovic Courtès <ludo <at> gnu.org> writes:
>
>> Marius Bakke <mbakke <at> fastmail.com> skribis:
>>
>>> Ludovic Courtès <ludo <at> gnu.org> writes:
>>
>> [...]
>>
>>>> Does this change the derivation of ‘llvm’ proper?  If not, this could
>>>> even go to ‘master’.
>>>
>>> LLVM is unaffected by this patch, only "clang" is changed.  So I believe
>>> master is fine indeed.
>>>
>>> However as it stands, many packages would break since the "clang"
>>> variable changes from 3.8 to 6.0.  I'll test out each dependent and
>>> see if they can be updated or change back to 3.8/3.9 for those.
>>
>> Right, we could keep 3.8 as the default for now.
>
> I built all dependents and only two packages needed 3.8, so I changed
> those instead.  Pushed to master with 9bdbabe9.

Woohoo, thanks!

Ludo'.




bug archived. Request was from Debbugs Internal Request <help-debbugs <at> gnu.org> to internal_control <at> debbugs.gnu.org. (Sat, 05 May 2018 11:24:04 GMT) Full text and rfc822 format available.

This bug report was last modified 7 years and 48 days ago.

Previous Next


GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997,2003 nCipher Corporation Ltd, 1994-97 Ian Jackson.