Package: guix-patches;
Reported by: Maxim Cournoyer <maxim.cournoyer <at> gmail.com>
Date: Wed, 17 Jan 2024 22:42:02 UTC
Severity: normal
Tags: patch
Done: Maxim Cournoyer <maxim.cournoyer <at> gmail.com>
Bug is archived. No further changes may be made.
View this message in rfc822 format
From: Maxim Cournoyer <maxim.cournoyer <at> gmail.com> To: Efraim Flashner <efraim <at> flashner.co.il> Cc: 68554 <at> debbugs.gnu.org Subject: [bug#68554] [PATCH v3 3/6] gnu: Add dmd. Date: Fri, 19 Jan 2024 23:15:50 -0500
Hello! Efraim Flashner <efraim <at> flashner.co.il> writes: > On Thu, Jan 18, 2024 at 11:40:41PM -0500, Maxim Cournoyer wrote: >> * gnu/packages/dlang.scm (dmd-bootstrap, dmd): New variables. >> >> Change-Id: I53e00a429e2084a392341ef1bc7ea63f0fcaaab4 [...] >> +;;; 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 name version)) > > you should probably switch name to "phobos", otherwise I assume it'll be > added as dmd. Good catch, done. > Also, is this the right way to add phobos as an input? It's the gexp way to add extra source files to a package workspace. We used to do this via labeled origins, but this is not possible in the label-less new world. I think it'd be cool to have a procedure that would take multiple source and merge them into one, possible using a copy-build-system like "plan" for the layout. Note: I tried building phobos separately at first, but that was a world of hurt, and the end result was a seg faulting dmd :-(. >> + (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 ".."))) > > Can this one be: > (with-directory-excursion "../druntime" > (apply (assoc-ref %standard-phases 'install) args)) Confusingly, no, as what I'm doing here is moving from ./phobos to ./druntime and finally to "."; i.e. the starting directory for the 'install-druntime phase is './phobos', not '.' Does that make some sense (writing it I'm doubtful, eh) ? > >> + (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)) > > Is this different than the regular install phase? I the install phase of druntime doesn't install its import includes, for some reason, and the install phase of phobos puts them under src/phobos instead of include/dmd. >> + (add-after 'install-license-files 'refine-install-layout >> + (lambda _ >> + (let* ((docdir (string-append #$output "/share/doc/" >> + (strip-store-file-name #$output))) > > is strip-store-file-name better than #$name "-" #$version ? I got bit by gexps being expanded in-place and not being rewritten in the inherited package, so to reuse that phase I had to use dynamic alternatives. >> + ;; 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") > > I only see 1 output, so this should probably be > (string-append #$output "/etc/dmd.conf") The search-input-file on outputs is a defensive trick: it fails with a clear error message when the file isn't found (I can't say that much about substitute* ^^'). So it's used here to test the file got installed there as expected. Thanks for taking a look! -- Maxim
GNU bug tracking system
Copyright (C) 1999 Darren O. Benham,
1997,2003 nCipher Corporation Ltd,
1994-97 Ian Jackson.