diff options
Diffstat (limited to 'gnu/packages/dlang.scm')
-rw-r--r-- | gnu/packages/dlang.scm | 401 |
1 files changed, 173 insertions, 228 deletions
diff --git a/gnu/packages/dlang.scm b/gnu/packages/dlang.scm index 403fcbbd6b..9a972182cc 100644 --- a/gnu/packages/dlang.scm +++ b/gnu/packages/dlang.scm @@ -3,10 +3,12 @@ ;;; Copyright © 2015, 2018 Pjotr Prins <pjotr.guix@thebird.nl> ;;; Copyright © 2017 Frederick Muriithi <fredmanglis@gmail.com> ;;; Copyright © 2017 Ricardo Wurmus <rekado@elephly.net> -;;; Copyright © 2017, 2019 Tobias Geerinckx-Rice <me@tobias.gr> +;;; Copyright © 2017, 2019, 2022 Tobias Geerinckx-Rice <me@tobias.gr> ;;; Copyright © 2020 Guy Fleury Iteriteka <gfleury@disroot.org> -;;; Copyright © 2021 Efraim Flashner <efraim@flashner.co.il> +;;; Copyright © 2021, 2022 Efraim Flashner <efraim@flashner.co.il> ;;; Copyright © 2021 Maxim Cournoyer <maxim.cournoyer@gmail.com> +;;; Copyright © 2022 ( <paren@disroot.org> +;;; Copyright © 2022 Esther Flashner <esther@flashner.co.il> ;;; ;;; This file is part of GNU Guix. ;;; @@ -28,19 +30,23 @@ #:use-module (guix packages) #:use-module (guix download) #:use-module (guix git-download) + #:use-module (guix gexp) #:use-module (guix utils) #:use-module ((guix build utils) #:hide (delete which)) #:use-module (guix build-system gnu) #:use-module (guix build-system cmake) + #:use-module (guix build-system copy) #:use-module (gnu packages) #:use-module (gnu packages base) #:use-module (gnu packages check) #:use-module (gnu packages compression) #:use-module (gnu packages curl) + #:use-module (gnu packages gcc) #:use-module (gnu packages gdb) #:use-module (gnu packages libedit) #:use-module (gnu packages llvm) #:use-module (gnu packages ninja) + #:use-module (gnu packages perl) #:use-module (gnu packages pkg-config) #:use-module (gnu packages python) #:use-module (gnu packages python-xyz) @@ -48,137 +54,161 @@ #:use-module (gnu packages xorg) #:use-module (srfi srfi-1)) -(define-public rdmd +(define-public d-tools (package - (name "rdmd") - (version "2.077.1") - (source (origin - (method url-fetch) - (uri (string-append "https://github.com/dlang/tools/archive/v" version ".tar.gz")) - (file-name (string-append name "-" version ".tar.gz")) - (sha256 - (base32 - "0c8w373rv6iz3xfid94w40ncv2lr2ncxi662qsr4lda4aghczmq7")))) + (name "d-tools") + (version "2.100.0") + (source + (origin + (method git-fetch) + (uri (git-reference + (url "https://github.com/dlang/tools") + (commit (string-append "v" version)))) + (file-name (git-file-name name version)) + (sha256 + (base32 "1jbn0hyskv4ykcckw0iganpyrm0bq2lggswspw21r4hgnxkmjbyw")))) (build-system gnu-build-system) (arguments - '(#:phases - (modify-phases %standard-phases - (delete 'configure) - (delete 'check) ; There is no Makefile, so there's no 'make check'. - (replace - 'build - (lambda _ - (invoke "ldc2" "rdmd.d"))) - (replace - 'install - (lambda* (#:key outputs #:allow-other-keys) - (let ((bin (string-append (assoc-ref outputs "out") "/bin"))) - (install-file "rdmd" bin))))))) + (list #:phases + #~(modify-phases %standard-phases + (delete 'configure) + (replace 'build + (lambda _ + (mkdir-p "bin") + (setenv "CC" #$(cc-for-target)) + (setenv "LD" #$(ld-for-target)) + (invoke "ldc2" "rdmd.d" "--of" "bin/rdmd") + (apply invoke "ldc2" "--of=bin/dustmite" + (find-files "DustMite" ".*\\.d")))) + (replace 'check + (lambda* (#:key tests? #:allow-other-keys) + (when tests? + (invoke "bin/rdmd" "rdmd_test.d" "bin/rdmd" + "--rdmd-default-compiler" "ldmd2")))) + (replace 'install + (lambda* (#:key outputs #:allow-other-keys) + (let* ((out (assoc-ref outputs "out")) + (bin (string-append out "/bin")) + (man (string-append out "/man"))) + (for-each delete-file (find-files "bin" "\\.o$")) + (copy-recursively "bin" bin) + (copy-recursively "man" man))))))) (native-inputs - (list ldc)) - (home-page "https://github.com/D-Programming-Language/tools/") - (synopsis "Specialized equivalent to 'make' for the D language") + (list ldc + (module-ref (resolve-interface + '(gnu packages commencement)) + 'ld-gold-wrapper))) + (home-page "https://github.com/dlang/tools") + (synopsis "Useful D-related tools") (description - "rdmd is a companion to the dmd compiler that simplifies the typical -edit-compile-link-run or edit-make-run cycle to a rapid edit-run cycle. Like -make and other tools, rdmd uses the relative dates of the files involved to -minimize the amount of work necessary. Unlike make, rdmd tracks dependencies -and freshness without requiring additional information from the user.") + "@code{d-tools} provides two useful tools for the D language: @code{rdmd}, +which runs D source files as scripts, and @code{dustmite}, which reduces D code +to a minimal test case.") (license license:boost1.0))) -;;; The 0.17.6 version is the last release to support being bootstrapped -;;; without a D compiler (requiring only a C++ compiler). -;;; TODO: Bootstrap ldc from GDC (the D frontend for GCC). -(define ldc-bootstrap-0.17 +(define-public gdmd + (let ((commit "ff2c97a47408fb71c18a2d453294d18808a97cc5") + (revision "1")) + (package + (name "gdmd") + (version (git-version "0.1.0" revision commit)) + (source + (origin + (method git-fetch) + (uri (git-reference + (url "https://github.com/D-Programming-GDC/gdmd") + (commit commit))) + (file-name (git-file-name name version)) + (sha256 + (base32 "0pd70clk70069xcjysaas7zszzmigrcw1zl2xxv8kzdg7y7xrzvm")))) + (build-system copy-build-system) + (arguments + (list + #:install-plan + #~'(("dmd-script" "bin/gdmd") + ("dmd-script.1" "share/man/man1/gdmd.1")) + #:phases + #~(modify-phases %standard-phases + (add-after 'unpack 'adjust-gdc-location + (lambda* (#:key inputs #:allow-other-keys) + (substitute* "dmd-script" + (("my \\$gdc_dir.*") + (string-append "my $gdc_dir = \"" + (dirname (search-input-file inputs "/bin/gdc")) + "\";\n")))))))) + (inputs + (list gdc-10 perl)) + (home-page "https://github.com/D-Programming-GDC/gdmd") + (synopsis "DMD-like wrapper for GDC") + (description "This package provides a DMD-like wrapper for the +@acronym{GNU D Compiler,GDC}.") + (license license:gpl3+)))) + +;; We use GDC, the D frontend for GCC, to bootstrap ldc. We then use +;; ldc to bootstrap itself so that no reference remains to GDC. +(define ldc-bootstrap (package (name "ldc") - (version "0.17.6") + (version "1.27.1") (source (origin - (method git-fetch) - (uri (git-reference - (url "https://github.com/ldc-developers/ldc") - (commit (string-append "v" version)))) - (file-name (git-file-name name version)) + (method url-fetch) + (uri (string-append "https://github.com/ldc-developers/ldc/releases" + "/download/v" version "/ldc-" version "-src.tar.gz")) (sha256 - (base32 "1q6hm4fkrcwys83x0p4kfg9xrc1b9g2qicqif2zy5z4nsfsb5vgs")))) + (base32 "1775001ba6n8w46ln530kb5r66vs935ingnppgddq8wqnc0gbj4k")))) (build-system cmake-build-system) - (supported-systems '("x86_64-linux" "i686-linux" "armhf-linux")) - (properties - ;; Some of the tests take a very long time on ARMv7. See - ;; <https://lists.gnu.org/archive/html/guix-devel/2018-02/msg00312.html>. - `((max-silent-time . ,(* 3600 3)))) (arguments - `(#:tests? #f ;requires obsolete python-lit test dependency + `(#:tests? #f ;skip in the bootstrap + #:build-type "Release" + #:configure-flags + (list "-GNinja") + #:make-flags ;used as build targets + (list "all") #:phases (modify-phases %standard-phases - (add-after 'unpack 'unpack-submodule-sources - (lambda* (#:key inputs #:allow-other-keys) - (let ((unpack (lambda (input target) - (let ((source (assoc-ref inputs input))) - ;; Git checkouts are directories as long as - ;; there are no patches; tarballs otherwise. - (if (file-is-directory? source) - (copy-recursively source target) - (with-directory-excursion target - (invoke "tar" "xvf" source - "--strip-components=1"))))))) - (unpack "phobos-src" "runtime/phobos") - (unpack "druntime-src" "runtime/druntime") - (unpack "dmd-testsuite-src" "tests/d2/dmd-testsuite")))) - (add-after 'unpack-submodule-sources 'patch-paths + (add-after 'unpack 'patch-paths (lambda* (#:key inputs #:allow-other-keys) (substitute* "runtime/phobos/std/process.d" (("/bin/sh") (which "sh")) - (("echo") (which "echo"))) - (substitute* "runtime/phobos/std/datetime.d" - (("/usr/share/zoneinfo/") - (string-append (assoc-ref inputs "tzdata") "/share/zoneinfo")) - (("tzName == \"[+]VERSION\"") - "(tzName == \"+VERSION\" || \ -std.algorithm.endsWith(tzName, \"/leapseconds\"))"))))))) + (("echo") (which "echo"))))) + (replace 'build + ;; Building with Make would result in "make: *** [Makefile:166: + ;; all] Error 2". + (lambda* (#:key make-flags parallel-tests? #:allow-other-keys) + (let ((job-count (number->string (or (and parallel-tests? + (parallel-job-count)) + 1)))) + (apply invoke "cmake" "--build" "." "-j" job-count + "--target" make-flags)))) + (replace 'install + (lambda _ + (invoke "cmake" "--install" ".")))))) (inputs `(("libconfig" ,libconfig) ("libedit" ,libedit) ("tzdata" ,tzdata) ("zlib" ,zlib))) (native-inputs - `(("llvm" ,llvm-6) + ;; Importing (gnu packages commencement) would introduce a cycle. + `(("ld-gold-wrapper" ,(module-ref (resolve-interface + '(gnu packages commencement)) + 'ld-gold-wrapper)) + ("llvm" ,llvm-11) + ("ldc" ,gdmd) + ("ninja" ,ninja) ("python-wrapper" ,python-wrapper) - ("unzip" ,unzip) - ("phobos-src" - ,(origin - (method git-fetch) - (uri (git-reference - (url "https://github.com/ldc-developers/phobos") - (commit (string-append "ldc-v" version)))) - (file-name (git-file-name "phobos" version)) - (sha256 - (base32 "15jzs38wanks2jfp2izzl7zqrp4c8ai54ppsgm8ws86p3sbbkmj8")))) - ("druntime-src" - ,(origin - (method git-fetch) - (uri (git-reference - (url "https://github.com/ldc-developers/druntime") - (commit (string-append "ldc-v" version)))) - (file-name (git-file-name "druntime" version)) - (sha256 - (base32 "00wr2kiggwnd8h7by51fhj1xc65hv1ysip5gbgdbkfar58p2d0bb")))) - ("dmd-testsuite-src" - ,(origin - (method git-fetch) - (uri (git-reference - (url "https://github.com/ldc-developers/dmd-testsuite") - (commit (string-append "ldc-v" version)))) - (file-name (git-file-name "dmd-testsuite" version)) - (sha256 - (base32 "1d1c0979wbippldrkjf7szyj4n87hxz8dwqg1r5b3aai37g9kcky")))))) + ("unzip" ,unzip))) (home-page "http://wiki.dlang.org/LDC") (synopsis "LLVM-based compiler for the D programming language") (description "LDC is an LLVM compiler for the D programming language. It is based on the latest DMD compiler that was written in C and is used for bootstrapping more recent compilers written in D.") + (properties + ;; Some of the tests take a very long time on ARMv7. See + ;; <https://lists.gnu.org/archive/html/guix-devel/2018-02/msg00312.html>. + `((max-silent-time . ,(* 3600 3)))) ;; Most of the code is released under BSD-3, except for code originally ;; written for GDC, which is released under GPLv2+, and the DMD frontend, ;; which is released under the "Boost Software License version 1.0". @@ -186,108 +216,19 @@ bootstrapping more recent compilers written in D.") license:gpl2+ license:boost1.0)))) -;;; This is the last version that supports being built with 32 bit machines -;;; from 0.17. -(define ldc-bootstrap-1.12 - (package - (inherit ldc-bootstrap-0.17) - (version "1.12.0") - (source - (origin - (method url-fetch) - ;; The official release include the matching source code releases of - ;; phobos, druntime and dmd-testsuite. - (uri (string-append "https://github.com/ldc-developers/ldc/releases" - "/download/v" version "/ldc-" version "-src.tar.gz")) - (sha256 - (base32 "1fdma1w8j37wkr0pqdar11slkk36qymamxnk6d9k8ybhjmxaaawm")))) - (arguments - (substitute-keyword-arguments (package-arguments ldc-bootstrap-0.17) - ((#:build-type _ #f) "Release") - ((#:configure-flags _ #f) - `(list "-GNinja")) - ((#:make-flags _ #f) ;used as build targets - `(list "all")) - ((#:tests? _) #f) - ((#:phases phases) - `(modify-phases ,phases - (delete 'unpack-submodule-sources) - (replace 'patch-paths - (lambda* (#:key inputs #:allow-other-keys) - (substitute* '("runtime/phobos/std/process.d") - (("/bin/sh") (which "sh")) - (("echo") (which "echo"))))) - (replace 'build - ;; Building with Make would result in "make: *** [Makefile:166: - ;; all] Error 2". - (lambda* (#:key make-flags parallel-tests? #:allow-other-keys) - (let ((job-count (number->string (or (and parallel-tests? - (parallel-job-count)) - 1)))) - (apply invoke "cmake" "--build" "." "-j" job-count - "--target" make-flags)))) - (replace 'install - (lambda _ - (invoke "cmake" "--install" "."))))))) - (native-inputs - ;; Importing (gnu packages commencement) would introduce a cycle. - `(("ld-gold-wrapper" ,(module-ref (resolve-interface - '(gnu packages commencement)) - 'ld-gold-wrapper)) - ("llvm" ,llvm-6) - ("ldc" ,ldc-bootstrap-0.17) - ("ninja" ,ninja) - ("python-wrapper" ,python-wrapper) - ("unzip" ,unzip))))) - -;;; For 32 bits systems, 1.12 cannot build 1.27 directly, so we need another -;;; hop. -(define ldc-bootstrap-1.24 - (package - (inherit ldc-bootstrap-1.12) - (version "1.24.0") - (source - (origin - (method url-fetch) - (uri (string-append "https://github.com/ldc-developers/ldc/releases" - "/download/v" version "/ldc-" version "-src.tar.gz")) - (sha256 - (base32 "0g5svf55i0kq55q49awmwqj9qi1n907cyrn1vjdjgs8nx6nn35gx")))) - (native-inputs - (fold alist-replace - (package-native-inputs ldc-bootstrap-1.12) - '("ldc" "llvm") - `((,ldc-bootstrap-1.12) (,llvm-11)))))) - -(define ldc-bootstrap-1.27 - (package - (inherit ldc-bootstrap-1.24) - (version "1.27.1") - (source - (origin - (method url-fetch) - (uri (string-append "https://github.com/ldc-developers/ldc/releases" - "/download/v" version "/ldc-" version "-src.tar.gz")) - (sha256 - (base32 "1775001ba6n8w46ln530kb5r66vs935ingnppgddq8wqnc0gbj4k")))) - (native-inputs - (fold alist-replace - (package-native-inputs ldc-bootstrap-1.24) - '("ldc" "llvm") - `((,ldc-bootstrap-1.24) (,llvm-11)))))) - (define-public ldc (package - (inherit ldc-bootstrap-1.27) + (inherit ldc-bootstrap) (arguments - (substitute-keyword-arguments (package-arguments ldc-bootstrap-1.27) + (substitute-keyword-arguments (package-arguments ldc-bootstrap) ((#:make-flags _ #f) '(list "all" ;; Also build the test runner binaries. "ldc2-unittest" "all-test-runners")) ((#:configure-flags flags) `(,@flags "-DBUILD_SHARED_LIBS=ON" - "-DLDC_LINK_MANUALLY=OFF")) + "-DLDC_LINK_MANUALLY=OFF" + "-DLDC_DYNAMIC_COMPILE=OFF")) ((#:tests? _) #t) ((#:phases phases) `(modify-phases ,phases @@ -308,7 +249,8 @@ bootstrapping more recent compilers written in D.") system))))) (matches ("x86_64" => "x86_64") ("i686" => "i386") - ("armhf" => "armhf")))) + ("armhf" => "armhf") + ("aarch64" => "aarch64")))) ;; Coax LLVM into agreeing with Clang about system target ;; naming. (substitute* "driver/linker-gcc.cpp" @@ -358,30 +300,28 @@ bootstrapping more recent compilers written in D.") (substitute* "runtime/druntime/test/exceptions/Makefile" ((".*TESTS\\+=rt_trap_exceptions_drt_gdb.*") "")) - ;; The following tests fail on the supported 32 bit systems, - ;; which are not tested upstream. + ;; The following tests fail on some systems, not all of + ;; which are tested upstream. (with-directory-excursion "tests" - (let ((system ,(or (%current-target-system) - (%current-system)))) - (when (or (string-prefix? "armhf" system ) - (string-prefix? "i686" system )) + (cond + (,(or (target-x86-32?) + (target-arm32?)) (for-each delete-file '("PGO/profile_rt_calls.d" "codegen/mangling.d" - "debuginfo/print_gdb.d" - "dynamiccompile/bind.d" - "dynamiccompile/bind_bool.d" - "dynamiccompile/bind_func_opt.d" - "dynamiccompile/bind_nested_opt.d" - "dynamiccompile/bind_opt.d" - "dynamiccompile/compiler_context.d" - "dynamiccompile/compiler_context_parallel.d" "instrument/xray_check_pipeline.d" "instrument/xray_link.d" "instrument/xray_simple_execution.d" "sanitizers/msan_noerror.d" "sanitizers/msan_uninitialized.d" - "d2/dmd-testsuite/runnable_cxx/cppa.d"))))))) + "d2/dmd-testsuite/runnable_cxx/cppa.d"))) + (,(target-aarch64?) + (for-each delete-file + '("d2/dmd-testsuite/runnable/ldc_cabi1.d" + "sanitizers/fuzz_basic.d" + "sanitizers/msan_noerror.d" + "sanitizers/msan_uninitialized.d"))) + (#t '()))))) (add-before 'configure 'set-cc-and-cxx-to-use-clang ;; The tests require to be built with Clang; build everything ;; with it, for simplicity. @@ -414,15 +354,15 @@ integration tests...\n") "-E" "dmd-testsuite|lit-tests|ldc2-unittest"))))))))) (native-inputs (append (delete "llvm" - (alist-replace "ldc" (list ldc-bootstrap-1.27) - (package-native-inputs ldc-bootstrap-1.27))) + (alist-replace "ldc" (list ldc-bootstrap) + (package-native-inputs ldc-bootstrap))) `(("clang" ,clang-11) ;propagates llvm and clang-runtime ("python-lit" ,python-lit)))))) (define-public dub (package (name "dub") - (version "1.7.2") + (version "1.23.0") (source (origin (method git-fetch) @@ -431,26 +371,31 @@ integration tests...\n") (commit (string-append "v" version)))) (file-name (git-file-name name version)) (sha256 - (base32 "073ibvgm1gphcqs1yjrav9ryp677nh3b194nxmvicwgvdc0sb6w9")))) + (base32 "06a4whsl1m600k096nwif83n7za3vr7pj1xwapncy5fcad1gmady")))) (build-system gnu-build-system) (arguments - `(#:tests? #f ; it would have tested itself by installing some packages (vibe etc) - #:phases - (modify-phases %standard-phases - (delete 'configure) ; no configure script - (replace 'build - (lambda _ - (invoke "./build.sh"))) - (replace 'install - (lambda* (#:key outputs #:allow-other-keys) - (let* ((out (assoc-ref outputs "out")) - (bin (string-append out "/bin"))) - (install-file "bin/dub" bin) - #t)))))) + (list #:tests? #f ; tests try to install packages + #:phases + #~(modify-phases %standard-phases + (delete 'configure) ; no configure script + (replace 'build + (lambda _ + (setenv "CC" #$(cc-for-target)) + (setenv "LD" #$(ld-for-target)) + (invoke "./build.d"))) + (replace 'install + (lambda* (#:key outputs #:allow-other-keys) + (let* ((out (assoc-ref outputs "out")) + (bin (string-append out "/bin"))) + (install-file "bin/dub" bin))))))) (inputs (list curl)) (native-inputs - (list ldc)) + (list d-tools + ldc + (module-ref (resolve-interface + '(gnu packages commencement)) + 'ld-gold-wrapper))) (home-page "https://code.dlang.org/getting_started") (synopsis "Package and build manager for D projects") (description |