[PATCH] gnu: lld: Update to 12.0.0.

  • Done
  • quality assurance status badge
Details
4 participants
  • Sarah Morgensen
  • Leo Prikler
  • Ludovic Courtès
  • terramorpha
Owner
unassigned
Submitted by
terramorpha
Severity
normal
T
T
terramorpha wrote on 8 Jul 2021 23:39
(address . guix-patches@gnu.org)
e7e70cb2398e0a8070ea38c09511d339@cock.li
Hi guix. While updating my personal package definition of zig to 0.8.0,
I had to write one for lld@12 too.
(IIUC, only llvm and clang were upgraded to 12, I couldn't find lld when
`guix search`-ing)

Anyway, the release tarball assumes that it will be unpacked and built
in the same directory as the libunwind source.
This is why at build time, I added a phase to patch the CMakeLists.txt
and make it look for libunwind in a specific place.

Cheers
T
T
terramorpha wrote on 8 Jul 2021 23:45
the actual patch
(address . 49471@debbugs.gnu.org)
144970c00db4527f3e64c1a74466286d@cock.li
Toggle diff (71 lines)
diff --git a/gnu/packages/llvm.scm b/gnu/packages/llvm.scm
index 575c63c713..b3c1c943f7 100644
--- a/gnu/packages/llvm.scm
+++ b/gnu/packages/llvm.scm
@@ -882,21 +882,40 @@ of programming tools as well as libraries with
equivalent functionality.")
(define-public clang clang-9)
(define-public clang-toolchain clang-toolchain-9)

-(define-public lld
+
+(define libunwind-12-source
+ (origin (method url-fetch)
+ (uri (llvm-uri "libunwind" "12.0.0"))
+ (sha256 (base32
"1x8wpmsrsgnwj2v5ih52ylni7r6n8gzkcj6hx65zbxski2rablly"))))
+
+(define-public lld-12
(package
(name "lld")
- (version "11.0.0")
+ (version "12.0.0")
(source (origin
(method url-fetch)
(uri (llvm-uri "lld" version))
(sha256
(base32
-
"077xyh7sij6mhp4dc4kdcmp9whrpz332fa12rwxnzp3wgd5bxrzg"))))
+
"1zakyxk5bwnh7jarckcd4rbmzi58jgn2dbah5j5cwcyfyfbx9drc"))))
(build-system cmake-build-system)
(inputs
- `(("llvm" ,llvm-11)))
+ `(("llvm" ,llvm-12)
+ ("libunwind-source" ,libunwind-12-source)))
(arguments
- `(#:build-type "Release"
+ `(#:phases
+ (modify-phases %standard-phases
+ (add-before 'configure 'extract-libunwind-and-patch-path
+ (lambda* (#:key inputs #:allow-other-keys)
+ (invoke "tar" "-xf" (assoc-ref inputs "libunwind-source"))
+ (substitute "MachO/CMakeLists.txt"
+ ;; The build script assumes that the libunwind
code
+ ;; is the source's sibling directory. Patch it
so
+ ;; that it finds it directly where we put it
+ (list (cons
"include_directories\\(\\$\\{LLVM_MAIN_SRC_DIR\\}\\/\\.\\.\\/libunwind\\/include)"
+ (const (string-append
"include_directories(" (getcwd) "/libunwind-12.0.0.src" "/include)")))))
+ #t)))
+ #:build-type "Release"
;; TODO: Tests require the lit tool, which isn't installed by
the LLVM
;; package.
#:tests? #f))
@@ -904,7 +923,7 @@ of programming tools as well as libraries with
equivalent functionality.")
(synopsis "Linker from the LLVM project")
(description "LLD is a high-performance linker, built as a set of
reusable
components which highly leverage existing libraries in the larger LLVM
Project.")
- (license license:asl2.0))) ; With LLVM exception
+ (license license:asl2.0))) ; With LLVM exceptions

(define-public lldb
(package
L
L
Leo Prikler wrote on 10 Jul 2021 00:06
[PATCH] gnu: lld: Update to 12.0.0.
(address . 49471@debbugs.gnu.org)
20210709220605.24524-1-leo.prikler@student.tugraz.at
* gnu/packages/llvm.scm (llvm-subprojects-origin, %llvm-project-12.0.0-hash):
New variables.
(lld-11, lld-12): New variables.
(lld): Point to lld-11.
---
This patch is an alternative to the one sent by terramorpha.

Supposed advantages of it are:
* lld still points to lld-11, not breaking any packages that rely on it
* llvm-subprojects-origin can be reused by other LLVM subprojects
(think of libcxx and libcxxabi, which both require each other, or
libunwind, which requires libcxx)

Disadvantages are:
* llvm-project is a beefy tarball and somewhat of a pain to unpack
* Both this version and the original use an unclean approach to building
subprojects, that is propagated by LLVM. Perhaps we ought to instead
clean up their mess?

Regards,
Leo

gnu/packages/llvm.scm | 43 ++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 42 insertions(+), 1 deletion(-)

Toggle diff (70 lines)
diff --git a/gnu/packages/llvm.scm b/gnu/packages/llvm.scm
index 575c63c713..1ddbd39e59 100644
--- a/gnu/packages/llvm.scm
+++ b/gnu/packages/llvm.scm
@@ -92,6 +92,22 @@ as \"x86_64-linux\"."
(string-append "https://github.com/llvm/llvm-project/releases/download"
"/llvmorg-" version "/" component "-" version ".src.tar.xz"))
+(define* (llvm-subprojects-origin components version hash
+ #:optional (patches '()))
+ (origin
+ (method url-fetch)
+ (uri (llvm-uri "llvm-project" version))
+ (sha256 (base32 hash))
+ (patches (map search-patch patches))
+ (modules '((guix build utils)
+ (ice-9 ftw)))
+ (snippet
+ `(for-each
+ (lambda (file)
+ (unless (member file '("." ".." ,@components))
+ (delete-file-recursively file)))
+ (scandir ".")))))
+
(define* (clang-runtime-from-llvm llvm hash
#:optional (patches '()))
(package
@@ -882,7 +898,7 @@ of programming tools as well as libraries with equivalent functionality.")
(define-public clang clang-9)
(define-public clang-toolchain clang-toolchain-9)
-(define-public lld
+(define-public lld-11
(package
(name "lld")
(version "11.0.0")
@@ -906,6 +922,31 @@ of programming tools as well as libraries with equivalent functionality.")
components which highly leverage existing libraries in the larger LLVM Project.")
(license license:asl2.0))) ; With LLVM exception
+(define %llvm-project-12.0.0-hash "0a1n88dmbwp1ww7h3ykf0s001cndk1bm3i2cj1y2sh548f4nilcy")
+
+(define-public lld-12
+ (package
+ (inherit lld-11)
+ (version "12.0.0")
+ (source (llvm-subprojects-origin '("lld" "libunwind") version
+ %llvm-project-12.0.0-hash))
+ (arguments
+ `(,@(package-arguments lld-11)
+ #:phases
+ (modify-phases %standard-phases
+ (add-after 'unpack 'dissect
+ (lambda _
+ ;; Find libunwind in unpacked sources
+ (substitute* "lld/MachO/CMakeLists.txt"
+ (("\\$\\{LLVM_MAIN_SRC_DIR\\}/\\.\\./libunwind")
+ (string-append (getcwd) "/libunwind")))
+ ;; chdir to actual source folder
+ (chdir "lld"))))))
+ (inputs
+ `(("llvm" ,llvm-12)))))
+
+(define-public lld lld-11)
+
(define-public lldb
(package
(name "lldb")
--
2.32.0
L
L
Ludovic Courtès wrote on 19 Jul 2021 19:37
(name . Leo Prikler)(address . leo.prikler@student.tugraz.at)(address . 49471@debbugs.gnu.org)
87o8aykxwn.fsf_-_@gnu.org
Hi,

Leo Prikler <leo.prikler@student.tugraz.at> skribis:

Toggle quote (19 lines)
> * gnu/packages/llvm.scm (llvm-subprojects-origin, %llvm-project-12.0.0-hash):
> New variables.
> (lld-11, lld-12): New variables.
> (lld): Point to lld-11.
> ---
> This patch is an alternative to the one sent by terramorpha.
>
> Supposed advantages of it are:
> * lld still points to lld-11, not breaking any packages that rely on it
> * llvm-subprojects-origin can be reused by other LLVM subprojects
> (think of libcxx and libcxxabi, which both require each other, or
> libunwind, which requires libcxx)
>
> Disadvantages are:
> * llvm-project is a beefy tarball and somewhat of a pain to unpack
> * Both this version and the original use an unclean approach to building
> subprojects, that is propagated by LLVM. Perhaps we ought to instead
> clean up their mess?

I’m not sure that the 2nd point means, but perhaps it can be addressed
separately?

Toggle quote (6 lines)
> -(define-public lld
> +(define-public lld-11
> (package
> (name "lld")
> (version "11.0.0")

Does it make sense to keep old versions of the linker around? To me
it’s much less useful than keeping old versions of the compiler.

Toggle quote (1 lines)
> +(define %llvm-project-12.0.0-hash "0a1n88dmbwp1ww7h3ykf0s001cndk1bm3i2cj1y2sh548f4nilcy")
^
I’d use ‘base32’ here (for expansion-time base32 decoding) and remove it
from ‘llvm-subprojects-origin’.

Otherwise LGTM.

Thanks!

Ludo’.
L
L
Leo Prikler wrote on 19 Jul 2021 20:10
(name . Ludovic Courtès)(address . ludo@gnu.org)(address . 49471@debbugs.gnu.org)
b7dbd23a8f8ef58ee8ab44137cdc1fe1859d1c45.camel@student.tugraz.at
Hi,

Am Montag, den 19.07.2021, 19:37 +0200 schrieb Ludovic Courtès:
Toggle quote (29 lines)
> Hi,
>
> Leo Prikler <leo.prikler@student.tugraz.at> skribis:
>
> > * gnu/packages/llvm.scm (llvm-subprojects-origin, %llvm-project-
> > 12.0.0-hash):
> > New variables.
> > (lld-11, lld-12): New variables.
> > (lld): Point to lld-11.
> > ---
> > This patch is an alternative to the one sent by terramorpha.
> >
> > Supposed advantages of it are:
> > * lld still points to lld-11, not breaking any packages that rely
> > on it
> > * llvm-subprojects-origin can be reused by other LLVM subprojects
> > (think of libcxx and libcxxabi, which both require each other, or
> > libunwind, which requires libcxx)
> >
> > Disadvantages are:
> > * llvm-project is a beefy tarball and somewhat of a pain to unpack
> > * Both this version and the original use an unclean approach to
> > building
> > subprojects, that is propagated by LLVM. Perhaps we ought to
> > instead
> > clean up their mess?
>
> I’m not sure that the 2nd point means, but perhaps it can be
> addressed separately?
The gist of it is that we can't build the projects from just their
source and "normal" inputs – we have to also unpack (or leave in the
source tree as done here) other sources, that would themselves
constitute different packages.

I'm not really sure how big of a problem that is in general (apart from
the annoyance of having to do that) – it simply feels unclean, that's
all I'm complaining about here.

Toggle quote (9 lines)
> > -(define-public lld
> > +(define-public lld-11
> > (package
> > (name "lld")
> > (version "11.0.0")
>
> Does it make sense to keep old versions of the linker around? To me
> it’s much less useful than keeping old versions of the compiler.

There don't seem to be dependants other than itself, but I didn't want
to accidentally break stuff, also concerning other channels. Since
lld-12 will be used in the zig package thereafter, which takes
versioned LLVM as inputs, I think it's likely similar projects might
want to use lld 11 or older, which can be built by inheriting the
somewhat simpler lld-11 package. (Similarly if you want zig 0.7 for
historical purposes, although that's entering Guix Past territory.)

Toggle quote (5 lines)
> > +(define %llvm-project-12.0.0-hash
> > "0a1n88dmbwp1ww7h3ykf0s001cndk1bm3i2cj1y2sh548f4nilcy")
> ^
> I’d use ‘base32’ here (for expansion-time base32 decoding) and remove
> it from ‘llvm-subprojects-origin’.
Point taken, I'll update that in v2.

Regards,
Leo
S
S
Sarah Morgensen wrote on 24 Sep 2021 02:28
Re: [bug#49471] [PATCH] gnu: lld: Update to 12.0.0.
(address . 49471-done@debbugs.gnu.org)
86zgs2izpk.fsf@mgsn.dev
Hi,

terramorpha@cock.li writes:

Toggle quote (12 lines)
> Hi guix. While updating my personal package definition of zig to 0.8.0, I had to
> write one for lld@12 too.
> (IIUC, only llvm and clang were upgraded to 12, I couldn't find lld when `guix
> search`-ing)
>
> Anyway, the release tarball assumes that it will be unpacked and built in the
> same directory as the libunwind source.
> This is why at build time, I added a phase to patch the CMakeLists.txt and make
> it look for libunwind in a specific place.
>
> Cheers

It looks like this has been done in

a7283c1d14 gnu: lld: Update to 12.0.1.

on master, so I'm closing this bug.

--
Sarah
Closed
?