Move search path specifications to (guix search-paths).
[guix.git] / guix / build-system / ruby.scm
blobe4fda30cf394321ebd24489ff7a8913ba058e10c
1 ;;; GNU Guix --- Functional package management for GNU
2 ;;; Copyright © 2014 David Thompson <davet@gnu.org>
3 ;;; Copyright © 2014, 2015 Ludovic Courtès <ludo@gnu.org>
4 ;;;
5 ;;; This file is part of GNU Guix.
6 ;;;
7 ;;; GNU Guix is free software; you can redistribute it and/or modify it
8 ;;; under the terms of the GNU General Public License as published by
9 ;;; the Free Software Foundation; either version 3 of the License, or (at
10 ;;; your option) any later version.
11 ;;;
12 ;;; GNU Guix is distributed in the hope that it will be useful, but
13 ;;; WITHOUT ANY WARRANTY; without even the implied warranty of
14 ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 ;;; GNU General Public License for more details.
16 ;;;
17 ;;; You should have received a copy of the GNU General Public License
18 ;;; along with GNU Guix.  If not, see <http://www.gnu.org/licenses/>.
20 (define-module (guix build-system ruby)
21   #:use-module (guix store)
22   #:use-module (guix utils)
23   #:use-module (guix packages)
24   #:use-module (guix derivations)
25   #:use-module (guix search-paths)
26   #:use-module (guix build-system)
27   #:use-module (guix build-system gnu)
28   #:use-module (ice-9 match)
29   #:export (%ruby-build-system-modules
30             ruby-build
31             ruby-build-system))
33 (define %ruby-build-system-modules
34   ;; Build-side modules imported by default.
35   `((guix build ruby-build-system)
36     ,@%gnu-build-system-modules))
38 (define (default-ruby)
39   "Return the default Ruby package."
40   ;; Lazily resolve the binding to avoid a circular dependency.
41   (let ((ruby (resolve-interface '(gnu packages ruby))))
42     (module-ref ruby 'ruby)))
44 (define* (lower name
45                 #:key source inputs native-inputs outputs system target
46                 (ruby (default-ruby))
47                 #:allow-other-keys
48                 #:rest arguments)
49   "Return a bag for NAME."
50   (define private-keywords
51     '(#:source #:target #:ruby #:inputs #:native-inputs))
53   (let ((version-control (resolve-interface '(gnu packages version-control))))
54     (and (not target)                    ;XXX: no cross-compilation
55          (bag
56            (name name)
57            (system system)
58            (host-inputs `(,@(if source
59                                 `(("source" ,source))
60                                 '())
61                           ,@inputs
63                           ;; Keep the standard inputs of 'gnu-build-system'.
64                           ,@(standard-packages)))
65            (build-inputs `(("ruby" ,ruby)
66                            ("git" ,(module-ref version-control 'git))
67                            ,@native-inputs))
68            (outputs outputs)
69            (build ruby-build)
70            (arguments (strip-keyword-arguments private-keywords arguments))))))
72 (define* (ruby-build store name inputs
73                      #:key
74                      (test-target "test")
75                      (tests? #t)
76                      (phases '(@ (guix build ruby-build-system)
77                                  %standard-phases))
78                      (outputs '("out"))
79                      (search-paths '())
80                      (system (%current-system))
81                      (guile #f)
82                      (imported-modules %ruby-build-system-modules)
83                      (modules '((guix build ruby-build-system)
84                                 (guix build utils))))
85   "Build SOURCE using RUBY and INPUTS."
86   (define builder
87     `(begin
88        (use-modules ,@modules)
89        (ruby-build #:name ,name
90                    #:source ,(match (assoc-ref inputs "source")
91                                (((? derivation? source))
92                                 (derivation->output-path source))
93                                ((source)
94                                 source)
95                                (source
96                                 source))
97                    #:system ,system
98                    #:test-target ,test-target
99                    #:tests? ,tests?
100                    #:phases ,phases
101                    #:outputs %outputs
102                    #:search-paths ',(map search-path-specification->sexp
103                                          search-paths)
104                    #:inputs %build-inputs)))
106   (define guile-for-build
107     (match guile
108       ((? package?)
109        (package-derivation store guile system #:graft? #f))
110       (#f
111        (let* ((distro (resolve-interface '(gnu packages commencement)))
112               (guile  (module-ref distro 'guile-final)))
113          (package-derivation store guile system #:graft? #f)))))
115   (build-expression->derivation store name builder
116                                 #:inputs inputs
117                                 #:system system
118                                 #:modules imported-modules
119                                 #:outputs outputs
120                                 #:guile-for-build guile-for-build))
122 (define ruby-build-system
123   (build-system
124     (name 'ruby)
125     (description "The standard Ruby build system")
126     (lower lower)))