From: Maxim Cournoyer <maxim.cournoyer@gmail.com>
To: 68554@debbugs.gnu.org
Cc: efraim@flashner.co.il, Maxim Cournoyer <maxim.cournoyer@gmail.com>
Subject: [bug#68554] [PATCH v4 3/5] gnu: Add dmd.
Date: Fri, 19 Jan 2024 23:37:07 -0500 [thread overview]
Message-ID: <5e228e1b02057ef071c8c4eb7efda8706be8cda0.1705725428.git.maxim.cournoyer@gmail.com> (raw)
In-Reply-To: <cover.1705725428.git.maxim.cournoyer@gmail.com>
* gnu/packages/dlang.scm (dmd-bootstrap, dmd): New variables.
Change-Id: I53e00a429e2084a392341ef1bc7ea63f0fcaaab4
---
Changes in v4:
- Name phobos source as "phobos" (thanks to Efraim)
Changes in v3:
- Add packages built from dmd and D demangling support to qt-creator
Changes in v2:
- Build make flags via inheritance...
- Fixing the missing SYSCONFDIR make flag
gnu/packages/dlang.scm | 165 +++++++++++++++++++++++++++++++++++++++++
1 file changed, 165 insertions(+)
diff --git a/gnu/packages/dlang.scm b/gnu/packages/dlang.scm
index 5c9766110d..58411166b7 100644
--- a/gnu/packages/dlang.scm
+++ b/gnu/packages/dlang.scm
@@ -358,6 +358,171 @@ (define-public ldc
`(("clang" ,clang-14) ;propagates llvm and clang-runtime
("python-lit" ,python-lit))))))
+;;; Bootstrap version of phobos that is built with GDC, using GDC's standard
+;;; library.
+(define dmd-bootstrap
+ (package
+ ;; This package is purposefully named just "dmd" and not "dmd-bootstrap",
+ ;; as the final dmd package rewrites references from this one to itself,
+ ;; and their names must have the same length to avoid corrupting the
+ ;; binary.
+ (name "dmd")
+ (version "2.106.1")
+ (source (origin
+ (method git-fetch)
+ (uri (git-reference
+ (url "https://github.com/dlang/dmd")
+ (commit (string-append "v" version))))
+ (file-name (git-file-name "dmd" version))
+ (sha256
+ (base32
+ "1bq4jws1vns2jjzfz7biyngrx9y5pvvgklymhrvb5kvbzky1ldmy"))))
+ (build-system gnu-build-system)
+ (arguments
+ (list
+ #:disallowed-references (list (gexp-input (canonical-package gcc)
+ "lib"))
+ ;; Disable tests, as gdmd cannot cope with some arguments used such as
+ ;; '-conf'.
+ #:tests? #f
+ #:test-target "test"
+ #:make-flags
+ #~(list (string-append "CC=" #$(cc-for-target))
+ ;; XXX: Proceed despite conflicts from symbols provided by both
+ ;; the source built and GDC.
+ "DFLAGS=-L--allow-multiple-definition"
+ "ENABLE_RELEASE=1"
+ (string-append "HOST_CXX=" #$(cxx-for-target))
+ "HOST_DMD=gdmd"
+ (string-append "INSTALL_DIR=" #$output)
+ ;; Do not build the shared libphobos2.so library, to avoid
+ ;; retaining a reference to gcc:lib.
+ "SHARED=0"
+ (string-append "SYSCONFDIR=" #$output "/etc")
+ "VERBOSE=1"
+ "-f" "posix.mak")
+ #:phases
+ #~(modify-phases %standard-phases
+ (add-after 'unpack 'copy-phobos-source-and-chdir
+ ;; Start with building phobos, which in turns will automatically
+ ;; build druntime and dmd. A minimal dmd command is still
+ ;; required to do so, which is why we need dmd-bootstrap-0.
+ (lambda _
+ (symlink "." "dmd") ;to please the build system expected layout
+ (copy-recursively
+ #$(origin
+ (method git-fetch)
+ (uri (git-reference
+ (url "https://github.com/dlang/phobos")
+ (commit (string-append "v" version))))
+ (file-name (git-file-name "phobos" version))
+ (sha256
+ (base32
+ "1yw7nb5d78cx9m7sfibv7rfc7wj3w0dw9mfk3d269qpfpnwzs4n9")))
+ "phobos")
+ (chdir "phobos")))
+ (add-after 'copy-phobos-source-and-chdir 'adjust-phobos-install-dirs
+ (lambda _
+ (substitute* "posix.mak"
+ ;; Install to lib directory, not to e.g. 'linux/lib64'.
+ (("\\$\\(INSTALL_DIR)/\\$\\(OS)/\\$\\(lib_dir)")
+ (string-append #$output "/lib"))
+ ;; Do not install license file, already done by the gnu build
+ ;; system.
+ ((".*\\$\\(INSTALL_DIR)/phobos-LICENSE.txt.*") ""))))
+ (delete 'configure)
+ (add-after 'install 'install-druntime
+ (lambda args
+ (chdir "../druntime")
+ (apply (assoc-ref %standard-phases 'install) args)
+ (chdir "..")))
+ (add-after 'install-druntime 'install-includes
+ (lambda _
+ ;; Normalize the include files prefix to include/dmd.
+ (let ((include-dir (string-append #$output "/include/dmd")))
+ (mkdir-p include-dir)
+ (rename-file (string-append #$output "/src/phobos")
+ (string-append include-dir))
+ (copy-recursively "druntime/import" include-dir))
+ (delete-file-recursively (string-append #$output "/src"))))
+ (add-after 'install-druntime 'install-dmd
+ (assoc-ref %standard-phases 'install))
+ (add-after 'install-license-files 'refine-install-layout
+ (lambda _
+ (let* ((docdir (string-append #$output "/share/doc/"
+ (strip-store-file-name #$output)))
+ ;; The dmd binary gets installed to
+ ;; e.g. /linux/bin64/dmd.
+ (dmd (car (find-files #$output "^dmd$")))
+ (dmd.conf (car (find-files #$output "^dmd.conf$")))
+ (os-dir (dirname (dirname dmd))))
+ ;; Move samples from root to the doc directory.
+ (rename-file (string-append #$output "/samples")
+ (string-append docdir "/samples"))
+ ;; Remove duplicate license file.
+ (delete-file (string-append #$output
+ "/dmd-boostlicense.txt"))
+ ;; Move dmd binary and dmd.conf.
+ (install-file dmd (string-append #$output "/bin"))
+ (install-file dmd.conf (string-append #$output "/etc"))
+ (delete-file-recursively os-dir))))
+ (add-after 'refine-install-layout 'patch-dmd.conf
+ (lambda* (#:key outputs #:allow-other-keys)
+ (substitute* (search-input-file outputs "etc/dmd.conf")
+ (("lib(32|64)")
+ "lib")
+ (("\\.\\./src/(phobos|druntime/import)")
+ "include/dmd")))))))
+ (native-inputs (list gdmd which))
+ (home-page "https://github.com/dlang/dmd")
+ (synopsis "Reference D Programming Language compiler")
+ (description "@acronym{DMD, Digital Mars D compiler} is the reference
+compiler for the D programming language.")
+ (license license:boost1.0)))
+
+;;; Second bootstrap of DMD, built using dmd-bootstrap, with its shared
+;;; libraries preserved.
+(define-public dmd
+ (package
+ (inherit dmd-bootstrap)
+ (arguments
+ (substitute-keyword-arguments
+ (strip-keyword-arguments
+ '(#:tests?) ;reinstate tests
+ (package-arguments dmd-bootstrap))
+ ((#:disallowed-references _ ''())
+ (list dmd-bootstrap))
+ ((#:modules _ ''())
+ '((guix build gnu-build-system)
+ (guix build utils)
+ (srfi srfi-1))) ;for fold
+ ((#:make-flags flags ''())
+ #~(fold delete #$flags '("DFLAGS=-L--allow-multiple-definition"
+ "HOST_DMD=gdmd"
+ "SHARED=0")))
+ ((#:phases phases '%standard-phases)
+ #~(modify-phases #$phases
+ (add-after 'patch-dmd.conf 'rewrite-references-to-bootstrap
+ ;; DMD keeps references to include files used to build a
+ ;; binary. Rewrite those of dmd-bootstrap to itself, to reduce
+ ;; its closure size.
+ (lambda* (#:key native-inputs inputs outputs
+ #:allow-other-keys)
+ (let ((dmd (search-input-file outputs "bin/dmd"))
+ (dmd-bootstrap (dirname
+ (dirname
+ (search-input-file
+ (or native-inputs inputs)
+ "bin/dmd")))))
+ ;; XXX: Use sed, as replace-store-references wouldn't
+ ;; replace the references, while substitute* throws an
+ ;; error.
+ (invoke "sed" "-i"
+ (format #f "s,~a,~a,g" dmd-bootstrap #$output)
+ dmd))))))))
+ (native-inputs (modify-inputs (package-native-inputs dmd-bootstrap)
+ (replace "gdmd" dmd-bootstrap)))))
+
(define-public dub
(package
(name "dub")
--
2.41.0
next prev parent reply other threads:[~2024-01-20 4:42 UTC|newest]
Thread overview: 29+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-01-17 22:41 [bug#68554] [PATCH 0/3] Add DMD, the D language reference compiler Maxim Cournoyer
2024-01-18 0:24 ` [bug#68554] [PATCH 1/3] gnu: Add gdc alias Maxim Cournoyer
2024-01-18 0:24 ` [bug#68554] [PATCH 2/3] gnu: gdmd: Replace gdc-11 with " Maxim Cournoyer
2024-01-18 0:24 ` [bug#68554] [PATCH 3/3] gnu: Add dmd Maxim Cournoyer
2024-01-18 3:28 ` [bug#68554] [PATCH v2 0/3] Add DMD, the D language reference compiler Maxim Cournoyer
2024-01-18 3:28 ` [bug#68554] [PATCH v2 1/3] gnu: Add gdc alias Maxim Cournoyer
2024-01-18 3:28 ` [bug#68554] [PATCH v2 2/3] gnu: gdmd: Replace gdc-11 with " Maxim Cournoyer
2024-01-18 3:28 ` [bug#68554] [PATCH v2 3/3] gnu: Add dmd Maxim Cournoyer
2024-01-19 4:40 ` [bug#68554] [PATCH v3 0/6] Add DMD, the D language reference compiler Maxim Cournoyer
2024-01-19 4:40 ` [bug#68554] [PATCH v3 1/6] gnu: Add gdc alias Maxim Cournoyer
2024-01-24 17:20 ` Ludovic Courtès
2024-01-26 20:41 ` bug#68554: " Maxim Cournoyer
2024-01-19 4:40 ` [bug#68554] [PATCH v3 2/6] gnu: gdmd: Replace gdc-11 with " Maxim Cournoyer
2024-01-19 4:40 ` [bug#68554] [PATCH v3 3/6] gnu: Add dmd Maxim Cournoyer
2024-01-19 9:38 ` Efraim Flashner
2024-01-20 4:15 ` Maxim Cournoyer
2024-01-19 4:40 ` [bug#68554] [PATCH v3 4/6] gnu: Add rust-rustc-demangle-capi-0.1 Maxim Cournoyer
2024-01-19 9:38 ` Efraim Flashner
2024-01-20 4:03 ` Maxim Cournoyer
2024-01-19 4:40 ` [bug#68554] [PATCH v3 5/6] gnu: Add d-demangler Maxim Cournoyer
2024-01-19 4:40 ` [bug#68554] [PATCH v3 6/6] gnu: qt-creator: Add support for demangling D and Rust symbols Maxim Cournoyer
2024-01-19 9:38 ` Efraim Flashner
2024-01-20 4:20 ` Maxim Cournoyer
2024-01-20 4:37 ` [bug#68554] [PATCH v4 0/5] Add DMD, the D language reference compiler Maxim Cournoyer
2024-01-20 4:37 ` [bug#68554] [PATCH v4 1/5] gnu: Add gdc alias Maxim Cournoyer
2024-01-20 4:37 ` [bug#68554] [PATCH v4 2/5] gnu: gdmd: Replace gdc-11 with " Maxim Cournoyer
2024-01-20 4:37 ` Maxim Cournoyer [this message]
2024-01-20 4:37 ` [bug#68554] [PATCH v4 4/5] gnu: Add d-demangler Maxim Cournoyer
2024-01-20 4:37 ` [bug#68554] [PATCH v4 5/5] gnu: qt-creator: Add support for demangling D and Rust symbols Maxim Cournoyer
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://guix.gnu.org/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=5e228e1b02057ef071c8c4eb7efda8706be8cda0.1705725428.git.maxim.cournoyer@gmail.com \
--to=maxim.cournoyer@gmail.com \
--cc=68554@debbugs.gnu.org \
--cc=efraim@flashner.co.il \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/guix.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).