diff options
| author | Ludovic Courtès <ludo@gnu.org> | 2021-11-18 16:26:50 +0100 | 
|---|---|---|
| committer | Ludovic Courtès <ludo@gnu.org> | 2021-11-18 16:51:13 +0100 | 
| commit | 156843609c398e5976ae0d6577ec585b70165cf3 (patch) | |
| tree | 05f7cab91384a88cb723a47e93277eb41f2de2f1 /gnu/packages/llvm.scm | |
| parent | 45a7de70b64bd203a15eeb713a65fe98defd0afa (diff) | |
gnu: cling: Move next to llvm and clang.
Inheritance should happen within the same module.
* gnu/packages/cpp.scm (%cling, llvm-cling, clang-cling-runtime)
(clang-cling, cling): Move to...
* gnu/packages/llvm.scm: ... here.  Use 'modify-inputs' instead of
'alist-replace'.
Diffstat (limited to 'gnu/packages/llvm.scm')
| -rw-r--r-- | gnu/packages/llvm.scm | 189 | 
1 files changed, 189 insertions, 0 deletions
| diff --git a/gnu/packages/llvm.scm b/gnu/packages/llvm.scm index 9e10da1a77..343062ba7a 100644 --- a/gnu/packages/llvm.scm +++ b/gnu/packages/llvm.scm @@ -21,6 +21,7 @@  ;;; 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.  ;;; @@ -54,6 +55,7 @@    #: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) @@ -68,6 +70,7 @@    #:use-module (gnu packages python)    #:use-module (gnu packages swig)    #:use-module (gnu packages xml) +  #:use-module (srfi srfi-1)    #:use-module (ice-9 match)    #:export (make-lld-wrapper              system->llvm-target)) @@ -1645,3 +1648,189 @@ LLVM."))))           ("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 +       `(("python" ,python) +         ("python-lit" ,python-lit))) +      (inputs +       `(("clang-cling" ,clang-cling) +         ("llvm-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 | 
