diff options
Diffstat (limited to 'gnu/packages/llvm.scm')
-rw-r--r-- | gnu/packages/llvm.scm | 649 |
1 files changed, 531 insertions, 118 deletions
diff --git a/gnu/packages/llvm.scm b/gnu/packages/llvm.scm index 617dfb6974..051bbfeab5 100644 --- a/gnu/packages/llvm.scm +++ b/gnu/packages/llvm.scm @@ -16,9 +16,12 @@ ;;; Copyright © 2019 Brett Gilio <brettg@gnu.org> ;;; Copyright © 2020 Giacomo Leidi <goodoldpaul@autistici.org> ;;; Copyright © 2020 Jakub Kądziołka <kuba@kadziolka.net> -;;; Copyright © 2020 Maxim Cournoyer <maxim.cournoyer@gmail.com> +;;; Copyright © 2021 Maxime Devos <maximedevos@telenet.be> +;;; Copyright © 2020, 2021 Maxim Cournoyer <maxim.cournoyer@gmail.com> ;;; Copyright © 2021 Julien Lepiller <julien@lepiller.eu> ;;; Copyright © 2021 Lars-Dominik Braun <lars@6xq.net> +;;; Copyright © 2021 Guillaume Le Vaillant <glv@posteo.net> +;;; Copyright © 2021 Maxim Cournoyer <maxim.cournoyer@gmail.com> ;;; ;;; This file is part of GNU Guix. ;;; @@ -39,6 +42,7 @@ #:use-module (guix packages) #:use-module ((guix licenses) #:prefix license:) #:use-module (guix download) + #:use-module (guix gexp) #:use-module (guix git-download) #:use-module (guix memoization) #:use-module (guix utils) @@ -51,7 +55,9 @@ #:use-module (gnu packages base) #:use-module (gnu packages gcc) #:use-module (gnu packages bootstrap) ;glibc-dynamic-linker + #:use-module (gnu packages check) ;python-lit #:use-module (gnu packages compression) + #:use-module (gnu packages julia) ;julia-patch #:use-module (gnu packages libedit) #:use-module (gnu packages libffi) #:use-module (gnu packages lua) @@ -64,7 +70,10 @@ #:use-module (gnu packages python) #:use-module (gnu packages swig) #:use-module (gnu packages xml) - #:export (system->llvm-target)) + #:use-module (srfi srfi-1) + #:use-module (ice-9 match) + #:export (make-lld-wrapper + system->llvm-target)) (define* (system->llvm-target #:optional (system (or (and=> (%current-target-system) @@ -107,7 +116,7 @@ as \"x86_64-linux\"." (build-system cmake-build-system) (native-inputs (package-native-inputs llvm)) (inputs - `(("llvm" ,llvm))) + (list llvm)) (arguments `(;; Don't use '-g' during the build to save space. #:build-type "Release" @@ -177,8 +186,7 @@ given PATCHES. When TOOLS-EXTRA is given, it must point to the `(("clang-tools-extra" ,tools-extra)) '()))) (propagated-inputs - `(("llvm" ,llvm) - ("clang-runtime" ,clang-runtime))) + (list llvm clang-runtime)) (arguments `(#:configure-flags (list "-DCLANG_INCLUDE_TESTS=True" @@ -492,20 +500,37 @@ output), and Binutils.") (build-system cmake-build-system) (outputs '("out" "opt-viewer")) (native-inputs - `(("python" ,python) + `(("python" ,python-wrapper) ("perl" ,perl))) (inputs - `(("libffi" ,libffi))) + (list libffi)) (propagated-inputs - `(("zlib" ,zlib))) ;to use output from llvm-config + (list zlib)) ;to use output from llvm-config (arguments - `(#:configure-flags '("-DCMAKE_SKIP_BUILD_RPATH=FALSE" - "-DCMAKE_BUILD_WITH_INSTALL_RPATH=FALSE" - "-DBUILD_SHARED_LIBS:BOOL=TRUE" - "-DLLVM_ENABLE_FFI:BOOL=TRUE" - "-DLLVM_REQUIRES_RTTI=1" ; For some third-party utilities - "-DLLVM_INSTALL_UTILS=ON") ; Needed for rustc. - + ;; TODO(core-updates): Unconditionally use quasiquote + `(#:configure-flags + ,#~(#$(if (%current-target-system) + #~quasiquote + #~quote) + ;; These options are required for cross-compiling LLVM according to + ;; https://llvm.org/docs/HowToCrossCompileLLVM.html. + (#$@(if (%current-target-system) + #~(,(string-append "-DLLVM_TABLEGEN=" + #+(file-append this-package + "/bin/llvm-tblgen")) + #$(string-append "-DLLVM_DEFAULT_TARGET_TRIPLE=" + (%current-target-system)) + #$(string-append "-DLLVM_TARGET_ARCH=" + (system->llvm-target)) + #$(string-append "-DLLVM_TARGETS_TO_BUILD=" + (system->llvm-target))) + #~()) + "-DCMAKE_SKIP_BUILD_RPATH=FALSE" + "-DCMAKE_BUILD_WITH_INSTALL_RPATH=FALSE" + "-DBUILD_SHARED_LIBS:BOOL=TRUE" + "-DLLVM_ENABLE_FFI:BOOL=TRUE" + "-DLLVM_REQUIRES_RTTI=1" ; For some third-party utilities + "-DLLVM_INSTALL_UTILS=ON")) ; Needed for rustc. ;; Don't use '-g' during the build, to save space. #:build-type "Release" #:phases @@ -571,11 +596,7 @@ of programming tools as well as libraries with equivalent functionality.") (uri (llvm-uri "llvm" version)) (sha256 (base32 - "0s94lwil98w7zb7cjrbnxli0z7gklb312pkw74xs1d6zk346hgwi")))) - (native-inputs - `(;; TODO: Switch to Python 3 in the next rebuild cycle. - ("python" ,python-2) - ("perl" ,perl))))) + "0s94lwil98w7zb7cjrbnxli0z7gklb312pkw74xs1d6zk346hgwi")))))) (define-public clang-runtime-11 (clang-runtime-from-llvm @@ -601,23 +622,23 @@ of programming tools as well as libraries with equivalent functionality.") (define-public llvm-10 (package (inherit llvm-11) - (version "10.0.0") + (version "10.0.1") (source (origin (method url-fetch) (uri (llvm-uri "llvm" version)) (sha256 (base32 - "1pwgm6cr0xr5a0hrbqs1zvsvvjvy0yq1y47c96804wcs795s90yz")))))) + "1wydhbp9kyjp5y0rc627imxgkgqiv3dfirbqil9dgpnbaw5y7n65")))))) (define-public clang-runtime-10 (clang-runtime-from-llvm llvm-10 - "0x9c531k6ww21s2mkdwqx1vbdjmx6d4wmfb8gdbj0wqa796sczba")) + "1yjqjri753w0fzmxcyz687nvd97sbc9rsqrxzpq720na47hwh3fr")) (define-public clang-10 (clang-from-llvm llvm-10 clang-runtime-10 - "08fbxa2a0kr3ni35ckppj0kyvlcyaywrhpqwcdrdy0z900mhcnw8" + "091bvcny2lh32zy8f3m9viayyhb2zannrndni7325rl85cwgr6pr" #:patches '("clang-10.0-libc-search-path.patch") #:tools-extra (origin @@ -626,7 +647,7 @@ of programming tools as well as libraries with equivalent functionality.") (package-version llvm-10))) (sha256 (base32 - "074ija5s2jsdn0k035r2dzmryjmqxdnyg4xwvaqych2bazv8rpxc"))))) + "06n1yp638rh24xdxv9v2df0qajxbjz4w59b7dd4ky36drwmpi4yh"))))) (define-public clang-toolchain-10 (make-clang-toolchain clang-10)) @@ -825,6 +846,8 @@ of programming tools as well as libraries with equivalent functionality.") (origin (method url-fetch) (uri (llvm-uri "llvm" version)) + (patches + (search-patches "llvm-3.6-fix-build-with-gcc-10.patch")) (sha256 (base32 "153vcvj8gvgwakzr4j0kndc0b7wn91c2g1vy2vg24s6spxcc23gn")))))) @@ -859,14 +882,13 @@ of programming tools as well as libraries with equivalent functionality.") (add-after 'unpack 'find-rpc-includes (lambda* (#:key inputs #:allow-other-keys) (setenv "CPATH" - (string-append (assoc-ref inputs "libtirpc") - "/include/tirpc/:" - (or (getenv "CPATH") ""))) + (string-append + (search-input-directory inputs "/include/tirpc") + ":" (or (getenv "CPATH") ""))) (setenv "CPLUS_INCLUDE_PATH" - (string-append (assoc-ref inputs "libtirpc") - "/include/tirpc/:" - (or (getenv "CPLUS_INCLUDE_PATH") ""))) - #t)))))) + (string-append + (search-input-directory inputs "/include/tirpc") + ":" (or (getenv "CPLUS_INCLUDE_PATH") ""))))))))) (inputs `(("libtirpc" ,libtirpc) ("llvm" ,llvm-3.5)))))) @@ -961,9 +983,9 @@ of programming tools as well as libraries with equivalent functionality.") (native-inputs ;; Note: check <https://bugs.llvm.org/show_bug.cgi?id=49228> to see ;; whether this is still necessary. - `(("libunwind-headers" ,libunwind-headers))) + (list libunwind-headers)) (inputs - `(("llvm" ,llvm-12))) + (list llvm-12)) (arguments `(#:build-type "Release" ;; TODO: Tests require the lit tool, which isn't installed by the LLVM @@ -975,6 +997,46 @@ 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* (make-lld-wrapper lld #:key lld-as-ld?) + "Return a LLD wrapper. When LLD-AS-LD? is true, create a 'ld' symlink that +points to 'lld'." + (package + (name (if lld-as-ld? "lld-as-ld-wrapper" "lld-wrapper")) + (version "0") + (source #f) + (build-system trivial-build-system) + (inputs (list (make-ld-wrapper "ld.lld-wrapper" #:binutils lld + #:linker "ld.lld") + (make-ld-wrapper "lld-wrapper" #:binutils lld #:linker + "lld"))) + (arguments + (list #:builder + #~(let ((ld.lld (string-append #$(this-package-input + "ld.lld-wrapper") + "/bin/ld.lld")) + (lld (string-append #$(this-package-input "lld-wrapper") + "/bin/lld"))) + (mkdir #$output) + (mkdir (string-append #$output "/bin")) + (symlink ld.lld (string-append #$output "/bin/ld.lld")) + (symlink lld (string-append #$output "/bin/lld")) + (when #$lld-as-ld? + (symlink ld.lld (string-append #$output "/bin/ld")))))) + (synopsis "LLD linker wrapper") + (description "This is a linker wrapper for LLD; like @code{ld-wrapper}, it +wraps the linker to add any missing @code{-rpath} flags, and to detect any +misuse of libraries outside of the store.") + (home-page "https://www.gnu.org/software/guix/") + (license license:gpl3+))) + +;;; A LLD wrapper suitable to use with -fuse-ld and GCC or with Clang. +(define-public lld-wrapper + (make-lld-wrapper lld)) + +;;; A LLD wrapper that can be used as a (near) drop-in replacement to GNU ld. +(define-public lld-as-ld-wrapper + (make-lld-wrapper lld #:lld-as-ld? #t)) + (define-public lldb (package (name "lldb") @@ -989,8 +1051,7 @@ components which highly leverage existing libraries in the larger LLVM Project." (arguments `(#:configure-flags '("-DCMAKE_CXX_COMPILER=clang++"))) (native-inputs - `(("pkg-config" ,pkg-config) - ("swig" ,swig))) + (list pkg-config swig)) (inputs `(("clang" ,clang-12) ("llvm" ,llvm-12) @@ -1039,8 +1100,7 @@ which highly leverage existing libraries in the larger LLVM project.") (getenv "CPLUS_INCLUDE_PATH")) #t)))))) (native-inputs - `(("clang" ,clang) - ("llvm" ,llvm))) + (list clang llvm)) (home-page "https://libcxx.llvm.org") (synopsis "C++ standard library") (description @@ -1061,8 +1121,7 @@ use with Clang, targeting C++11, C++14 and above.") (base32 "0rzw4qvxp6qx4l4h9amrq02gp7hbg8lw4m0sy3k60f50234gnm3n")))) (native-inputs - `(("clang" ,clang-6) - ("llvm" ,llvm-6))))) + (list clang-6 llvm-6)))) (define-public libcxxabi-6 (package @@ -1113,9 +1172,7 @@ use with Clang, targeting C++11, C++14 and above.") (install-file "../libcxxabi/include/__cxxabi_config.h" include-dir) (install-file "../libcxxabi/include/cxxabi.h" include-dir))))))) (native-inputs - `(("clang" ,clang-6) - ("llvm" ,llvm-6) - ("libcxx" ,libcxx-6))) + (list clang-6 llvm-6 libcxx-6)) (home-page "https://libcxxabi.llvm.org") (synopsis "C++ standard library support") (description @@ -1151,9 +1208,7 @@ standard C++ library.") "environment variable `CPLUS_INCLUDE_PATH' changed to ~a~%" (getenv "CPLUS_INCLUDE_PATH")))))))) (native-inputs - `(("clang" ,clang-6) - ("llvm" ,llvm-6) - ("libcxxabi" ,libcxxabi-6))))) + (list clang-6 llvm-6 libcxxabi-6)))) (define-public libclc (package @@ -1183,9 +1238,7 @@ standard C++ library.") (add-after 'unpack 'chdir (lambda _ (chdir "libclc") #t))))) (native-inputs - `(("clang" ,clang) - ("llvm" ,llvm) - ("python" ,python))) + (list clang llvm python)) (home-page "https://libclc.llvm.org") (synopsis "Libraries for the OpenCL programming language") (description @@ -1214,12 +1267,9 @@ requirements according to version 1.1 of the OpenCL specification.") "-DOPENMP_TEST_CXX_COMPILER=clang++") #:test-target "check-libomp")) (native-inputs - `(("clang" ,clang) - ("llvm" ,llvm) - ("perl" ,perl) - ("pkg-config" ,pkg-config))) + (list clang llvm perl pkg-config)) (inputs - `(("hwloc" ,hwloc "lib"))) + (list `(,hwloc "lib"))) (home-page "https://openmp.llvm.org") (synopsis "OpenMP run-time support library") (description @@ -1232,14 +1282,14 @@ with that of libgomp, the GNU Offloading and Multi Processing Library.") (define-public python-llvmlite (package (name "python-llvmlite") - (version "0.34.0") + (version "0.37.0") (source (origin (method url-fetch) (uri (pypi-uri "llvmlite" version)) (sha256 (base32 - "0qqzs6h34002ig2jn31vk08q9hh5kn84lhmv4bljz3yakg8y0gph")))) + "05avhsvdcqh8wfpblx16qslfq3masqcbkfyn8p3c13h1rmqbi4k3")))) (build-system python-build-system) (arguments `(#:phases @@ -1258,69 +1308,124 @@ with that of libgomp, the GNU Offloading and Multi Processing Library.") "binding/libllvmlite.so"))) (substitute* "llvmlite/binding/ffi.py" (("_lib_name = get_library_name\\(\\)") - (format #f "_lib_name = ~s" libllvmlite.so))) - #t))) + (format #f "_lib_name = ~s" libllvmlite.so)))))) (add-after 'unpack 'skip-failing-tests (lambda _ (substitute* "llvmlite/tests/test_binding.py" ((" def test_libm\\(self\\).*" all) - (string-append " @unittest.skip('Fails on Guix')\n" all))) - #t)) + (string-append " @unittest.skip('Fails on Guix')\n" all))))) (add-before 'build 'set-compiler/linker-flags (lambda* (#:key inputs #:allow-other-keys) (let ((llvm (assoc-ref inputs "llvm"))) ;; Refer to ffi/Makefile.linux. (setenv "CPPFLAGS" "-fPIC") (setenv "LDFLAGS" (string-append "-Wl,-rpath=" - llvm "/lib")) - #t)))))) + llvm "/lib")))))))) (inputs - `(("llvm" - ,(let* ((patches-commit "061ab39e1d4591f3aa842458252a19ad01858167") - (patch-uri (lambda (name) - (string-append - "https://raw.githubusercontent.com/numba/" - "llvmlite/" patches-commit "/conda-recipes/" - name))) - (patch-origin (lambda (name hash) - (origin - (method url-fetch) - (uri (patch-uri name)) - (sha256 (base32 hash))))) - (arch-independent-patches - (list - (patch-origin - "partial-testing.patch" - "1cwy4jsmijd838q0bylxl77vrwrb7ksijfly5062ay32303jmj86") - (patch-origin - "0001-Revert-Limit-size-of-non-GlobalValue-name.patch" - "0n4k7za0smx6qwdipsh6x5lm7bfvzzb3p9r8q1zq1dqi4na21295")))) - (if (string=? "aarch64-linux" (%current-system)) - (package - (inherit llvm-9) - (source - (origin - (inherit (package-source llvm-9)) - (patches - `(,(patch-origin - "intel-D47188-svml-VF_LLVM9.patch" - "1f9ld7wc8bn4gbvdsmk07w1rq371h42vy05rxsq9a22f57rljqbd") - ,@arch-independent-patches - ,@(origin-patches (package-source llvm-9))))))) - (package - (inherit llvm-10) - (source - (origin - (inherit (package-source llvm-10)) - (patches - `(,(patch-origin - "intel-D47188-svml-VF.patch" - "0n46qjwfl7i12bl7wp0cyxl277axfvaaz5lxx5kdlgwjcpa582dg") - ,(patch-origin - "expect-fastmath-entrypoints-in-add-TLI-mappings.ll.patch" - "0jxhjkkwwi1cy898l2n57l73ckpw0v73lqnrifp7r1mwpsh624nv") - ,@arch-independent-patches - ,@(origin-patches (package-source llvm-10)))))))))))) + (list (let* ((patches-commit + "a4a19e8af2c5ef9b9901f20193e4be070726da97") ( + patch-uri ( + lambda ( + name) + ( + string-append + "https://raw.githubusercontent.com/numba/" + "llvmlite/" + patches-commit + "/conda-recipes/" + name))) + ( + patch-origin ( + lambda ( + name + hash) + ( + origin ( + method + url-fetch) + ( + uri ( + patch-uri + name)) + ( + sha256 ( + base32 + hash))))) + ( + arch-independent-patches ( + list ( + patch-origin + "partial-testing.patch" + "0g3nkci87knvmn7piqhmh4bcc65ff8r921cvfcibyiv65klv3syg") + ( + patch-origin + "0001-Revert-Limit-size-of-non-GlobalValue-name.patch" + "0n4k7za0smx6qwdipsh6x5lm7bfvzzb3p9r8q1zq1dqi4na21295")))) + (package (inherit llvm-11) + (source (origin (inherit (package-source + llvm-11)) + (patches (if (string=? + "aarch64-linux" + ( + %current-system)) + `(,(patch-origin + "intel-D47188-svml-VF_LLVM9.patch" + "0gnnlfxr8p1a7ls93hzcpfqpa8r0icypfwj8l9cmkslq5sz8p64r") ( + unquote-splicing + arch-independent-patches) + ( + unquote-splicing ( + origin-patches ( + package-source + llvm-11)))) + `(,(patch-origin + "intel-D47188-svml-VF.patch" + "0gnnlfxr8p1a7ls93hzcpfqpa8r0icypfwj8l9cmkslq5sz8p64r") ,( + patch-origin + "expect-fastmath-entrypoints-in-add-TLI-mappings.ll.patch" + "0jxhjkkwwi1cy898l2n57l73ckpw0v73lqnrifp7r1mwpsh624nv") + ( + unquote-splicing + arch-independent-patches) + ( + unquote-splicing ( + origin-patches ( + package-source + llvm-11)))))))) + (arguments (substitute-keyword-arguments ( + package-arguments + llvm-11) + ((#:phases + phases) `( + modify-phases , + phases + ( + add-after ' + unpack + ' + patch-round-two + ;; We have to do the patching in two rounds because we can't + ;; pass '-p1' and '-p2' in the source field. + ( + lambda* ( + #:key + inputs + #:allow-other-keys) + ( + invoke + "patch" + ( + assoc-ref + inputs + "llvm_11_consecutive_registers") + "-p2"))))))) + (native-inputs `(("llvm_11_consecutive_registers" ,( + patch-origin + "llvm_11_consecutive_registers.patch" + "04msd34dnpr3lpss0pam3mckwnvzrab266z6sml1hya0akv0m3f3")) ( + unquote-splicing ( + package-native-inputs + llvm-11)))))))) (home-page "https://llvmlite.pydata.org") (synopsis "Wrapper around basic LLVM functionality") (description @@ -1354,7 +1459,7 @@ setup(name=\"clang\", packages=[\"clang\"])\n"))))) (substitute* "clang/cindex.py" (("libclang\\.so") (string-append clang "/lib/libclang.so"))))))))) - (inputs `(("clang" ,clang))) + (inputs (list clang)) (synopsis "Python bindings to libclang"))) (define-public python-clang-10 @@ -1372,7 +1477,7 @@ setup(name=\"clang\", packages=[\"clang\"])\n"))))) (name "emacs-clang-format") (build-system emacs-build-system) (inputs - `(("clang" ,clang))) + (list clang)) (arguments `(#:phases (modify-phases %standard-phases @@ -1396,7 +1501,7 @@ C/C++/Obj-C code according to a set of style options, see (name "emacs-clang-rename") (build-system emacs-build-system) (inputs - `(("clang" ,clang))) + (list clang)) (arguments `(#:phases (modify-phases %standard-phases @@ -1412,6 +1517,11 @@ C/C++/Obj-C code according to a set of style options, see (description "This package renames every occurrence of a symbol at point using @code{clang-rename}."))) + +;;; +;;; LLVM variants. +;;; + (define make-ocaml-llvm ;; Make it a memoizing procedure so its callers below don't end up defining ;; two equal-but-not-eq "ocaml-llvm" packages for the default LLVM. @@ -1438,15 +1548,11 @@ using @code{clang-rename}."))) (lambda _ (invoke "cmake" "-P" "bindings/ocaml/cmake_install.cmake")))))) (inputs - `(("llvm" ,llvm))) + (list llvm)) (native-inputs - `(("ocaml" ,ocaml) - ("ocaml-findlib" ,ocaml-findlib) - ("ocaml-ounit" ,ocaml-ounit) - ("python" ,python))) + (list ocaml ocaml-findlib ocaml-ounit python)) (propagated-inputs - `(("ocaml-integers" ,ocaml-integers) - ("ocaml-ctypes" ,ocaml-ctypes))) + (list ocaml-integers ocaml-ctypes)) (synopsis "OCaml bindings to LLVM") (description "This package contains the OCaml bindings distributed with LLVM.")))) @@ -1455,3 +1561,310 @@ LLVM.")))) (define-public ocaml-llvm-9 (make-ocaml-llvm llvm-9)) (define-public ocaml-llvm-10 (make-ocaml-llvm llvm-10)) (define-public ocaml-llvm-11 (make-ocaml-llvm llvm-11)) + +(define-public llvm-julia + (package + (inherit llvm-11) + (name "llvm-julia") + (properties `((hidden? . #t) + ,@(package-properties llvm-11))) + (source (origin + (inherit (package-source llvm-11)) + ;; Those patches are inside the Julia source repo. + ;; They are _not_ Julia specific (https://github.com/julialang/julia#llvm) + ;; but they are required to build Julia. + ;; Discussion: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=919628 + (patches + (map (match-lambda + ((name hash) + (julia-patch name hash))) + (list + '("llvm-D27629-AArch64-large_model_6.0.1" + "1qrshmlqvnasdyc158vfn3hnbigqph3lsq7acb9w8lwkpnnm2j4z") + '("llvm8-D34078-vectorize-fdiv" + "19spqc3xsazn1xs9gpcgv9ldadfkv49rmc5khl7sf1dlmhgi4602") + '("llvm-7.0-D44650" + "1h55kkmkiisfj6sk956if2bcj9s0v6n5czn8dxb870vp5nccj3ir") + '("llvm7-symver-jlprefix" + "00ng32x6xhm9czczirn5r1q1mc1myad44fqhi061hwh1vb46dwgm") + '("llvm-6.0-DISABLE_ABI_CHECKS" + "014fawd1ba7yckalypfld22zgic87x9nx3cim42zrwygywd36pyg") + '("llvm9-D50010-VNCoercion-ni" + "1s1d3sjsiq4vxg7ncy5cz56zgy5vcq6ls3iqaiqkvr23wyryqmdx") + '("llvm7-revert-D44485" + "0f59kq3p3mpwsbmskypbi4zn01l6ig0x7v2rjp08k2r8z8m6fa8n") + '("llvm-11-D75072-SCEV-add-type" + "176xi1lnbnv2rcs05ywhyb7pd0xgmibayvwzksksg44wg2dh8mbx") + '("llvm-julia-tsan-custom-as" + "0awh40kf6lm4wn1nsjd1bmhfwq7rqj811szanp2xkpspykw9hg9s") + '("llvm-D80101" + "1gsdwmgmpbignvqyxcnlprj899259p3dvdznlncd84ss445qgq3j") + '("llvm-D84031" + "0nks9sbk7p0r5gyr0idrmm93a5fmdai8kihz9532dx4zhcvvqbjc") + '("llvm-10-D85553" + "1zjq7j9q2qp56hwkc8yc8f0z7kvam3j7hj8sb7qyd77r255ff78l") + '("llvm-10-unique_function_clang-sa" + "1jys9w2zqk3dasnxqh0qz5ij7rxi6mkgq9pqjsclmamr5169zyan") + ;'("llvm-D88630-clang-cmake" + ; "0rs6s71nqnjkny7i69gqazhqj5jqfdr0bkxs2v5a55sfx8fa1k54") + '("llvm-11-D85313-debuginfo-empty-arange" + "1f672d5385xpgb8yrim8d3b7wg2z1l81agnshm1q61kdvjixqx32") + '("llvm-11-D90722-rtdyld-absolute-relocs" + "0kmnai229yyxkmpk9lxd180mcnhk2i8d87k2sg89gc8as18w10r6") + '("llvm-invalid-addrspacecast-sink" + "1n1b7j4s80vj7x5377aj9vyphmxx1q6bm0chhkxp6zsy3mx3g2ry") + '("llvm-11-D92906-ppc-setjmp" + "0cmd4dsblp7a8m03j16dqxws0ijh55zf4jzzxmj341qxa1gamdp9") + '("llvm-11-PR48458-X86ISelDAGToDAG" + "0vwzvlhsdazhxg4gj8g2f00a4f8qc5cgac23w575xk3pgba1jh6y") + '("llvm-11-D93092-ppc-knownbits" + "1748bypsc7c9lbs3fnkv0kwvch6bn85kj98j4jdaz254ig0wa6xj") + '("llvm-11-D93154-globalisel-as" + "1k5wd4z3pa7zj0gyjkif7viqj906dhqlbb7dc95gig40nbxv6zpj") + '("llvm-11-ppc-half-ctr" + "0piywisfz6cmw3133kz7vzhiqflq2y7igakqxlym0gi8pqylv7w9") + '("llvm-11-ppc-sp-from-bp" + "1wmg3485cx5f9pbykyl3jibk1wwv4w1x30hl4jyfndzr2yh8azf9") + '("llvm-rGb498303066a6-gcc11-header-fix" + "0hkd4rwhvh8g2yh13g29wiwnjpv2yd1hdyiv1ryw8izl25bz9c67") + '("llvm-11-D94813-mergeicmps" + "0cmy0ywkgyrdcvr9bd6pd912lyd4gcsrib4z0v05dwgcdxhk7y29") + '("llvm-11-D94980-CTR-half" + "1yf8cxib3z8hz7zi9n6v2g2c6vpfr4slq9hpx8m8yq8f1jbyw3fw") + '("llvm-11-D94058-sext-atomic-ops" + "1x6p6k6q651z5jcqxx8vj17cxnv196mka7mwn7dpp6c23lwgfdpb") + '("llvm-11-D96283-dagcombine-half" + "0lv4iq2f8qrcz1xyxfic3bcr5p0aqam3a7c6pp6fnw3riixm096k")))) + (patch-flags '("-p1")))) + (arguments + (substitute-keyword-arguments (package-arguments llvm-11) + ((#:phases phases) + `(modify-phases ,phases + (add-after 'unpack 'patch-round-two + ;; We have to do the patching in two rounds because we can't + ;; pass '-p1' and '-p2' in the source field. + (lambda* (#:key inputs #:allow-other-keys) + (map (lambda (patchname) + (invoke "patch" patchname "-p2")) + (list "llvm-11-AArch64-FastIsel-bug" + "llvm-11-D97435-AArch64-movaddrreg" + "llvm-11-D97571-AArch64-loh" + "llvm-11-aarch64-addrspace")))))) + ((#:build-type _) "Release") + ((#:configure-flags flags) + `(list + ;; Build a native compiler and the NVPTX backend (NVIDIA) since + ;; Julia insists on it, nothing more. This reduces build times and + ;; disk usage. + ,(string-append "-DLLVM_TARGETS_TO_BUILD=" (system->llvm-target)) + "-DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=NVPTX" + + "-DLLVM_INSTALL_UTILS=ON" + "-DLLVM_BUILD_TESTS=ON" + "-DLLVM_ENABLE_FFI=ON" + "-DLLVM_ENABLE_RTTI=ON" + ;; "-DLLVM_HOST_TRIPLE=${stdenv.hostPlatform.config}" + ;; "-DLLVM_DEFAULT_TARGET_TRIPLE=${stdenv.hostPlatform.config}" + ;; "-DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=WebAssembly" + "-DLLVM_ENABLE_DUMP=ON" + "-DLLVM_LINK_LLVM_DYLIB=ON" + "-DLLVM_VERSION_SUFFIX:STRING=jl")))) + (inputs + (append + (package-inputs llvm-11) + `(("llvm-11-AArch64-FastIsel-bug" + ,(julia-patch "llvm-11-AArch64-FastIsel-bug" + "1m2vddj1mw4kbij8hbrx82piyy6bvr2x7wwdnlxfaqcm72ipzyh9")) + ("llvm-11-D97435-AArch64-movaddrreg" + ,(julia-patch "llvm-11-D97435-AArch64-movaddrreg" + "10jnavq9ljkj7j2gqj2zd1pwqpqb5zs3zp9h96pmz0djbmxwa86y")) + ("llvm-11-D97571-AArch64-loh" + ,(julia-patch "llvm-11-D97571-AArch64-loh" + "128zcbg1w1j7hngsf7z1a7alc6lig6l2rqgjp6i8nk3k3f842v6n")) + ("llvm-11-aarch64-addrspace" + ,(julia-patch "llvm-11-aarch64-addrspace" + "0ckbzgfirxrf2d5bpinpngp7gnilbjrk0cbdfyl3h6f5v6i6xj6m"))))))) + +(define %cling-version "0.9") + +(define llvm-cling ;LLVM 9 with approximately 10 patches for cling + (let ((base llvm-9)) + (package/inherit base + (name "llvm-cling") + (source + (origin + (inherit (package-source base)) + (method git-fetch) + (uri (git-reference + (url "http://root.cern/git/llvm.git") + (commit (string-append "cling-v" %cling-version)))) + (file-name (git-file-name "llvm-cling" %cling-version)) + (sha256 + (base32 + "0y3iwv3c9152kybmdrwvadggjs163r25h7rmlxzr3hfpr463pnwf")) + (modules '((guix build utils))) + (snippet + ;; The source is missing an include directive (see: + ;; https://github.com/vgvassilev/cling/issues/219). + '(substitute* "utils/benchmark/src/benchmark_register.h" + (("^#include <vector>.*" all) + (string-append all "#include <limits>\n")))))) + (outputs '("out")) + (arguments + (substitute-keyword-arguments (package-arguments base) + ((#:configure-flags _ ''()) + '(list "-DLLVM_PARALLEL_LINK_JOBS=1" ;cater to smaller build machines + ;; Only enable compiler support for the host architecture to + ;; save on build time. + "-DLLVM_TARGETS_TO_BUILD=host;NVPTX" + "-DLLVM_INSTALL_UTILS=ON" + "-DLLVM_ENABLE_RTTI=ON" + "-DLLVM_ENABLE_FFI=ON" + "-DLLVM_BUILD_LLVM_DYLIB=ON" + "-DLLVM_LINK_LLVM_DYLIB=ON")) + ((#:phases phases '%standard-phases) + `(modify-phases ,phases + (delete 'shared-lib-workaround) + (delete 'install-opt-viewer)))))))) + +(define clang-cling-runtime + (let ((base clang-runtime-9)) + (package/inherit base + (name "clang-cling-runtime") + (arguments + (substitute-keyword-arguments (package-arguments base) + ((#:phases phases '%standard-phases) + `(modify-phases ,phases + (add-after 'install 'delete-static-libraries + ;; This reduces the size from 22 MiB to 4 MiB. + (lambda* (#:key outputs #:allow-other-keys) + (let ((out (assoc-ref outputs "out"))) + (for-each delete-file (find-files out "\\.a$"))))))))) + (inputs (modify-inputs (package-inputs base) + (replace "llvm" llvm-cling)))))) + +(define clang-cling ;modified clang 9 with ~ 60 patches for cling + (let ((base clang-9)) + (package/inherit base + (name "clang-cling") + (source + (origin + (inherit (package-source base)) + (method git-fetch) + (uri (git-reference + (url "http://root.cern/git/clang.git") + (commit (string-append "cling-v" %cling-version)))) + (file-name (git-file-name "clang-cling" %cling-version)) + (sha256 + (base32 + "128mxkwghss6589wvm6amzv183aq88rdrnfxjiyjcji5hx84vpby")))) + (arguments + (substitute-keyword-arguments (package-arguments base) + ((#:phases phases '%standard-phases) + `(modify-phases ,phases + (add-after 'install 'delete-static-libraries + ;; This reduces the size by half, from 220 MiB to 112 MiB. + (lambda* (#:key outputs #:allow-other-keys) + (let ((out (assoc-ref outputs "out"))) + (for-each delete-file (find-files out "\\.a$"))))))))) + (propagated-inputs + (modify-inputs (package-propagated-inputs base) + (replace "llvm" llvm-cling) + (replace "clang-runtime" clang-cling-runtime)))))) + +(define-public cling + ;; The tagged v0.9 release doesn't build, so use the latest commit. + (let ((commit "d78d1a03fedfd2bf6d2b6ff295aca576d98940df") + (revision "1") + (version* "0.9")) + (package + (name "cling") + (version (git-version version* revision commit)) + (source (origin + (method git-fetch) + (uri (git-reference + (url "http://root.cern/git/cling.git") + (commit commit))) + (file-name (git-file-name name version)) + (sha256 + (base32 + "0lsbxv21b4qw11xkw9iipdpca64jjwwqxm0qf5v2cgdlibf8m8n9")) + ;; Patch submitted upstream here: + ;; https://github.com/root-project/cling/pull/433. + (patches (search-patches "cling-use-shared-library.patch")))) + (build-system cmake-build-system) + (arguments + `(#:build-type "Release" ;keep the build as lean as possible + #:tests? #f ;FIXME: 78 tests fail (out of ~200) + #:test-target "check-cling" + #:configure-flags + (list (string-append "-DCLING_CXX_PATH=" + (assoc-ref %build-inputs "gcc") "/bin/g++") + ;; XXX: The AddLLVM.cmake module expects LLVM_EXTERNAL_LIT to + ;; be a Python script, not a shell executable. + (string-append "-DLLVM_EXTERNAL_LIT=" + (assoc-ref %build-inputs "python-lit") + "/bin/.lit-real")) + #:phases + (modify-phases %standard-phases + (add-after 'unpack 'set-version + (lambda _ + (make-file-writable "VERSION") + (call-with-output-file "VERSION" + (lambda (port) + (format port "~a~%" ,version))))) + (add-after 'unpack 'patch-paths + (lambda* (#:key inputs #:allow-other-keys) + (substitute* "lib/Interpreter/CIFactory.cpp" + (("\bsed\b") + (which "sed")) + ;; This ensures that the default C++ library used by Cling is + ;; that of the compiler that was used to build it, rather + ;; than that of whatever g++ happens to be on PATH. + (("ReadCompilerIncludePaths\\(CLING_CXX_RLTV") + (string-append "ReadCompilerIncludePaths(\"" + (assoc-ref inputs "gcc") "/bin/g++\"")) + ;; Cling uses libclang's CompilerInvocation::GetResourcesPath + ;; to resolve Clang's library prefix, but this fails on Guix + ;; because it is relative to the output of cling rather than + ;; clang (see: + ;; https://github.com/root-project/cling/issues/434). Fully + ;; shortcut the logic in this method to return the correct + ;; static location. + (("static std::string getResourceDir.*" all) + (string-append all + " return std::string(\"" + (assoc-ref inputs "clang-cling") + "/lib/clang/" ,(package-version clang-cling) + "\");"))) + ;; Check for the 'lit' command for the tests, not 'lit.py' + ;; (see: https://github.com/root-project/cling/issues/432). + (substitute* "CMakeLists.txt" + (("lit.py") + "lit")))) + (add-after 'unpack 'adjust-lit.cfg + ;; See: https://github.com/root-project/cling/issues/435. + (lambda _ + (substitute* "test/lit.cfg" + (("config.llvm_tools_dir \\+ '") + "config.cling_obj_root + '/bin")))) + (add-after 'install 'delete-static-libraries + ;; This reduces the size from 17 MiB to 5.4 MiB. + (lambda* (#:key outputs #:allow-other-keys) + (let ((out (assoc-ref outputs "out"))) + (for-each delete-file (find-files out "\\.a$")))))))) + (native-inputs + (list python python-lit)) + (inputs + (list clang-cling llvm-cling)) + (home-page "https://root.cern/cling/") + (synopsis "Interactive C++ interpreter") + (description "Cling is an interactive C++17 standard compliant +interpreter, built on top of LLVM and Clang. Cling can be used as a +read-eval-print loop (REPL) to assist with rapid application development. +Here's how to print @samp{\"Hello World!\"} using @command{cling}: + +@example +cling '#include <stdio.h>' 'printf(\"Hello World!\\n\");' +@end example") + (license license:lgpl2.1+)))) ;for the combined work |