From mboxrd@z Thu Jan 1 00:00:00 1970 From: Danny Milosavljevic Subject: [PATCH v2 2/2] gnu: Add dub-build-system. Date: Mon, 23 Jan 2017 19:24:09 +0100 Message-ID: <20170123182409.16427-3-dannym@scratchpost.org> References: <20170123182409.16427-1-dannym@scratchpost.org> Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Return-path: Received: from eggs.gnu.org ([2001:4830:134:3::10]:44892) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cVjHw-0007az-4t for guix-devel@gnu.org; Mon, 23 Jan 2017 13:24:21 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cVjHs-00073O-Ml for guix-devel@gnu.org; Mon, 23 Jan 2017 13:24:20 -0500 Received: from dd1012.kasserver.com ([85.13.128.8]:57081) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cVjHs-00073G-8e for guix-devel@gnu.org; Mon, 23 Jan 2017 13:24:16 -0500 In-Reply-To: <20170123182409.16427-1-dannym@scratchpost.org> List-Id: "Development of GNU Guix and the GNU System distribution." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: guix-devel-bounces+gcggd-guix-devel=m.gmane.org@gnu.org Sender: "Guix-devel" To: guix-devel@gnu.org * guix/build-system/dub.scm: New file. * guix/build/dub-build-system.scm: New file. * Makefile.am (MODULES): Add them. --- Makefile.am | 2 + guix/build-system/dub.scm | 153 ++++++++++++++++++++++++++++++++++= ++++++ guix/build/dub-build-system.scm | 110 +++++++++++++++++++++++++++++ 3 files changed, 265 insertions(+) create mode 100644 guix/build-system/dub.scm create mode 100644 guix/build/dub-build-system.scm diff --git a/Makefile.am b/Makefile.am index c13d0df8a..15bafa224 100644 --- a/Makefile.am +++ b/Makefile.am @@ -63,6 +63,7 @@ MODULES =3D \ guix/build-system/ant.scm \ guix/build-system/cargo.scm \ guix/build-system/cmake.scm \ + guix/build-system/dub.scm \ guix/build-system/emacs.scm \ guix/build-system/asdf.scm \ guix/build-system/glib-or-gtk.scm \ @@ -87,6 +88,7 @@ MODULES =3D \ guix/build/download.scm \ guix/build/cargo-build-system.scm \ guix/build/cmake-build-system.scm \ + guix/build/dub-build-system.scm \ guix/build/emacs-build-system.scm \ guix/build/asdf-build-system.scm \ guix/build/git.scm \ diff --git a/guix/build-system/dub.scm b/guix/build-system/dub.scm new file mode 100644 index 000000000..cecdba843 --- /dev/null +++ b/guix/build-system/dub.scm @@ -0,0 +1,153 @@ +;;; GNU Guix --- Functional package management for GNU +;;; Copyright =C2=A9 2013, 2014, 2015, 2016 Ludovic Court=C3=A8s +;;; Copyright =C2=A9 2013 Andreas Enge +;;; Copyright =C2=A9 2013 Nikita Karetnikov +;;; Copyright =C2=A9 2016 David Craven +;;; Copyright =C2=A9 2016 Danny Milosavljevic +;;; +;;; This file is part of GNU Guix. +;;; +;;; GNU Guix is free software; you can redistribute it and/or modify it +;;; under the terms of the GNU General Public License as published by +;;; the Free Software Foundation; either version 3 of the License, or (a= t +;;; your option) any later version. +;;; +;;; GNU Guix is distributed in the hope that it will be useful, but +;;; WITHOUT ANY WARRANTY; without even the implied warranty of +;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;;; GNU General Public License for more details. +;;; +;;; You should have received a copy of the GNU General Public License +;;; along with GNU Guix. If not, see . + +(define-module (guix build-system dub) + #:use-module (guix search-paths) + #:use-module (guix store) + #:use-module (guix utils) + #:use-module (guix derivations) + #:use-module (guix packages) + #:use-module (guix build-system) + #:use-module (guix build-system gnu) + #:use-module (ice-9 match) + #:use-module (srfi srfi-26) + #:export (dub-build-system + package-url + package-url? + package-uri)) + +(define package-url "https://packages.io/api/v1/packages/") +(define package-url? (cut string-prefix? package-url <>)) + +(define (package-uri name version) + "Return a URI string for the package package hosted at packages.io cor= responding +to NAME and VERSION." + (string-append package-url name "/" version "/download")) + +(define (default-ldc) + "Return the default Rustc package." + ;; Lazily resolve the binding to avoid a circular dependency. + (let ((ldc (resolve-interface '(gnu packages ldc)))) + (module-ref ldc 'ldc))) + +(define (default-dub) + "Return the default Rustc package." + ;; Lazily resolve the binding to avoid a circular dependency. + (let ((ldc (resolve-interface '(gnu packages ldc)))) + (module-ref ldc 'dub))) + +(define %dub-build-system-modules + ;; Build-side modules imported by default. + `((guix build dub-build-system) + (guix build syscalls) + ,@%gnu-build-system-modules)) + +(define* (dub-build store name inputs + #:key + (tests? #t) + (test-target #f) + (configure-flags #f) ; XXX unused + (dub-build-flags ''()) + (phases '(@ (guix build dub-build-system) + %standard-phases)) + (outputs '("out")) + (search-paths '()) + (system (%current-system)) + (guile #f) + (imported-modules %dub-build-system-modules) + (modules '((guix build dub-build-system) + (guix build utils)))) + "Build SOURCE using DUB, and with INPUTS." + + (define builder + `(begin + (use-modules ,@modules) + (dub-build #:name ,name + #:source ,(match (assoc-ref inputs "source") + (((? derivation? source)) + (derivation->output-path source)) + ((source) + source) + (source + source)) + #:system ,system + #:test-target ,test-target + #:dub-build-flags ,dub-build-flags + #:tests? ,tests? + #:phases ,phases + #:outputs %outputs + #:search-paths ',(map search-path-specification->sex= p + search-paths) + #:inputs %build-inputs))) + + (define guile-for-build + (match guile + ((? package?) + (package-derivation store guile system #:graft? #f)) + (#f ; the default + (let* ((distro (resolve-interface '(gnu packages commencement))) + (guile (module-ref distro 'guile-final))) + (package-derivation store guile system #:graft? #f))))) + + (build-expression->derivation store name builder + #:inputs inputs + #:system system + #:modules imported-modules + #:outputs (cons "src" outputs) + #:guile-for-build guile-for-build)) + +(define* (lower name + #:key source inputs native-inputs outputs system target + (ldc (default-ldc)) + (dub (default-dub)) + #:allow-other-keys + #:rest arguments) + "Return a bag for NAME." + + (define private-keywords + '(#:source #:target #:ldc #:dub #:inputs #:native-inputs #:outputs)) + + (and (not target) ;; TODO: support cross-compilation + (bag + (name name) + (system system) + (target target) + (host-inputs `(,@(if source + `(("source" ,source)) + '()) + ,@inputs + + ;; Keep the standard inputs of 'gnu-build-system= ' + ,@(standard-packages))) + (build-inputs `(("ldc" ,ldc) + ("dub" ,dub) + ,@native-inputs)) + (outputs outputs) + (build dub-build) + (arguments (strip-keyword-arguments private-keywords arguments)= )))) + +(define dub-build-system + (build-system + (name 'dub) + (description + "DUB build system, to build Rust packages") + (lower lower))) diff --git a/guix/build/dub-build-system.scm b/guix/build/dub-build-syste= m.scm new file mode 100644 index 000000000..e58d2e343 --- /dev/null +++ b/guix/build/dub-build-system.scm @@ -0,0 +1,110 @@ +;;; GNU Guix --- Functional package management for GNU +;;; Copyright =C2=A9 2016 David Craven +;;; Copyright =C2=A9 2017 Danny Milosavljevic +;;; +;;; This file is part of GNU Guix. +;;; +;;; GNU Guix is free software; you can redistribute it and/or modify it +;;; under the terms of the GNU General Public License as published by +;;; the Free Software Foundation; either version 3 of the License, or (a= t +;;; your option) any later version. +;;; +;;; GNU Guix is distributed in the hope that it will be useful, but +;;; WITHOUT ANY WARRANTY; without even the implied warranty of +;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;;; GNU General Public License for more details. +;;; +;;; You should have received a copy of the GNU General Public License +;;; along with GNU Guix. If not, see . + +(define-module (guix build dub-build-system) + #:use-module ((guix build gnu-build-system) #:prefix gnu:) + #:use-module (guix build syscalls) + #:use-module (guix build utils) + #:use-module (ice-9 popen) + #:use-module (ice-9 rdelim) + #:use-module (ice-9 ftw) + #:use-module (ice-9 format) + #:use-module (ice-9 match) + #:use-module (srfi srfi-1) + #:use-module (srfi srfi-26) + #:export (%standard-phases + dub-build)) + +;; Commentary: +;; +;; Builder-side code of the standard Rust package build procedure. +;; +;; Code: + +;; FIXME: Needs to be parsed from url not package name. +(define (package-name->d-package-name name) + "Return the package name of NAME." + (match (string-split name #\-) + (("d" rest ...) + (string-join rest "-")) + (_ #f))) + +(define* (configure #:key inputs #:allow-other-keys) + "Replace argo.toml [dependencies] section with guix inputs." + (system* "chmod" "+w" ".") + (mkdir "vendor") + (for-each + (match-lambda + ((name . path) + (let ((d-package (package-name->d-package-name name))) + (when (and d-package path) + (match (string-split (basename path) #\-) + ((_ ... version) + (symlink (string-append path "/lib/d") (string-append "ven= dor/" (basename path))))))))) + inputs) + ;(setenv "CC" (string-append (assoc-ref inputs "gcc") "/bin/gcc")) + (let* ((dir (mkdtemp! "/tmp/dub.XXXXXX"))) + (setenv "HOME" dir) + (zero? (system* "dub" "add-path" (string-append (getcwd) "/vendor"))= ))) + +(define* (build #:key (dub-build-flags '()) + #:allow-other-keys) + "Build a given DUB package." + (if (or (zero? (system* "grep" "-q" "sourceLibrary" "package.json")) + (zero? (system* "grep" "-q" "sourceLibrary" "dub.sdl")) + (zero? (system* "grep" "-q" "sourceLibrary" "dub.json"))) ; no= te: format is different! + #t + (let ((status (zero? (apply system* `("dub" "build" ,@dub-build-flag= s))))) + ; TODO "targetType": "sourceLibrary" + (system* "dub" "run") ; might fail for "targetType": "library" + status))) + +(define* (check #:key tests? #:allow-other-keys) + (if tests? + (zero? (system* "dub" "test")) + #t)) + +(define* (install #:key inputs outputs #:allow-other-keys) + "Install a given DUB package (as source)." + (let* ((out (assoc-ref outputs "out")) + (outbin (string-append out "/bin")) + (src (assoc-ref inputs "source")) + (rsrc (string-append (assoc-ref outputs "src") + "/lib/d"))) + (mkdir-p outbin) + ;; TODO remove "-test-application" + (copy-recursively "bin" outbin) + (mkdir-p rsrc) + (delete-file-recursively "vendor") ; contains timestamps + (copy-recursively "." (string-append rsrc)) + #t)) + +(define %standard-phases + (modify-phases gnu:%standard-phases + (replace 'configure configure) + (replace 'build build) + (replace 'check check) + (replace 'install install))) + +(define* (dub-build #:key inputs (phases %standard-phases) + #:allow-other-keys #:rest args) + "Build the given DUB package, applying all of PHASES in order." + (apply gnu:gnu-build #:inputs inputs #:phases phases args)) + +;;; dub-build-system.scm ends here