summary refs log tree commit diff
path: root/gnu/packages
diff options
context:
space:
mode:
Diffstat (limited to 'gnu/packages')
-rw-r--r--gnu/packages/dlang.scm538
-rw-r--r--gnu/packages/patches/ldc-bootstrap-disable-tests.patch72
-rw-r--r--gnu/packages/patches/ldc-disable-phobos-tests.patch22
3 files changed, 324 insertions, 308 deletions
diff --git a/gnu/packages/dlang.scm b/gnu/packages/dlang.scm
index dc22ea2e62..c4cf1d9665 100644
--- a/gnu/packages/dlang.scm
+++ b/gnu/packages/dlang.scm
@@ -6,6 +6,7 @@
 ;;; Copyright © 2017, 2019 Tobias Geerinckx-Rice <me@tobias.gr>
 ;;; Copyright © 2020 Guy Fleury Iteriteka <gfleury@disroot.org>
 ;;; Copyright © 2021 Efraim Flashner <efraim@flashner.co.il>
+;;; Copyright © 2021 Maxim Cournoyer <maxim.cournoyer@gmail.com>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -27,6 +28,8 @@
   #:use-module (guix packages)
   #:use-module (guix download)
   #:use-module (guix git-download)
+  #: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 (gnu packages)
@@ -37,11 +40,13 @@
   #:use-module (gnu packages gdb)
   #:use-module (gnu packages libedit)
   #:use-module (gnu packages llvm)
+  #:use-module (gnu packages ninja)
   #:use-module (gnu packages pkg-config)
   #:use-module (gnu packages python)
   #:use-module (gnu packages python-xyz)
   #:use-module (gnu packages textutils)
-  #:use-module (gnu packages xorg))
+  #:use-module (gnu packages xorg)
+  #:use-module (srfi srfi-1))
 
 (define-public rdmd
   (package
@@ -81,233 +86,338 @@ minimize the amount of work necessary.  Unlike make, rdmd tracks dependencies
 and freshness without requiring additional information from the user.")
     (license license:boost1.0)))
 
-(define-public ldc-bootstrap
-    (package
-      (name "ldc")
-      (version "0.17.6")
-      (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))
-         (sha256
-          (base32 "1q6hm4fkrcwys83x0p4kfg9xrc1b9g2qicqif2zy5z4nsfsb5vgs"))))
-      (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
-       `(#: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")
-                 #t)))
-           (add-after 'unpack-submodule-sources 'patch-phobos
-             (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/")
-                  (search-input-directory inputs "share/zoneinfo"))
-                 (("tzName == \"[+]VERSION\"")
-                  "(tzName == \"+VERSION\" || std.algorithm.endsWith(tzName, \"/leapseconds\"))"))
-               (substitute* "tests/d2/dmd-testsuite/Makefile"
-                 (("/bin/bash") (which "bash")))
-               ;; the following two tests fail on i686
-               (for-each delete-file '("tests/ir/attributes.d" "tests/ir/align.d")))))))
-      (inputs
-       `(("libconfig" ,libconfig)
-         ("libedit" ,libedit)
-         ("tzdata" ,tzdata)
-         ("zlib" ,zlib)))
-      (native-inputs
-       `(("llvm" ,llvm-6)
-         ("clang" ,clang-6)
-         ("python-lit" ,python-lit)
-         ("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"))
-             (patches (search-patches "ldc-bootstrap-disable-tests.patch"))))
-         ("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"))))))
-      (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 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
+  (package
+    (name "ldc")
+    (version "0.17.6")
+    (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))
+       (sha256
+        (base32 "1q6hm4fkrcwys83x0p4kfg9xrc1b9g2qicqif2zy5z4nsfsb5vgs"))))
+    (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
+       #: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
+           (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\"))")))))))
+    (inputs
+     `(("libconfig" ,libconfig)
+       ("libedit" ,libedit)
+       ("tzdata" ,tzdata)
+       ("zlib" ,zlib)))
+    (native-inputs
+     `(("llvm" ,llvm-6)
+       ("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"))))))
+    (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.")
-      ;; 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".
-      (license (list license:bsd-3
-                     license:gpl2+
-                     license:boost1.0))))
+    ;; 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".
+    (license (list license:bsd-3
+                   license:gpl2+
+                   license:boost1.0))))
 
-(define-public ldc
-  ;; Phobos, druntime and dmd-testsuite library dependencies do
-  ;; not always have a newer release than the compiler, hence we
-  ;; retain this variable.
-  (let ((older-version "1.10.0")) ;; retain this because sometimes the libs are older
-    (package
-      (inherit ldc-bootstrap)
-      (name "ldc")
-      (version "1.10.0")
-      (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))
-         (sha256
-          (base32 "0qcb2rn01wql7y8qp31blbv3hwmnh3zjgzi2n7k168cxr6rrdhlp"))))
-      (arguments
-       `(#: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")
-                 #t)))
-           (add-after 'unpack-submodule-sources 'patch-phobos
+;;; 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"
-                              "tests/linking/linker_switches.d")
+               (substitute* '("runtime/phobos/std/process.d")
                  (("/bin/sh") (which "sh"))
-                 (("echo") (which "echo")))
+                 (("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)
+    (arguments
+     (substitute-keyword-arguments (package-arguments ldc-bootstrap-1.27)
+       ((#: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"))
+       ((#:tests? _) #t)
+       ((#:phases phases)
+        `(modify-phases ,phases
+           (add-after 'unpack 'fix-compiler-rt-library-discovery
+             (lambda* (#:key inputs #:allow-other-keys)
+               (let ((clang-runtime (assoc-ref inputs "clang-runtime"))
+                     (system ,(or (%current-target-system)
+                                  (%current-system))))
+                 (define (gnu-triplet->clang-arch system)
+                   (letrec-syntax
+                       ((matches (syntax-rules (=>)
+                                   ((_ (system-prefix => target) rest ...)
+                                    (if (string-prefix? system-prefix system)
+                                        target
+                                        (matches rest ...)))
+                                   ((_)
+                                    (error "Clang target for system is unknown"
+                                           system)))))
+                     (matches ("x86_64"      => "x86_64")
+                              ("i686"        => "i386")
+                              ("armhf"       => "armhf"))))
+                 ;; Coax LLVM into agreeing with Clang about system target
+                 ;; naming.
+                 (substitute* "driver/linker-gcc.cpp"
+                   (("triple.getArchName\\(\\)")
+                    (format #f "~s" (gnu-triplet->clang-arch system))))
+                 ;; Augment the configuration of the ldc2 binaries so they can
+                 ;; find the compiler-rt libraries they need to be linked with
+                 ;; for the tests.
+                 (substitute* (find-files "." "^ldc2.*\\.conf\\.in$")
+                   ((".*lib-dirs = \\[\n" all)
+                    (string-append all
+                                   "        \"" clang-runtime
+                                   "/lib/linux\",\n"))))))
+           (add-after 'unpack 'patch-paths-in-tests
+             (lambda _
                (substitute* "tests/d2/dmd-testsuite/Makefile"
                  (("/bin/bash") (which "bash")))
-               ;; disable unittests in the following files. We are discussing with
-               ;; upstream
+               (substitute* "tests/linking/linker_switches.d"
+                 (("echo") (which "echo")))
+               (substitute* "tests/d2/dmd-testsuite/dshell/test6952.d"
+                 (("/usr/bin/env bash")
+                  (which "bash")))))
+           (add-after 'unpack 'disable-problematic-tests
+             (lambda* (#:key inputs #:allow-other-keys)
+               ;; Disable unittests in the following files.
                (substitute* '("runtime/phobos/std/net/curl.d"
                               "runtime/phobos/std/datetime/systime.d"
-                              "runtime/phobos/std/datetime/timezone.d"
-                              )
+                              "runtime/phobos/std/datetime/timezone.d")
                  (("version(unittest)") "version(skipunittest)")
                  ((" unittest") " version(skipunittest) unittest"))
-               ;; the following tests require a more recent LLVM
-               (delete-file "tests/compilable/ctfe_math.d")
-               (delete-file "tests/debuginfo/nested_gdb.d")
-               (delete-file "tests/debuginfo/classtypes_gdb.d")
-               ;; for the following tests ptrace fails with EPERM
-               ;; (see <https://issues.guix.gnu.org/48541>):
-               (delete-file "tests/d2/dmd-testsuite/runnable/b18504.d")
-               (delete-file "tests/d2/dmd-testsuite/runnable/gdb14225.d")
-               (delete-file "tests/d2/dmd-testsuite/runnable/gdb14276.d")
-               (delete-file "tests/d2/dmd-testsuite/runnable/gdb14313.d")
-               (delete-file "tests/d2/dmd-testsuite/runnable/gdb14330.d")
-               (delete-file "tests/d2/dmd-testsuite/runnable/gdb1.d")
-               (delete-file "tests/d2/dmd-testsuite/runnable/gdb4149.d")
-               (delete-file "tests/d2/dmd-testsuite/runnable/gdb4181.d")
-               (delete-file "tests/d2/dmd-testsuite/runnable/gdb15729.sh")
-               ;; the following tests plugins we don't have.
+               ;; The following tests plugins we don't have.
                (delete-file "tests/plugins/addFuncEntryCall/testPlugin.d")
-               ;; the following tests requires AVX instruction set in the CPU.
-               (substitute* "tests/d2/dmd-testsuite/runnable/test_cdvecfill.d"
+               ;; The following tests requires AVX instruction set in the CPU.
+               (substitute* "tests/d2/dmd-testsuite/runnable/cdvecfill.sh"
                  (("^// DISABLED: ") "^// DISABLED: linux64 "))
-               #t))
+               ;; This unit test requires networking, fails with
+               ;; "core.exception.RangeError@std/socket.d(778): Range
+               ;; violation".
+               (substitute* "runtime/phobos/std/socket.d"
+                 (("assert\\(ih.addrList\\[0\\] == 0x7F_00_00_01\\);.*")
+                  ""))
+               ;; The GDB tests suite fails; there are a few bug reports about
+               ;; it upstream.
+               (for-each delete-file (find-files "tests" "gdb.*\\.(d|sh)$"))
+               (delete-file "tests/d2/dmd-testsuite/runnable/debug_info.d")
+               (delete-file "tests/d2/dmd-testsuite/runnable/b18504.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.
+               (with-directory-excursion "tests"
+                 (let ((system ,(or (%current-target-system)
+                                    (%current-system))))
+                   (when (or (string-prefix? "armhf" system )
+                             (string-prefix? "i686" system ))
+                     (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")))))))
+           (add-before 'configure 'set-cc-and-cxx-to-use-clang
+             ;; The tests require to be built with Clang; build everything
+             ;; with it, for simplicity.
+             (lambda _
+               (setenv "CC" (which "clang"))
+               (setenv "CXX" (which "clang++"))))
            (replace 'check
-             (lambda* (#:key inputs outputs #:allow-other-keys)
-               ;; some tests call into gdb binary which needs SHELL and CC set
-               (setenv "SHELL" (which "sh"))
-               (setenv "CC" (search-input-file inputs "/bin/gcc"))
-               (invoke "make" "test" "-j" (number->string (parallel-job-count))))))))
-      (native-inputs
-       `(("llvm" ,llvm-6)
-         ("clang" ,clang-6)
-         ("ldc" ,ldc-bootstrap)
-         ("python-lit" ,python-lit)
-         ("python-wrapper" ,python-wrapper)
-         ("unzip" ,unzip)
-         ("gdb" ,gdb)
-         ("phobos-src"
-          ,(origin
-             (method git-fetch)
-             (uri (git-reference
-                   (url "https://github.com/ldc-developers/phobos")
-                   (commit (string-append "ldc-v" older-version))))
-             (file-name (git-file-name "phobos" older-version))
-             (sha256
-              (base32 "1gmlwnjdcf6s5aahadxsif9l5nyaj0rrn379g6fmhcvdk64kf509"))
-             ;; This patch deactivates some tests that depend on network access
-             ;; to pass.  It also deactivates some tests that have some reliance
-             ;; on timezone.
-             ;;
-             ;; For the network tests, there's an effort to get a version flag
-             ;; added to deactivate these tests for distribution packagers
-             ;; that is being pursued at
-             ;; <https://forum.dlang.org/post/zmdbdgnzrxyvtpqafvyg@forum.dlang.org>.
-             ;; It also deactivates a test that requires /root
-             (patches (search-patches "ldc-disable-phobos-tests.patch"))))
-         ("druntime-src"
-          ,(origin
-             (method git-fetch)
-             (uri (git-reference
-                   (url "https://github.com/ldc-developers/druntime")
-                   (commit (string-append "ldc-v" older-version))))
-             (file-name (git-file-name "druntime" older-version))
-             (sha256
-              (base32 "0a3yyjcnpvm5fbdczf76fx08kl154w17w06hlxf0j3p1p4jc85aj"))))
-         ("dmd-testsuite-src"
-          ,(origin
-             (method git-fetch)
-             (uri (git-reference
-                   (url "https://github.com/ldc-developers/dmd-testsuite")
-                   (commit (string-append "ldc-v" older-version))))
-             (file-name (git-file-name "dmd-testsuite" older-version))
-             (sha256
-              (base32 "0mm3rliki1nqiqfaha7ssvm156aa398vpvf4v6895m7nn1mz7rss")))))))))
+             (lambda* (#:key tests? parallel-tests? #:allow-other-keys)
+               (when tests?
+                 (let ((job-count (number->string
+                                   (or (and parallel-tests?
+                                            (parallel-job-count))
+                                       1))))
+                   ;; The test targets are tested separately to provide
+                   ;; finer-grained diagnostics (see:
+                   ;; https://raw.githubusercontent.com/ldc-developers/
+                   ;; ldc/master/.azure-pipelines/3-posix-test.yml)
+                   (display "running the ldc2 unit tests...\n")
+                   (invoke "ctest" "--output-on-failure" "-j" job-count
+                           "-R" "ldc2-unittest")
+                   (display "running the lit test suite...\n")
+                   (invoke "ctest" "--output-on-failure" "-j" job-count
+                           "-R" "lit-tests")
+                   (display "running the dmd test suite...\n")
+                   (invoke "ctest" "--output-on-failure" "-j" job-count
+                           "-R" "dmd-testsuite")
+                   (display "running the defaultlib unit tests and druntime \
+integration tests...\n")
+                   (invoke "ctest" "--output-on-failure" "-j" job-count
+                           "-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)))
+         `(("clang" ,clang-11)          ;propagates llvm and clang-runtime
+           ("python-lit" ,python-lit))))))
 
 (define-public dub
   (package
diff --git a/gnu/packages/patches/ldc-bootstrap-disable-tests.patch b/gnu/packages/patches/ldc-bootstrap-disable-tests.patch
deleted file mode 100644
index d2e40b8016..0000000000
--- a/gnu/packages/patches/ldc-bootstrap-disable-tests.patch
+++ /dev/null
@@ -1,72 +0,0 @@
-This patch fixes a failing unit test by feeding buildNormalizedPath to the
-tzdata properly.  Three other tests are disabled, one assumes /root and the
-two others use networking.  Not bad out of almost 700 tests!
-
-by Pjotr Prins <pjotr.guix@thebird.nl>
-
---- a/std/datetime.d.orig      2016-11-24 01:13:52.584495545 +0100
-+++ b/std/datetime.d   2016-11-24 01:17:09.655306728 +0100
-@@ -28081,22 +28081,24 @@
-         import std.range : retro;
-         import std.format : format;
-
--        name = strip(name);
--
-         enforce(tzDatabaseDir.exists(), new DateTimeException(format("Directory %s does not exist.", tzDatabaseDir)));
-         enforce(tzDatabaseDir.isDir, new DateTimeException(format("%s is not a directory.", tzDatabaseDir)));
-
-         version(Android)
-         {
-+            name = strip(name);
-             auto tzfileOffset = name in tzdataIndex(tzDatabaseDir);
-             enforce(tzfileOffset, new DateTimeException(format("The time zone %s is not listed.", name)));
-             string tzFilename = separate_index ? "zoneinfo.dat" : "tzdata";
-             immutable file = buildNormalizedPath(tzDatabaseDir, tzFilename);
-         }
-         else
--            immutable file = buildNormalizedPath(tzDatabaseDir, name);
-+        {
-+            auto filename = "./" ~ strip(name); // make sure the prefix is not stripped
-+            immutable file = buildNormalizedPath(tzDatabaseDir, filename);
-+        }
-
--        enforce(file.exists(), new DateTimeException(format("File %s does not exist.", file)));
-+        enforce(file.exists(), new DateTimeException(format("File %s does not exist in %s.", file, tzDatabaseDir)));
-         enforce(file.isFile, new DateTimeException(format("%s is not a file.", file)));
-
-         auto tzFile = File(file);
-diff --git a/std/path.d b/std/path.d
-index 254d8f0..b0fc04d 100644
---- a/std/path.d
-+++ b/std/path.d
-@@ -3080,8 +3080,11 @@ unittest
-         }
-         else
-         {
-+            pragma(msg, "test disabled on GNU Guix");
-+/*
-             assert(expandTilde("~root") == "/root", expandTilde("~root"));
-             assert(expandTilde("~root/") == "/root/", expandTilde("~root/"));
-+*/
-         }
-         assert(expandTilde("~Idontexist/hey") == "~Idontexist/hey");
-     }
-diff --git a/std/socket.d b/std/socket.d
-index b85d1c9..7fbf346 100644
---- a/std/socket.d
-+++ b/std/socket.d
-@@ -859,6 +862,8 @@ class InternetHost
-
- unittest
- {
-+    pragma(msg, "test disabled on GNU Guix");
-+    /*
-     InternetHost ih = new InternetHost;
-
-     ih.getHostByAddr(0x7F_00_00_01);
-@@ -889,6 +894,7 @@ unittest
-         //      writefln("aliases[%d] = %s", i, s);
-         // }
-     });
-+    */
- }
diff --git a/gnu/packages/patches/ldc-disable-phobos-tests.patch b/gnu/packages/patches/ldc-disable-phobos-tests.patch
deleted file mode 100644
index f8a9743d59..0000000000
--- a/gnu/packages/patches/ldc-disable-phobos-tests.patch
+++ /dev/null
@@ -1,22 +0,0 @@
-diff --git a/std/socket.d b/std/socket.d
-index 111cd17..6d23da9 100644
---- a/std/socket.d
-+++ b/std/socket.d
-@@ -448,7 +448,7 @@ class Protocol
- // Skip this test on Android because getprotobyname/number are
- // unimplemented in bionic.
- version(CRuntime_Bionic) {} else
--@safe unittest
-+@safe version(hasNetwork) unittest
- {
-     // import std.stdio : writefln;
-     softUnittest({
-@@ -770,7 +770,7 @@ class InternetHost
- }
- 
- ///
--@safe unittest
-+@safe version(hasNetwork) unittest
- {
-     InternetHost ih = new InternetHost;
-