;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2014, 2016, 2018 Eric Bavier <bavier@member.fsf.org>
;;; Copyright © 2015 Mark H Weaver <mhw@netris.org>
-;;; Copyright © 2015, 2017, 2018, 2019 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2015, 2017, 2018, 2019, 2020 Ludovic Courtès <ludo@gnu.org>
;;; Copyright © 2016 Dennis Mungai <dmngaie@gmail.com>
;;; Copyright © 2016, 2018, 2019, 2020 Ricardo Wurmus <rekado@elephly.net>
;;; Copyright © 2017 Roel Janssen <roel@gnu.org>
;;; Copyright © 2019 Arm Ltd <David.Truby@arm.com>
;;; Copyright © 2019 Mathieu Othacehe <m.othacehe@gmail.com>
;;; Copyright © 2019 Brett Gilio <brettg@gnu.org>
+;;; Copyright © 2020 Giacomo Leidi <goodoldpaul@autistici.org>
+;;; Copyright © 2020 Jakub Kądziołka <kuba@kadziolka.net>
;;;
;;; This file is part of GNU Guix.
;;;
("powerpc" => "PowerPC")
("riscv" => "RISCV")
("x86_64" => "X86")
- ("i686" => "X86"))))
+ ("i686" => "X86")
+ ("i586" => "X86"))))
(define (llvm-download-uri component version)
(if (version>=? version "9.0.1")
(string-append "https://releases.llvm.org/" version "/" component "-"
version ".src.tar.xz")))
-(define-public llvm
+(define-public llvm-10
(package
(name "llvm")
- (version "9.0.1")
+ (version "10.0.0")
(source
(origin
(method url-fetch)
(uri (llvm-download-uri "llvm" version))
(sha256
(base32
- "16hwp3qa54c3a3v7h8nlw0fh5criqh0hlr1skybyk0cz70gyx880"))))
+ "1pwgm6cr0xr5a0hrbqs1zvsvvjvy0yq1y47c96804wcs795s90yz"))))
(build-system cmake-build-system)
(outputs '("out" "opt-viewer"))
(native-inputs
(supported-systems (delete "mips64el-linux" %supported-systems))))
(define* (clang-from-llvm llvm clang-runtime hash
- #:key (patches '()))
+ #:key (patches '()) tools-extra)
+ "Produce Clang with dependencies on LLVM and CLANG-RUNTIME, and applying the
+given PATCHES. When TOOLS-EXTRA is given, it must point to the
+'clang-tools-extra' tarball, which contains code for 'clang-tidy', 'pp-trace',
+'modularize', and other tools."
(package
(name "clang")
(version (package-version llvm))
;; doesn't seem to be any way to do this with clang's autotools-based
;; build system.
(build-system cmake-build-system)
+ (outputs (if tools-extra '("out" "extra") '("out")))
(native-inputs (package-native-inputs llvm))
(inputs
`(("libxml2" ,libxml2)
("gcc-lib" ,gcc "lib")
- ,@(package-inputs llvm)))
+ ,@(package-inputs llvm)
+ ,@(if tools-extra
+ `(("clang-tools-extra" ,tools-extra))
+ '())))
(propagated-inputs
`(("llvm" ,llvm)
("clang-runtime" ,clang-runtime)))
#:build-type "Release"
#:phases (modify-phases %standard-phases
+ ,@(if tools-extra
+ `((add-after 'unpack 'add-tools-extra
+ (lambda* (#:key inputs #:allow-other-keys)
+ ;; Unpack the 'clang-tools-extra' tarball under
+ ;; tools/.
+ (let ((extra (assoc-ref inputs
+ "clang-tools-extra")))
+ (invoke "tar" "xf" extra)
+ (rename-file ,(string-append
+ "clang-tools-extra-"
+ (package-version llvm)
+ ".src")
+ "tools/extra")
+ #t)))
+ (add-after 'install 'move-extra-tools
+ (lambda* (#:key outputs #:allow-other-keys)
+ ;; Move the extra tools to the "extra" output.
+ ;; These programs alone weigh in at 296 MiB,
+ ;; because they statically-link a whole bunch of
+ ;; Clang libraries.
+ (let* ((out (assoc-ref outputs "out"))
+ (extra (assoc-ref outputs "extra"))
+ (bin (string-append out "/bin"))
+ (bin* (string-append extra "/bin"))
+ (lib (string-append out "/lib")))
+ (define (move program)
+ (rename-file (string-append bin "/" program)
+ (string-append bin* "/"
+ program)))
+
+ (mkdir-p bin*)
+ (for-each move
+ '("clang-apply-replacements"
+ "clang-change-namespace"
+ "clangd"
+ "clang-doc"
+ "clang-include-fixer"
+ "clang-move"
+ "clang-query"
+ "clang-reorder-fields"
+ "clang-tidy"
+ "find-all-symbols"
+ "modularize"
+ "pp-trace"))
+
+ ;; Remove MiBs of .a files coming from
+ ;; 'clang-tools-extra'.
+ (for-each (lambda (component)
+ (delete-file
+ (string-append lib "/libclang"
+ component ".a")))
+ '("ApplyReplacements"
+ "ChangeNamespace"
+ "Daemon"
+ "DaemonTweaks"
+ "Doc"
+ "IncludeFixer"
+ "IncludeFixerPlugin"
+ "Move"))
+ (for-each delete-file
+ (find-files
+ lib
+ "^(libfindAllSymbols|libclangTidy)"))
+ #t))))
+ '())
(add-after 'unpack 'add-missing-triplets
(lambda _
;; Clang iterates through known triplets to search for
(("@GLIBC_LIBDIR@")
(string-append libc "/lib"))))))
#t)))
+ ,@(if (version>? version "3.8")
+ `((add-after 'install 'symlink-cfi_blacklist
+ (lambda* (#:key inputs outputs #:allow-other-keys)
+ (let* ((out (assoc-ref outputs "out"))
+ (lib-share (string-append out "/lib/clang/"
+ ,version "/share"))
+ (compiler-rt (assoc-ref inputs "clang-runtime"))
+ ;; The location varies between Clang versions.
+ (cfi-blacklist
+ (cond
+ ((file-exists?
+ (string-append compiler-rt "/cfi_blacklist.txt"))
+ (string-append compiler-rt "/cfi_blacklist.txt"))
+ (else (string-append compiler-rt
+ "/share/cfi_blacklist.txt")))))
+ (mkdir-p lib-share)
+ ;; Symlink cfi_blacklist.txt to where Clang expects
+ ;; to find it.
+ (symlink cfi-blacklist
+ (string-append lib-share "/cfi_blacklist.txt"))
+ #t))))
+ '())
(add-after 'install 'install-clean-up-/share/clang
(lambda* (#:key outputs #:allow-other-keys)
(let* ((out (assoc-ref outputs "out"))
("libc-debug" ,glibc "debug")
("libc-static" ,glibc "static")))))
-(define-public clang-runtime
+(define-public clang-runtime-10
(clang-runtime-from-llvm
- llvm
+ llvm-10
+ "0x9c531k6ww21s2mkdwqx1vbdjmx6d4wmfb8gdbj0wqa796sczba"))
+
+(define-public clang-10
+ (clang-from-llvm llvm-10 clang-runtime-10
+ "08fbxa2a0kr3ni35ckppj0kyvlcyaywrhpqwcdrdy0z900mhcnw8"
+ #:patches '("clang-10.0-libc-search-path.patch")
+ #:tools-extra
+ (origin
+ (method url-fetch)
+ (uri (llvm-download-uri "clang-tools-extra"
+ (package-version llvm-10)))
+ (sha256
+ (base32
+ "074ija5s2jsdn0k035r2dzmryjmqxdnyg4xwvaqych2bazv8rpxc")))))
+
+(define-public clang-toolchain-10
+ (make-clang-toolchain clang-10))
+
+(define-public llvm-9
+ (package
+ (inherit llvm-10)
+ (version "9.0.1")
+ (source
+ (origin
+ (method url-fetch)
+ (uri (llvm-download-uri "llvm" version))
+ (sha256
+ (base32
+ "16hwp3qa54c3a3v7h8nlw0fh5criqh0hlr1skybyk0cz70gyx880"))
+ (patch-flags '("-p2"))
+ (patches (search-patches
+ "llvm-9-fix-bitcast-miscompilation.patch"
+ "llvm-9-fix-scev-miscompilation.patch"
+ "llvm-9-fix-lpad-miscompilation.patch"))))))
+
+(define-public clang-runtime-9
+ (clang-runtime-from-llvm
+ llvm-9
"0xwh79g3zggdabxgnd0bphry75asm1qz7mv3hcqihqwqr6aspgy2"
'("clang-runtime-9-libsanitizer-mode-field.patch")))
-(define-public clang
- (clang-from-llvm llvm clang-runtime
+(define-public clang-9
+ (clang-from-llvm llvm-9 clang-runtime-9
"0ls2h3iv4finqyflyhry21qhc9cm9ga7g1zq21020p065qmm2y2p"
#:patches '("clang-9.0-libc-search-path.patch")))
-(define-public clang-toolchain
- (make-clang-toolchain clang))
+(define-public clang-toolchain-9
+ (make-clang-toolchain clang-9))
-(define-public llvm-9 llvm)
-(define-public clang-runtime-9 clang-runtime)
-(define-public clang-9 clang)
-(define-public clang-toolchain-9 clang-toolchain)
+;; Default LLVM and Clang version.
+(define-public llvm llvm-9)
+(define-public clang-runtime clang-runtime-9)
+(define-public clang clang-9)
+(define-public clang-toolchain clang-toolchain-9)
+
+(define-public lld
+ (package
+ (name "lld")
+ (version (package-version llvm-10))
+ (source (origin
+ (method url-fetch)
+ (uri (llvm-download-uri "lld" version))
+ (sha256
+ (base32
+ "026pwcbczcg0j5c9h7hxxrn3ki81ia9m9sfn0sy0bvzffv2xg85r"))))
+ (build-system cmake-build-system)
+ (inputs
+ `(("llvm" ,llvm-10)))
+ (arguments
+ `(#:build-type "Release"
+ ;; TODO: Tests require the lit tool, which isn't installed by the LLVM
+ ;; package.
+ #:tests? #f))
+ (home-page "https://lld.llvm.org/")
+ (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
(define-public llvm-8
(package
llvm-3.5
"1hsdnzzdr5kglz6fnv3lcsjs222zjsy14y8ax9dy6zqysanplbal"
'("clang-runtime-asan-build-fixes.patch"
+ "clang-runtime-3.5-libsanitizer-mode-field.patch"
"clang-3.5-libsanitizer-ustat-fix.patch"))))
(package
(inherit runtime)
#:patches '("clang-3.5-libc-search-path.patch")))
(define-public llvm-for-extempore
- (package (inherit llvm-3.7)
+ (package (inherit llvm-3.8)
(name "llvm-for-extempore")
(source
(origin
- (inherit (package-source llvm-3.7))
- (patches (list (search-patch "llvm-for-extempore.patch")))))
+ (method url-fetch)
+ (uri (string-append "http://extempore.moso.com.au/extras/"
+ "llvm-3.8.0.src-patched-for-extempore.tar.xz"))
+ (sha256
+ (base32
+ "1svdl6fxn8l01ni8mpm0bd5h856ahv3h9sdzgmymr6fayckjvqzs"))))
;; Extempore refuses to build on architectures other than x86_64
(supported-systems '("x86_64-linux"))))
(base32
"0d2bj5i6mk4caq7skd5nsdmz8c2m5w5anximl5wz3x32p08zz089"))))
(build-system cmake-build-system)
+ (arguments
+ `(#:phases
+ (modify-phases (@ (guix build cmake-build-system) %standard-phases)
+ (add-after 'set-paths 'adjust-CPLUS_INCLUDE_PATH
+ (lambda* (#:key inputs #:allow-other-keys)
+ (let ((gcc (assoc-ref inputs "gcc")))
+ ;; Hide GCC's C++ headers so that they do not interfere with
+ ;; the ones we are attempting to build.
+ (setenv "CPLUS_INCLUDE_PATH"
+ (string-join (delete (string-append gcc "/include/c++")
+ (string-split (getenv "CPLUS_INCLUDE_PATH")
+ #\:))
+ ":"))
+ (format #t
+ "environment variable `CPLUS_INCLUDE_PATH' changed to ~a~%"
+ (getenv "CPLUS_INCLUDE_PATH"))
+ #t))))))
(native-inputs
`(("clang" ,clang)
("llvm" ,llvm)))
(origin
(method git-fetch)
(uri (git-reference
- (url "https://github.com/llvm/llvm-project.git")
+ (url "https://github.com/llvm/llvm-project")
(commit (string-append "llvmorg-" version))))
(file-name (git-file-name name version))
(sha256
`(#:tests? #f))
(inputs
`(("llvm"
- ,(package
- (inherit llvm-7)
- (source (origin
- (inherit (package-source llvm-7))
- (patches
- (list
- (origin
- (method url-fetch)
- (uri (string-append "https://raw.githubusercontent.com/numba/"
- "llvmlite/v" version "/conda-recipes/"
- "D47188-svml-VF.patch"))
- (sha256
- (base32
- "0wxhgb61k17f0zg2m0726sf3hppm41f8jar2kkg2n8sl5cnjj9mr")))
- (origin
- (method url-fetch)
- (uri (string-append "https://raw.githubusercontent.com/numba/"
- "llvmlite/v" version "/conda-recipes/"
- "twine_cfg_undefined_behavior.patch"))
- (sha256
- (base32
- "07h71n2m1mn9zcfgw04zglffknplb233zqbcd6pckq0wygkrxflp")))))))))))
+ ,(let ((patches-commit "486edd5fb2a6667feb5c865f300c0da73785434a"))
+ (package
+ (inherit llvm-7)
+ (source
+ (origin
+ (inherit (package-source llvm-7))
+ (patches
+ (list
+ (origin
+ (method url-fetch)
+ (uri (string-append
+ "https://raw.githubusercontent.com/numba/"
+ "llvmlite/" patches-commit "/conda-recipes/"
+ "D47188-svml-VF.patch"))
+ (sha256
+ (base32
+ "0wxhgb61k17f0zg2m0726sf3hppm41f8jar2kkg2n8sl5cnjj9mr")))
+ (origin
+ (method url-fetch)
+ (uri (string-append
+ "https://raw.githubusercontent.com/numba/"
+ "llvmlite/" patches-commit "/conda-recipes/"
+ "twine_cfg_undefined_behavior.patch"))
+ (sha256
+ (base32
+ "07h71n2m1mn9zcfgw04zglffknplb233zqbcd6pckq0wygkrxflp"))))))))))))
(home-page "http://llvmlite.pydata.org")
(synopsis "Wrapper around basic LLVM functionality")
(description
"This package provides a Python binding to LLVM for use in Numba.")
(license license:bsd-3)))
-(define (package-elisp-from-package source-package package-name
- source-files)
- "Return a package definition named PACKAGE-NAME that packages the Emacs Lisp
-SOURCE-FILES found in SOURCE-PACKAGE."
- (let ((orig (package-source source-package)))
- (package
- (inherit source-package)
- (name package-name)
- (build-system emacs-build-system)
- (source (origin
- (method (origin-method orig))
- (uri (origin-uri orig))
- (sha256 (origin-sha256 orig))
- (file-name (string-append package-name "-"
- (package-version source-package)))
- (modules '((guix build utils)
- (srfi srfi-1)
- (ice-9 ftw)))
- (snippet
- `(let* ((source-files (quote ,source-files))
- (basenames (map basename source-files)))
- (map copy-file
- source-files basenames)
- (map delete-file-recursively
- (fold delete
- (scandir ".")
- (append '("." "..") basenames)))
- #t)))))))
-
(define-public emacs-clang-format
(package
(inherit clang)
(string-append clang "/bin/clang-format"))))
#t)))))
(synopsis "Format code using clang-format")
- (description "This package allows to filter code through @code{clang-format}
+ (description "This package filters code through @code{clang-format}
to fix its formatting. @code{clang-format} is a tool that formats
C/C++/Obj-C code according to a set of style options, see
@url{https://clang.llvm.org/docs/ClangFormatStyleOptions.html}.")))