2013-01-05 18:47:50 -05:00
|
|
|
|
;;; GNU Guix --- Functional package management for GNU
|
2014-02-21 17:41:11 -05:00
|
|
|
|
;;; Copyright © 2012, 2013, 2014 Ludovic Courtès <ludo@gnu.org>
|
2012-06-27 19:24:34 -04:00
|
|
|
|
;;;
|
2013-01-05 18:47:50 -05:00
|
|
|
|
;;; This file is part of GNU Guix.
|
2012-06-27 19:24:34 -04:00
|
|
|
|
;;;
|
2013-01-05 18:47:50 -05:00
|
|
|
|
;;; GNU Guix is free software; you can redistribute it and/or modify it
|
2012-06-27 19:24:34 -04:00
|
|
|
|
;;; under the terms of the GNU General Public License as published by
|
|
|
|
|
;;; the Free Software Foundation; either version 3 of the License, or (at
|
|
|
|
|
;;; your option) any later version.
|
|
|
|
|
;;;
|
2013-01-05 18:47:50 -05:00
|
|
|
|
;;; GNU Guix is distributed in the hope that it will be useful, but
|
2012-06-27 19:24:34 -04:00
|
|
|
|
;;; 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
|
2013-01-05 18:47:50 -05:00
|
|
|
|
;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>.
|
2012-06-27 19:24:34 -04:00
|
|
|
|
|
|
|
|
|
(define-module (guix packages)
|
|
|
|
|
#:use-module (guix utils)
|
2013-05-12 09:46:16 -04:00
|
|
|
|
#:use-module (guix records)
|
2012-06-27 19:24:34 -04:00
|
|
|
|
#:use-module (guix store)
|
Move base32 code to (guix base32).
* guix/utils.scm (bytevector-quintet-ref, bytevector-quintet-ref-right,
bytevector-quintet-length, bytevector-quintet-fold,
bytevector-quintet-fold-right, make-bytevector->base32-string,
%nix-base32-chars, %rfc4648-base32-chars, bytevector->base32-string,
bytevector->nix-base32-string, bytevector-quintet-set!,
bytevector-quintet-set-right!, base32-string-unfold,
base32-string-unfold-right, make-base32-string->bytevector,
base32-string->bytevector, nix-base32-string->bytevector): Move to...
* guix/base32.scm: ... here. New file.
* tests/utils.scm (%nix-hash, "bytevector->base32-string",
"base32-string->bytevector", "nix-base32-string->bytevector", "sha256
& bytevector->base32-string"): Move to...
* tests/base32.scm: ... here. New file
* guix-download.in, guix/derivations.scm, guix/packages.scm,
guix/snix.scm, tests/builders.scm, tests/derivations.scm: Adjust
accordingly.
* guix.scm (%public-modules): Add `base32'.
2012-11-11 16:33:28 -05:00
|
|
|
|
#:use-module (guix base32)
|
2013-02-15 19:37:26 -05:00
|
|
|
|
#:use-module (guix derivations)
|
2012-06-27 19:24:34 -04:00
|
|
|
|
#:use-module (guix build-system)
|
|
|
|
|
#:use-module (ice-9 match)
|
2012-07-01 11:32:03 -04:00
|
|
|
|
#:use-module (srfi srfi-1)
|
2012-09-01 13:21:06 -04:00
|
|
|
|
#:use-module (srfi srfi-9 gnu)
|
2013-05-20 17:00:47 -04:00
|
|
|
|
#:use-module (srfi srfi-26)
|
2012-08-23 17:09:13 -04:00
|
|
|
|
#:use-module (srfi srfi-34)
|
|
|
|
|
#:use-module (srfi srfi-35)
|
2013-05-25 10:14:37 -04:00
|
|
|
|
#:re-export (%current-system
|
|
|
|
|
%current-target-system)
|
2012-09-01 13:21:06 -04:00
|
|
|
|
#:export (origin
|
2012-07-01 11:32:03 -04:00
|
|
|
|
origin?
|
|
|
|
|
origin-uri
|
|
|
|
|
origin-method
|
|
|
|
|
origin-sha256
|
|
|
|
|
origin-file-name
|
2013-10-08 18:04:45 -04:00
|
|
|
|
origin-patches
|
|
|
|
|
origin-patch-flags
|
|
|
|
|
origin-patch-inputs
|
|
|
|
|
origin-patch-guile
|
2013-11-07 16:41:21 -05:00
|
|
|
|
origin-snippet
|
|
|
|
|
origin-modules
|
|
|
|
|
origin-imported-modules
|
2012-07-01 11:32:03 -04:00
|
|
|
|
base32
|
2012-06-27 19:24:34 -04:00
|
|
|
|
|
2013-03-30 17:56:38 -04:00
|
|
|
|
<search-path-specification>
|
|
|
|
|
search-path-specification
|
|
|
|
|
search-path-specification?
|
|
|
|
|
search-path-specification->sexp
|
|
|
|
|
|
2012-06-27 19:24:34 -04:00
|
|
|
|
package
|
|
|
|
|
package?
|
|
|
|
|
package-name
|
|
|
|
|
package-version
|
2012-09-05 13:01:47 -04:00
|
|
|
|
package-full-name
|
2012-06-27 19:24:34 -04:00
|
|
|
|
package-source
|
|
|
|
|
package-build-system
|
|
|
|
|
package-arguments
|
|
|
|
|
package-inputs
|
|
|
|
|
package-native-inputs
|
2012-07-01 11:32:03 -04:00
|
|
|
|
package-propagated-inputs
|
2012-06-27 19:24:34 -04:00
|
|
|
|
package-outputs
|
2013-03-30 17:56:38 -04:00
|
|
|
|
package-native-search-paths
|
2012-06-27 19:24:34 -04:00
|
|
|
|
package-search-paths
|
2012-11-04 07:41:34 -05:00
|
|
|
|
package-synopsis
|
2012-06-27 19:24:34 -04:00
|
|
|
|
package-description
|
|
|
|
|
package-license
|
2012-11-25 10:55:35 -05:00
|
|
|
|
package-home-page
|
2012-06-27 19:24:34 -04:00
|
|
|
|
package-platforms
|
|
|
|
|
package-maintainers
|
2012-07-01 11:32:03 -04:00
|
|
|
|
package-properties
|
2012-06-28 17:15:24 -04:00
|
|
|
|
package-location
|
2013-04-22 17:07:13 -04:00
|
|
|
|
package-field-location
|
2012-06-27 19:24:34 -04:00
|
|
|
|
|
2014-07-20 12:29:48 -04:00
|
|
|
|
package-direct-inputs
|
2012-07-07 14:14:20 -04:00
|
|
|
|
package-transitive-inputs
|
2013-05-24 16:21:24 -04:00
|
|
|
|
package-transitive-target-inputs
|
|
|
|
|
package-transitive-native-inputs
|
2012-09-01 13:21:06 -04:00
|
|
|
|
package-transitive-propagated-inputs
|
2012-06-27 19:24:34 -04:00
|
|
|
|
package-source-derivation
|
|
|
|
|
package-derivation
|
2012-08-23 17:09:13 -04:00
|
|
|
|
package-cross-derivation
|
2013-02-15 19:37:26 -05:00
|
|
|
|
package-output
|
2012-08-23 17:09:13 -04:00
|
|
|
|
|
|
|
|
|
&package-error
|
2012-10-27 08:56:38 -04:00
|
|
|
|
package-error?
|
2012-08-23 17:09:13 -04:00
|
|
|
|
package-error-package
|
|
|
|
|
&package-input-error
|
2012-10-27 08:56:38 -04:00
|
|
|
|
package-input-error?
|
2013-05-27 17:41:35 -04:00
|
|
|
|
package-error-invalid-input
|
|
|
|
|
&package-cross-build-system-error
|
build-system: Introduce "bags" as an intermediate representation.
* guix/build-system.scm (<build-system>)[build, cross-build]: Remove.
[lower]: New field.
(<bag>): New record type.
(make-bag): New procedure.
* guix/packages.scm (bag-transitive-inputs, bag-transitive-build-inputs,
bag-transitive-host-inputs, bag-transitive-target-inputs,
package->bag): New procedures.
(package-derivation): Use it; use the bag, apply its build procedure,
etc.
(package-cross-derivation): Likewise.
* gnu/packages/bootstrap.scm (raw-build, make-raw-bag): New procedure.
(%bootstrap-guile): Use them.
* guix/build-system/trivial.scm (lower): New procedure.
(trivial-build, trivial-cross-build): Remove 'source' parameter. Pass
INPUTS as is.
(trivial-build-system): Adjust accordingly.
* guix/build-system/gnu.scm (%store, inputs-search-paths,
standard-search-paths, expand-inputs, standard-inputs): Remove.
(gnu-lower): New procedure.
(gnu-build): Remove 'source' and #:implicit-inputs? parameters.
Remove 'implicit-inputs' and 'implicit-search-paths' variables. Get
the source from INPUT-DRVS.
(gnu-cross-build): Likewise.
(standard-cross-packages): Remove call to 'standard-packages'.
(standard-cross-inputs, standard-cross-search-paths): Remove.
(gnu-build-system): Remove 'build' and 'cross-build'; add 'lower'.
* guix/build-system/cmake.scm (lower): New procedure.
(cmake-build): Remove 'source' and #:cmake parameters. Use INPUTS and
SEARCH-PATHS as is. Get the source from INPUTS.
* guix/build-system/perl.scm: Likewise.
* guix/build-system/python.scm: Likewise.
* guix/build-system/ruby.scm: Likewise.
* gnu/packages/cross-base.scm (cross-gcc): Change "cross-linux-headers"
to "linux-headers".
(cross-libc)[xlinux-headers]: Pass #:implicit-cross-inputs? #f.
Likewise. In 'propagated-inputs', change "cross-linux-headers" to
"linux-headers".
* guix/git-download.scm (git-fetch): Use 'standard-packages' instead of
'standard-inputs'.
* tests/builders.scm ("gnu-build-system"): Remove use of
'build-system-builder'.
("gnu-build"): Remove 'source' and #:implicit-inputs? arguments to
'gnu-build'.
* tests/packages.scm ("search paths"): Adjust to new build system API.
("package-cross-derivation, no cross builder"): Likewise.
* doc/guix.texi (Build Systems): Add paragraph on bags.
2014-10-03 12:06:16 -04:00
|
|
|
|
package-cross-build-system-error?
|
|
|
|
|
|
|
|
|
|
package->bag
|
2014-10-05 10:32:25 -04:00
|
|
|
|
bag->derivation
|
build-system: Introduce "bags" as an intermediate representation.
* guix/build-system.scm (<build-system>)[build, cross-build]: Remove.
[lower]: New field.
(<bag>): New record type.
(make-bag): New procedure.
* guix/packages.scm (bag-transitive-inputs, bag-transitive-build-inputs,
bag-transitive-host-inputs, bag-transitive-target-inputs,
package->bag): New procedures.
(package-derivation): Use it; use the bag, apply its build procedure,
etc.
(package-cross-derivation): Likewise.
* gnu/packages/bootstrap.scm (raw-build, make-raw-bag): New procedure.
(%bootstrap-guile): Use them.
* guix/build-system/trivial.scm (lower): New procedure.
(trivial-build, trivial-cross-build): Remove 'source' parameter. Pass
INPUTS as is.
(trivial-build-system): Adjust accordingly.
* guix/build-system/gnu.scm (%store, inputs-search-paths,
standard-search-paths, expand-inputs, standard-inputs): Remove.
(gnu-lower): New procedure.
(gnu-build): Remove 'source' and #:implicit-inputs? parameters.
Remove 'implicit-inputs' and 'implicit-search-paths' variables. Get
the source from INPUT-DRVS.
(gnu-cross-build): Likewise.
(standard-cross-packages): Remove call to 'standard-packages'.
(standard-cross-inputs, standard-cross-search-paths): Remove.
(gnu-build-system): Remove 'build' and 'cross-build'; add 'lower'.
* guix/build-system/cmake.scm (lower): New procedure.
(cmake-build): Remove 'source' and #:cmake parameters. Use INPUTS and
SEARCH-PATHS as is. Get the source from INPUTS.
* guix/build-system/perl.scm: Likewise.
* guix/build-system/python.scm: Likewise.
* guix/build-system/ruby.scm: Likewise.
* gnu/packages/cross-base.scm (cross-gcc): Change "cross-linux-headers"
to "linux-headers".
(cross-libc)[xlinux-headers]: Pass #:implicit-cross-inputs? #f.
Likewise. In 'propagated-inputs', change "cross-linux-headers" to
"linux-headers".
* guix/git-download.scm (git-fetch): Use 'standard-packages' instead of
'standard-inputs'.
* tests/builders.scm ("gnu-build-system"): Remove use of
'build-system-builder'.
("gnu-build"): Remove 'source' and #:implicit-inputs? arguments to
'gnu-build'.
* tests/packages.scm ("search paths"): Adjust to new build system API.
("package-cross-derivation, no cross builder"): Likewise.
* doc/guix.texi (Build Systems): Add paragraph on bags.
2014-10-03 12:06:16 -04:00
|
|
|
|
bag-transitive-inputs
|
|
|
|
|
bag-transitive-host-inputs
|
|
|
|
|
bag-transitive-build-inputs
|
|
|
|
|
bag-transitive-target-inputs))
|
2012-06-27 19:24:34 -04:00
|
|
|
|
|
|
|
|
|
;;; Commentary:
|
|
|
|
|
;;;
|
|
|
|
|
;;; This module provides a high-level mechanism to define packages in a
|
|
|
|
|
;;; Guix-based distribution.
|
|
|
|
|
;;;
|
|
|
|
|
;;; Code:
|
|
|
|
|
|
2012-07-01 11:32:03 -04:00
|
|
|
|
;; The source of a package, such as a tarball URL and fetcher---called
|
|
|
|
|
;; "origin" to avoid name clash with `package-source', `source', etc.
|
|
|
|
|
(define-record-type* <origin>
|
|
|
|
|
origin make-origin
|
|
|
|
|
origin?
|
|
|
|
|
(uri origin-uri) ; string
|
2014-02-21 17:41:11 -05:00
|
|
|
|
(method origin-method) ; procedure
|
2012-07-01 11:32:03 -04:00
|
|
|
|
(sha256 origin-sha256) ; bytevector
|
2013-10-08 18:04:45 -04:00
|
|
|
|
(file-name origin-file-name (default #f)) ; optional file name
|
|
|
|
|
(patches origin-patches (default '())) ; list of file names
|
2013-11-07 16:41:21 -05:00
|
|
|
|
(snippet origin-snippet (default #f)) ; sexp or #f
|
2013-10-08 18:04:45 -04:00
|
|
|
|
(patch-flags origin-patch-flags ; list of strings
|
|
|
|
|
(default '("-p1")))
|
2013-10-10 17:00:47 -04:00
|
|
|
|
|
|
|
|
|
;; Patching requires Guile, GNU Patch, and a few more. These two fields are
|
|
|
|
|
;; used to specify these dependencies when needed.
|
2013-10-08 18:04:45 -04:00
|
|
|
|
(patch-inputs origin-patch-inputs ; input list or #f
|
|
|
|
|
(default #f))
|
2013-11-07 16:41:21 -05:00
|
|
|
|
(modules origin-modules ; list of module names
|
|
|
|
|
(default '()))
|
|
|
|
|
(imported-modules origin-imported-modules ; list of module names
|
|
|
|
|
(default '()))
|
2013-10-10 17:00:47 -04:00
|
|
|
|
(patch-guile origin-patch-guile ; package or #f
|
2013-10-08 18:04:45 -04:00
|
|
|
|
(default #f)))
|
2012-06-27 19:24:34 -04:00
|
|
|
|
|
2014-07-11 07:59:54 -04:00
|
|
|
|
(define (print-origin origin port)
|
|
|
|
|
"Write a concise representation of ORIGIN to PORT."
|
|
|
|
|
(match origin
|
|
|
|
|
(($ <origin> uri method sha256 file-name patches)
|
|
|
|
|
(simple-format port "#<origin ~s ~a ~s ~a>"
|
|
|
|
|
uri (bytevector->base32-string sha256)
|
|
|
|
|
patches
|
|
|
|
|
(number->string (object-address origin) 16)))))
|
|
|
|
|
|
|
|
|
|
(set-record-type-printer! <origin> print-origin)
|
|
|
|
|
|
2012-07-01 11:32:03 -04:00
|
|
|
|
(define-syntax base32
|
|
|
|
|
(lambda (s)
|
|
|
|
|
"Return the bytevector corresponding to the given Nix-base32
|
|
|
|
|
representation."
|
|
|
|
|
(syntax-case s ()
|
|
|
|
|
((_ str)
|
|
|
|
|
(string? (syntax->datum #'str))
|
2013-01-17 09:45:05 -05:00
|
|
|
|
;; A literal string: do the conversion at expansion time.
|
2012-07-01 11:32:03 -04:00
|
|
|
|
(with-syntax ((bv (nix-base32-string->bytevector
|
|
|
|
|
(syntax->datum #'str))))
|
2013-01-17 09:45:05 -05:00
|
|
|
|
#''bv))
|
|
|
|
|
((_ str)
|
|
|
|
|
#'(nix-base32-string->bytevector str)))))
|
2012-07-01 11:32:03 -04:00
|
|
|
|
|
2013-03-30 17:56:38 -04:00
|
|
|
|
;; The specification of a search path.
|
|
|
|
|
(define-record-type* <search-path-specification>
|
|
|
|
|
search-path-specification make-search-path-specification
|
|
|
|
|
search-path-specification?
|
|
|
|
|
(variable search-path-specification-variable)
|
|
|
|
|
(directories search-path-specification-directories)
|
|
|
|
|
(separator search-path-specification-separator (default ":")))
|
|
|
|
|
|
|
|
|
|
(define (search-path-specification->sexp spec)
|
|
|
|
|
"Return an sexp representing SPEC, a <search-path-specification>. The sexp
|
|
|
|
|
corresponds to the arguments expected by `set-path-environment-variable'."
|
|
|
|
|
(match spec
|
|
|
|
|
(($ <search-path-specification> variable directories separator)
|
|
|
|
|
`(,variable ,directories ,separator))))
|
2012-08-23 17:09:13 -04:00
|
|
|
|
|
2013-03-30 17:56:38 -04:00
|
|
|
|
;; A package.
|
2012-06-27 19:24:34 -04:00
|
|
|
|
(define-record-type* <package>
|
|
|
|
|
package make-package
|
|
|
|
|
package?
|
|
|
|
|
(name package-name) ; string
|
|
|
|
|
(version package-version) ; string
|
2012-07-01 11:32:03 -04:00
|
|
|
|
(source package-source) ; <origin> instance
|
2012-06-27 19:24:34 -04:00
|
|
|
|
(build-system package-build-system) ; build system
|
2012-06-28 18:28:57 -04:00
|
|
|
|
(arguments package-arguments ; arguments for the build method
|
packages: Mark the `arguments' field of <package> as thunked.
* guix/packages.scm (<package>): Mark `arguments' as thunked.
(package-derivation): Adjust accordingly. Parameterize
%CURRENT-SYSTEM to SYSTEM, so that arguments can refer to it.
* guix/build-system/gnu.scm (package-with-explicit-inputs): Expect
`package-arguments' to always return a list, and return a list.
(package-with-extra-configure-variable): Likewise.
(static-package): Likewise.
* gnu/packages/base.scm (patch, findutils, gcc-4.7, binutils-boot0,
gcc-boot0, glibc-final-with-bootstrap-bash, cross-gcc-wrapper,
static-bash-for-glibc, binutils-final, gcc-final): Change `arguments'
from a lambda to a list, and use (%current-system) as needed.
(nix-system->gnu-triplet, boot-triplet): Have the first argument
default to (%current-system).
* gnu/packages/bootstrap.scm (glibc-dynamic-linker): Have `system'
default to (%current-system).
(%bootstrap-gcc): Change `arguments' to a list.
* gnu/packages/gawk.scm (gawk): Likewise.
* gnu/packages/m4.scm (m4): Likewise.
* gnu/packages/make-bootstrap.scm (%glibc-for-bootstrap): Likewise, and
expect `package-arguments' to return a list.
(%static-inputs, %gcc-static, tarball-package): Likewise.
* gnu/packages/ncurses.scm (ncurses): Likewise.
2013-01-23 17:21:59 -05:00
|
|
|
|
(default '()) (thunked))
|
2012-07-01 11:32:03 -04:00
|
|
|
|
|
2012-06-27 19:24:34 -04:00
|
|
|
|
(inputs package-inputs ; input packages or derivations
|
2013-01-24 17:33:30 -05:00
|
|
|
|
(default '()) (thunked))
|
2012-07-01 11:32:03 -04:00
|
|
|
|
(propagated-inputs package-propagated-inputs ; same, but propagated
|
2013-06-05 18:04:11 -04:00
|
|
|
|
(default '()) (thunked))
|
2012-06-27 19:24:34 -04:00
|
|
|
|
(native-inputs package-native-inputs ; native input packages/derivations
|
2013-05-25 10:14:57 -04:00
|
|
|
|
(default '()) (thunked))
|
2012-07-01 11:32:03 -04:00
|
|
|
|
(self-native-input? package-self-native-input? ; whether to use itself as
|
|
|
|
|
; a native input when cross-
|
|
|
|
|
(default #f)) ; compiling
|
2012-07-01 11:32:03 -04:00
|
|
|
|
|
2012-06-27 19:24:34 -04:00
|
|
|
|
(outputs package-outputs ; list of strings
|
|
|
|
|
(default '("out")))
|
2013-03-30 17:56:38 -04:00
|
|
|
|
|
|
|
|
|
; lists of
|
|
|
|
|
; <search-path-specification>,
|
|
|
|
|
; for native and cross
|
|
|
|
|
; inputs
|
|
|
|
|
(native-search-paths package-native-search-paths (default '()))
|
|
|
|
|
(search-paths package-search-paths (default '()))
|
2012-06-27 19:24:34 -04:00
|
|
|
|
|
2012-11-04 07:41:34 -05:00
|
|
|
|
(synopsis package-synopsis) ; one-line description
|
|
|
|
|
(description package-description) ; one or two paragraphs
|
2013-03-06 18:42:18 -05:00
|
|
|
|
(license package-license)
|
2012-06-28 17:44:43 -04:00
|
|
|
|
(home-page package-home-page)
|
2012-06-27 19:24:34 -04:00
|
|
|
|
(platforms package-platforms (default '()))
|
2012-06-28 17:15:24 -04:00
|
|
|
|
(maintainers package-maintainers (default '()))
|
2012-06-28 17:44:43 -04:00
|
|
|
|
|
2012-07-01 11:32:03 -04:00
|
|
|
|
(properties package-properties (default '())) ; alist for anything else
|
|
|
|
|
|
2012-06-28 17:15:24 -04:00
|
|
|
|
(location package-location
|
|
|
|
|
(default (and=> (current-source-location)
|
|
|
|
|
source-properties->location))))
|
2012-06-27 19:24:34 -04:00
|
|
|
|
|
2012-09-01 13:21:06 -04:00
|
|
|
|
(set-record-type-printer! <package>
|
|
|
|
|
(lambda (package port)
|
|
|
|
|
(let ((loc (package-location package))
|
|
|
|
|
(format simple-format))
|
|
|
|
|
(format port "#<package ~a-~a ~a:~a ~a>"
|
|
|
|
|
(package-name package)
|
|
|
|
|
(package-version package)
|
|
|
|
|
(location-file loc)
|
|
|
|
|
(location-line loc)
|
|
|
|
|
(number->string (object-address
|
|
|
|
|
package)
|
|
|
|
|
16)))))
|
|
|
|
|
|
2013-04-22 17:07:13 -04:00
|
|
|
|
(define (package-field-location package field)
|
2013-04-24 08:43:31 -04:00
|
|
|
|
"Return the source code location of the definition of FIELD for PACKAGE, or
|
|
|
|
|
#f if it could not be determined."
|
|
|
|
|
(define (goto port line column)
|
|
|
|
|
(unless (and (= (port-column port) (- column 1))
|
|
|
|
|
(= (port-line port) (- line 1)))
|
|
|
|
|
(unless (eof-object? (read-char port))
|
|
|
|
|
(goto port line column))))
|
2013-04-22 17:07:13 -04:00
|
|
|
|
|
|
|
|
|
(match (package-location package)
|
|
|
|
|
(($ <location> file line column)
|
|
|
|
|
(catch 'system
|
|
|
|
|
(lambda ()
|
2013-11-18 17:56:07 -05:00
|
|
|
|
;; In general we want to keep relative file names for modules.
|
|
|
|
|
(with-fluids ((%file-port-name-canonicalization 'relative))
|
|
|
|
|
(call-with-input-file (search-path %load-path file)
|
|
|
|
|
(lambda (port)
|
|
|
|
|
(goto port line column)
|
|
|
|
|
(match (read port)
|
|
|
|
|
(('package inits ...)
|
|
|
|
|
(let ((field (assoc field inits)))
|
|
|
|
|
(match field
|
|
|
|
|
((_ value)
|
|
|
|
|
;; Put the `or' here, and not in the first argument of
|
|
|
|
|
;; `and=>', to work around a compiler bug in 2.0.5.
|
|
|
|
|
(or (and=> (source-properties value)
|
|
|
|
|
source-properties->location)
|
|
|
|
|
(and=> (source-properties field)
|
|
|
|
|
source-properties->location)))
|
|
|
|
|
(_
|
|
|
|
|
#f))))
|
|
|
|
|
(_
|
|
|
|
|
#f))))))
|
2013-04-22 17:07:13 -04:00
|
|
|
|
(lambda _
|
2013-04-24 08:43:31 -04:00
|
|
|
|
#f)))
|
2013-04-22 17:07:13 -04:00
|
|
|
|
(_ #f)))
|
|
|
|
|
|
2012-08-23 17:09:13 -04:00
|
|
|
|
|
|
|
|
|
;; Error conditions.
|
|
|
|
|
|
|
|
|
|
(define-condition-type &package-error &error
|
|
|
|
|
package-error?
|
|
|
|
|
(package package-error-package))
|
|
|
|
|
|
|
|
|
|
(define-condition-type &package-input-error &package-error
|
|
|
|
|
package-input-error?
|
|
|
|
|
(input package-error-invalid-input))
|
|
|
|
|
|
2013-05-27 17:41:35 -04:00
|
|
|
|
(define-condition-type &package-cross-build-system-error &package-error
|
|
|
|
|
package-cross-build-system-error?)
|
|
|
|
|
|
2012-08-23 17:09:13 -04:00
|
|
|
|
|
2012-09-05 13:01:47 -04:00
|
|
|
|
(define (package-full-name package)
|
|
|
|
|
"Return the full name of PACKAGE--i.e., `NAME-VERSION'."
|
|
|
|
|
(string-append (package-name package) "-" (package-version package)))
|
|
|
|
|
|
2013-10-08 18:04:45 -04:00
|
|
|
|
(define (%standard-patch-inputs)
|
|
|
|
|
(let ((ref (lambda (module var)
|
|
|
|
|
(module-ref (resolve-interface module) var))))
|
|
|
|
|
`(("tar" ,(ref '(gnu packages base) 'tar))
|
|
|
|
|
("xz" ,(ref '(gnu packages compression) 'xz))
|
|
|
|
|
("bzip2" ,(ref '(gnu packages compression) 'bzip2))
|
|
|
|
|
("gzip" ,(ref '(gnu packages compression) 'gzip))
|
|
|
|
|
("lzip" ,(ref '(gnu packages compression) 'lzip))
|
|
|
|
|
("patch" ,(ref '(gnu packages base) 'patch)))))
|
|
|
|
|
|
2013-10-10 17:00:47 -04:00
|
|
|
|
(define (default-guile)
|
|
|
|
|
"Return the default Guile package for SYSTEM."
|
gnu: Split (gnu packages base), adding (gnu packages commencement).
* gnu/packages/base.scm (gnu-make-boot0, diffutils-boot0,
findutils-boot0, %boot0-inputs, nix-system->gnu-triplet, boot-triplet,
binutils-boot0, gcc-boot0, perl-boot0, linux-libre-headers-boot0,
texinfo-boot0, %boot1-inputs, glibc-final-with-bootstrap-bash,
cross-gcc-wrapper, static-bash-for-glibc, glibc-final,
gcc-boot0-wrapped, %boot2-inputs, binutils-final, libstdc++,
gcc-final, ld-wrapper-boot3, %boot3-inputs, bash-final, %boot4-inputs,
guile-final, gnu-make-final, ld-wrapper, coreutils-final, grep-final,
%boot5-inputs, %final-inputs, canonical-package, gcc-toolchain,
gcc-toolchain-4.8, gcc-toolchain-4.9): Move to...
* gnu/packages/commencement.scm: ... here. New file.
* gnu-system.am (GNU_SYSTEM_MODULES): Add it.
* build-aux/check-final-inputs-self-contained.scm: Adjust accordingly.
* gnu/packages/cross-base.scm: Likewise.
* gnu/packages/make-bootstrap.scm: Likewise.
* guix/build-system/cmake.scm (cmake-build): Likewise.
* guix/build-system/gnu.scm (standard-packages, gnu-build,
gnu-cross-build): Likewise.
* guix/build-system/perl.scm (perl-build): Likewise.
* guix/build-system/python.scm (python-build): Likewise.
* guix/build-system/trivial.scm (guile-for-build): Likewise.
* guix/download.scm (url-fetch): Likewise.
* guix/gexp.scm (default-guile): Likewise.
* guix/git-download.scm (git-fetch): Likewise.
* guix/monads.scm (run-with-store): Likewise.
* guix/packages.scm (default-guile): Likewise.
* guix/scripts/package.scm (guix-package): Likewise.
* guix/scripts/refresh.scm: Likewise.
* guix/svn-download.scm (svn-fetch): Likewise.
* tests/builders.scm (%bootstrap-inputs, %bootstrap-search-paths):
Likewise.
* tests/packages.scm ("GNU Make, bootstrap"): Likewise.
* tests/guix-package.sh: Likewise.
* gnu/services/base.scm: Use 'canonical-package' instead of xxx-final.
* gnu/services/xorg.scm: Likewise.
* gnu/system/vm.scm: Likewise.
* guix/scripts/pull.scm (guix-pull): Likewise.
2014-08-26 18:25:17 -04:00
|
|
|
|
(let ((distro (resolve-interface '(gnu packages commencement))))
|
2013-10-10 17:00:47 -04:00
|
|
|
|
(module-ref distro 'guile-final)))
|
2013-10-08 18:04:45 -04:00
|
|
|
|
|
2013-11-07 16:41:21 -05:00
|
|
|
|
(define* (patch-and-repack store source patches
|
2013-10-08 18:04:45 -04:00
|
|
|
|
#:key
|
2013-11-07 16:41:21 -05:00
|
|
|
|
(inputs '())
|
|
|
|
|
(snippet #f)
|
2013-10-08 18:04:45 -04:00
|
|
|
|
(flags '("-p1"))
|
2013-11-07 16:41:21 -05:00
|
|
|
|
(modules '())
|
|
|
|
|
(imported-modules '())
|
2013-10-08 18:04:45 -04:00
|
|
|
|
(guile-for-build (%guile-for-build))
|
|
|
|
|
(system (%current-system)))
|
2013-11-07 16:41:21 -05:00
|
|
|
|
"Unpack SOURCE (a derivation or store path), apply all of PATCHES, and
|
|
|
|
|
repack the tarball using the tools listed in INPUTS. When SNIPPET is true,
|
|
|
|
|
it must be an s-expression that will run from within the directory where
|
|
|
|
|
SOURCE was unpacked, after all of PATCHES have been applied. MODULES and
|
|
|
|
|
IMPORTED-MODULES specify modules to use/import for use by SNIPPET."
|
|
|
|
|
(define source-file-name
|
|
|
|
|
;; SOURCE is usually a derivation, but it could be a store file.
|
|
|
|
|
(if (derivation? source)
|
|
|
|
|
(derivation->output-path source)
|
|
|
|
|
source))
|
|
|
|
|
|
2013-10-08 18:04:45 -04:00
|
|
|
|
(define decompression-type
|
2013-11-07 16:41:21 -05:00
|
|
|
|
(cond ((string-suffix? "gz" source-file-name) "gzip")
|
|
|
|
|
((string-suffix? "bz2" source-file-name) "bzip2")
|
|
|
|
|
((string-suffix? "lz" source-file-name) "lzip")
|
|
|
|
|
(else "xz")))
|
2013-10-08 18:04:45 -04:00
|
|
|
|
|
|
|
|
|
(define original-file-name
|
2013-11-07 16:41:21 -05:00
|
|
|
|
;; Remove the store prefix plus the slash, hash, and hyphen.
|
|
|
|
|
(let* ((sans (string-drop source-file-name
|
|
|
|
|
(+ (string-length (%store-prefix)) 1)))
|
|
|
|
|
(dash (string-index sans #\-)))
|
|
|
|
|
(string-drop sans (+ 1 dash))))
|
2013-10-08 18:04:45 -04:00
|
|
|
|
|
2014-02-28 04:42:09 -05:00
|
|
|
|
(define (numeric-extension? file-name)
|
|
|
|
|
;; Return true if FILE-NAME ends with digits.
|
2014-04-12 08:39:43 -04:00
|
|
|
|
(and=> (file-extension file-name)
|
|
|
|
|
(cut string-every char-set:hex-digit <>)))
|
2014-02-28 04:42:09 -05:00
|
|
|
|
|
|
|
|
|
(define (tarxz-name file-name)
|
|
|
|
|
;; Return a '.tar.xz' file name based on FILE-NAME.
|
|
|
|
|
(let ((base (if (numeric-extension? file-name)
|
|
|
|
|
original-file-name
|
|
|
|
|
(file-sans-extension file-name))))
|
|
|
|
|
(string-append base
|
|
|
|
|
(if (equal? (file-extension base) "tar")
|
|
|
|
|
".xz"
|
|
|
|
|
".tar.xz"))))
|
|
|
|
|
|
2013-10-08 18:04:45 -04:00
|
|
|
|
(define patch-inputs
|
|
|
|
|
(map (lambda (number patch)
|
|
|
|
|
(list (string-append "patch" (number->string number))
|
2014-09-24 13:07:22 -04:00
|
|
|
|
(match patch
|
|
|
|
|
((? string?)
|
|
|
|
|
(add-to-store store (basename patch) #t
|
|
|
|
|
"sha256" patch))
|
|
|
|
|
((? origin?)
|
|
|
|
|
(package-source-derivation store patch)))))
|
2013-10-08 18:04:45 -04:00
|
|
|
|
(iota (length patches))
|
|
|
|
|
|
|
|
|
|
patches))
|
|
|
|
|
|
|
|
|
|
(define builder
|
|
|
|
|
`(begin
|
|
|
|
|
(use-modules (ice-9 ftw)
|
2014-02-28 04:42:09 -05:00
|
|
|
|
(srfi srfi-1)
|
|
|
|
|
(guix build utils))
|
2013-10-08 18:04:45 -04:00
|
|
|
|
|
|
|
|
|
(let ((out (assoc-ref %outputs "out"))
|
|
|
|
|
(xz (assoc-ref %build-inputs "xz"))
|
|
|
|
|
(decomp (assoc-ref %build-inputs ,decompression-type))
|
|
|
|
|
(source (assoc-ref %build-inputs "source"))
|
|
|
|
|
(tar (string-append (assoc-ref %build-inputs "tar")
|
|
|
|
|
"/bin/tar"))
|
|
|
|
|
(patch (string-append (assoc-ref %build-inputs "patch")
|
|
|
|
|
"/bin/patch")))
|
|
|
|
|
(define (apply-patch input)
|
|
|
|
|
(let ((patch* (assoc-ref %build-inputs input)))
|
|
|
|
|
(format (current-error-port) "applying '~a'...~%" patch*)
|
|
|
|
|
(zero? (system* patch "--batch" ,@flags "--input" patch*))))
|
|
|
|
|
|
2014-02-28 04:42:09 -05:00
|
|
|
|
(define (first-file directory)
|
|
|
|
|
;; Return the name of the first file in DIRECTORY.
|
|
|
|
|
(car (scandir directory
|
|
|
|
|
(lambda (name)
|
|
|
|
|
(not (member name '("." "..")))))))
|
|
|
|
|
|
2013-10-08 18:04:45 -04:00
|
|
|
|
(setenv "PATH" (string-append xz "/bin" ":"
|
|
|
|
|
decomp "/bin"))
|
2014-02-28 04:42:09 -05:00
|
|
|
|
|
|
|
|
|
;; SOURCE may be either a directory or a tarball.
|
|
|
|
|
(and (if (file-is-directory? source)
|
2014-03-10 18:51:31 -04:00
|
|
|
|
(let* ((store (or (getenv "NIX_STORE") "/gnu/store"))
|
2014-02-28 04:42:09 -05:00
|
|
|
|
(len (+ 1 (string-length store)))
|
|
|
|
|
(base (string-drop source len))
|
|
|
|
|
(dash (string-index base #\-))
|
|
|
|
|
(directory (string-drop base (+ 1 dash))))
|
|
|
|
|
(mkdir directory)
|
|
|
|
|
(copy-recursively source directory)
|
|
|
|
|
#t)
|
|
|
|
|
(zero? (system* tar "xvf" source)))
|
|
|
|
|
(let ((directory (first-file ".")))
|
2013-10-08 18:04:45 -04:00
|
|
|
|
(format (current-error-port)
|
|
|
|
|
"source is under '~a'~%" directory)
|
|
|
|
|
(chdir directory)
|
2013-11-07 16:41:21 -05:00
|
|
|
|
|
2013-10-08 18:04:45 -04:00
|
|
|
|
(and (every apply-patch ',(map car patch-inputs))
|
2013-11-07 16:41:21 -05:00
|
|
|
|
|
|
|
|
|
,@(if snippet
|
|
|
|
|
`((let ((module (make-fresh-user-module)))
|
|
|
|
|
(module-use-interfaces! module
|
|
|
|
|
(map resolve-interface
|
|
|
|
|
',modules))
|
|
|
|
|
(module-define! module '%build-inputs
|
|
|
|
|
%build-inputs)
|
|
|
|
|
(module-define! module '%outputs %outputs)
|
|
|
|
|
((@ (system base compile) compile)
|
|
|
|
|
',snippet
|
|
|
|
|
#:to 'value
|
|
|
|
|
#:opts %auto-compilation-options
|
|
|
|
|
#:env module)))
|
|
|
|
|
'())
|
|
|
|
|
|
2013-10-08 18:04:45 -04:00
|
|
|
|
(begin (chdir "..") #t)
|
|
|
|
|
(zero? (system* tar "cvfa" out directory))))))))
|
|
|
|
|
|
|
|
|
|
|
2014-02-28 04:42:09 -05:00
|
|
|
|
(let ((name (tarxz-name original-file-name))
|
|
|
|
|
(inputs (filter-map (match-lambda
|
|
|
|
|
((name (? package? p))
|
|
|
|
|
(and (member name (cons decompression-type
|
|
|
|
|
'("tar" "xz" "patch")))
|
|
|
|
|
(list name
|
|
|
|
|
(package-derivation store p
|
|
|
|
|
system)))))
|
|
|
|
|
(or inputs (%standard-patch-inputs))))
|
|
|
|
|
(modules (delete-duplicates (cons '(guix build utils) modules))))
|
2013-10-08 18:04:45 -04:00
|
|
|
|
|
2014-02-28 04:42:09 -05:00
|
|
|
|
(build-expression->derivation store name builder
|
derivations: Use more keyword parameters for 'build-expression->derivation'.
* guix/derivations.scm (build-expression->derivation): Turn 'system' and
'inputs' into keyword parameters.
Adjust callers accordingly.
* gnu/system/linux.scm, gnu/system/vm.scm, guix/build-system/cmake.scm,
guix/build-system/gnu.scm, guix/build-system/perl.scm,
guix/build-system/python.scm, guix/build-system/trivial.scm,
guix/download.scm, guix/packages.scm, guix/profiles.scm,
guix/scripts/pull.scm, tests/derivations.scm, tests/guix-build.sh,
tests/monads.scm, tests/store.scm, tests/union.scm: Adjust users of
'build-expression->derivation' and 'derivation-expression'
accordingly.
* doc/guix.texi (Derivations): Adjust 'build-expression->derivation'
documentation accordingly.
(The Store Monad): Likewise for 'derivation-expression'.
2013-12-04 10:07:36 -05:00
|
|
|
|
#:inputs `(("source" ,source)
|
|
|
|
|
,@inputs
|
|
|
|
|
,@patch-inputs)
|
|
|
|
|
#:system system
|
2014-02-28 04:42:09 -05:00
|
|
|
|
#:modules modules
|
2013-10-08 18:04:45 -04:00
|
|
|
|
#:guile-for-build guile-for-build)))
|
|
|
|
|
|
2012-10-25 17:41:15 -04:00
|
|
|
|
(define* (package-source-derivation store source
|
|
|
|
|
#:optional (system (%current-system)))
|
|
|
|
|
"Return the derivation path for SOURCE, a package source, for SYSTEM."
|
2012-06-27 19:24:34 -04:00
|
|
|
|
(match source
|
2013-11-07 16:41:21 -05:00
|
|
|
|
(($ <origin> uri method sha256 name () #f)
|
|
|
|
|
;; No patches, no snippet: this is a fixed-output derivation.
|
2012-10-25 17:41:15 -04:00
|
|
|
|
(method store uri 'sha256 sha256 name
|
2013-08-24 10:58:44 -04:00
|
|
|
|
#:system system))
|
2013-11-07 16:41:21 -05:00
|
|
|
|
(($ <origin> uri method sha256 name (patches ...) snippet
|
|
|
|
|
(flags ...) inputs (modules ...) (imported-modules ...)
|
|
|
|
|
guile-for-build)
|
|
|
|
|
;; Patches and/or a snippet.
|
2013-10-08 18:04:45 -04:00
|
|
|
|
(let ((source (method store uri 'sha256 sha256 name
|
2013-10-10 17:00:47 -04:00
|
|
|
|
#:system system))
|
|
|
|
|
(guile (match (or guile-for-build (%guile-for-build)
|
|
|
|
|
(default-guile))
|
|
|
|
|
((? package? p)
|
|
|
|
|
(package-derivation store p system))
|
|
|
|
|
((? derivation? drv)
|
|
|
|
|
drv))))
|
2013-11-07 16:41:21 -05:00
|
|
|
|
(patch-and-repack store source patches
|
|
|
|
|
#:inputs inputs
|
|
|
|
|
#:snippet snippet
|
2013-10-08 18:04:45 -04:00
|
|
|
|
#:flags flags
|
|
|
|
|
#:system system
|
2013-11-07 16:41:21 -05:00
|
|
|
|
#:modules modules
|
|
|
|
|
#:imported-modules modules
|
2013-10-10 17:00:47 -04:00
|
|
|
|
#:guile-for-build guile)))
|
2013-11-12 17:44:47 -05:00
|
|
|
|
((and (? string?) (? direct-store-path?) file)
|
2013-08-24 10:58:44 -04:00
|
|
|
|
file)
|
|
|
|
|
((? string? file)
|
|
|
|
|
(add-to-store store (basename file) #t "sha256" file))))
|
2012-06-27 19:24:34 -04:00
|
|
|
|
|
2012-09-01 13:21:06 -04:00
|
|
|
|
(define (transitive-inputs inputs)
|
|
|
|
|
(let loop ((inputs inputs)
|
2012-07-07 14:14:20 -04:00
|
|
|
|
(result '()))
|
|
|
|
|
(match inputs
|
|
|
|
|
(()
|
|
|
|
|
(delete-duplicates (reverse result))) ; XXX: efficiency
|
|
|
|
|
(((and i (name (? package? p) sub ...)) rest ...)
|
|
|
|
|
(let ((t (map (match-lambda
|
|
|
|
|
((dep-name derivation ...)
|
|
|
|
|
(cons (string-append name "/" dep-name)
|
|
|
|
|
derivation)))
|
|
|
|
|
(package-propagated-inputs p))))
|
|
|
|
|
(loop (append t rest)
|
|
|
|
|
(append t (cons i result)))))
|
|
|
|
|
((input rest ...)
|
|
|
|
|
(loop rest (cons input result))))))
|
|
|
|
|
|
2014-07-20 12:29:48 -04:00
|
|
|
|
(define (package-direct-inputs package)
|
|
|
|
|
"Return all the direct inputs of PACKAGE---i.e, its direct inputs along
|
|
|
|
|
with their propagated inputs."
|
|
|
|
|
(append (package-native-inputs package)
|
|
|
|
|
(package-inputs package)
|
|
|
|
|
(package-propagated-inputs package)))
|
|
|
|
|
|
2012-09-01 13:21:06 -04:00
|
|
|
|
(define (package-transitive-inputs package)
|
|
|
|
|
"Return the transitive inputs of PACKAGE---i.e., its direct inputs along
|
|
|
|
|
with their propagated inputs, recursively."
|
2014-07-20 12:29:48 -04:00
|
|
|
|
(transitive-inputs (package-direct-inputs package)))
|
2012-09-01 13:21:06 -04:00
|
|
|
|
|
2013-05-24 16:21:24 -04:00
|
|
|
|
(define (package-transitive-target-inputs package)
|
|
|
|
|
"Return the transitive target inputs of PACKAGE---i.e., its direct inputs
|
|
|
|
|
along with their propagated inputs, recursively. This only includes inputs
|
|
|
|
|
for the target system, and not native inputs."
|
|
|
|
|
(transitive-inputs (append (package-inputs package)
|
|
|
|
|
(package-propagated-inputs package))))
|
|
|
|
|
|
|
|
|
|
(define (package-transitive-native-inputs package)
|
|
|
|
|
"Return the transitive native inputs of PACKAGE---i.e., its direct inputs
|
|
|
|
|
along with their propagated inputs, recursively. This only includes inputs
|
|
|
|
|
for the host system (\"native inputs\"), and not target inputs."
|
|
|
|
|
(transitive-inputs (package-native-inputs package)))
|
|
|
|
|
|
2012-09-01 13:21:06 -04:00
|
|
|
|
(define (package-transitive-propagated-inputs package)
|
|
|
|
|
"Return the propagated inputs of PACKAGE, and their propagated inputs,
|
|
|
|
|
recursively."
|
|
|
|
|
(transitive-inputs (package-propagated-inputs package)))
|
|
|
|
|
|
build-system: Introduce "bags" as an intermediate representation.
* guix/build-system.scm (<build-system>)[build, cross-build]: Remove.
[lower]: New field.
(<bag>): New record type.
(make-bag): New procedure.
* guix/packages.scm (bag-transitive-inputs, bag-transitive-build-inputs,
bag-transitive-host-inputs, bag-transitive-target-inputs,
package->bag): New procedures.
(package-derivation): Use it; use the bag, apply its build procedure,
etc.
(package-cross-derivation): Likewise.
* gnu/packages/bootstrap.scm (raw-build, make-raw-bag): New procedure.
(%bootstrap-guile): Use them.
* guix/build-system/trivial.scm (lower): New procedure.
(trivial-build, trivial-cross-build): Remove 'source' parameter. Pass
INPUTS as is.
(trivial-build-system): Adjust accordingly.
* guix/build-system/gnu.scm (%store, inputs-search-paths,
standard-search-paths, expand-inputs, standard-inputs): Remove.
(gnu-lower): New procedure.
(gnu-build): Remove 'source' and #:implicit-inputs? parameters.
Remove 'implicit-inputs' and 'implicit-search-paths' variables. Get
the source from INPUT-DRVS.
(gnu-cross-build): Likewise.
(standard-cross-packages): Remove call to 'standard-packages'.
(standard-cross-inputs, standard-cross-search-paths): Remove.
(gnu-build-system): Remove 'build' and 'cross-build'; add 'lower'.
* guix/build-system/cmake.scm (lower): New procedure.
(cmake-build): Remove 'source' and #:cmake parameters. Use INPUTS and
SEARCH-PATHS as is. Get the source from INPUTS.
* guix/build-system/perl.scm: Likewise.
* guix/build-system/python.scm: Likewise.
* guix/build-system/ruby.scm: Likewise.
* gnu/packages/cross-base.scm (cross-gcc): Change "cross-linux-headers"
to "linux-headers".
(cross-libc)[xlinux-headers]: Pass #:implicit-cross-inputs? #f.
Likewise. In 'propagated-inputs', change "cross-linux-headers" to
"linux-headers".
* guix/git-download.scm (git-fetch): Use 'standard-packages' instead of
'standard-inputs'.
* tests/builders.scm ("gnu-build-system"): Remove use of
'build-system-builder'.
("gnu-build"): Remove 'source' and #:implicit-inputs? arguments to
'gnu-build'.
* tests/packages.scm ("search paths"): Adjust to new build system API.
("package-cross-derivation, no cross builder"): Likewise.
* doc/guix.texi (Build Systems): Add paragraph on bags.
2014-10-03 12:06:16 -04:00
|
|
|
|
(define (bag-transitive-inputs bag)
|
|
|
|
|
"Same as 'package-transitive-inputs', but applied to a bag."
|
|
|
|
|
(transitive-inputs (append (bag-build-inputs bag)
|
|
|
|
|
(bag-host-inputs bag)
|
|
|
|
|
(bag-target-inputs bag))))
|
|
|
|
|
|
|
|
|
|
(define (bag-transitive-build-inputs bag)
|
|
|
|
|
"Same as 'package-transitive-native-inputs', but applied to a bag."
|
|
|
|
|
(transitive-inputs (bag-build-inputs bag)))
|
|
|
|
|
|
|
|
|
|
(define (bag-transitive-host-inputs bag)
|
|
|
|
|
"Same as 'package-transitive-target-inputs', but applied to a bag."
|
|
|
|
|
(transitive-inputs (bag-host-inputs bag)))
|
|
|
|
|
|
|
|
|
|
(define (bag-transitive-target-inputs bag)
|
|
|
|
|
"Return the \"target inputs\" of BAG, recursively."
|
|
|
|
|
(transitive-inputs (bag-target-inputs bag)))
|
|
|
|
|
|
2012-09-01 13:21:06 -04:00
|
|
|
|
|
|
|
|
|
;;;
|
|
|
|
|
;;; Package derivations.
|
|
|
|
|
;;;
|
|
|
|
|
|
|
|
|
|
(define %derivation-cache
|
|
|
|
|
;; Package to derivation-path mapping.
|
2012-10-08 16:07:19 -04:00
|
|
|
|
(make-weak-key-hash-table 100))
|
2012-09-01 13:21:06 -04:00
|
|
|
|
|
2013-01-20 16:17:58 -05:00
|
|
|
|
(define (cache package system thunk)
|
|
|
|
|
"Memoize the return values of THUNK as the derivation of PACKAGE on
|
|
|
|
|
SYSTEM."
|
2014-07-21 16:06:36 -04:00
|
|
|
|
;; FIXME: This memoization should be associated with the open store, because
|
|
|
|
|
;; otherwise it breaks when switching to a different store.
|
2013-01-20 16:17:58 -05:00
|
|
|
|
(let ((vals (call-with-values thunk list)))
|
|
|
|
|
;; Use `hashq-set!' instead of `hash-set!' because `hash' returns the
|
|
|
|
|
;; same value for all structs (as of Guile 2.0.6), and because pointer
|
|
|
|
|
;; equality is sufficient in practice.
|
|
|
|
|
(hashq-set! %derivation-cache package `((,system ,@vals)))
|
|
|
|
|
(apply values vals)))
|
|
|
|
|
|
|
|
|
|
(define-syntax-rule (cached package system body ...)
|
|
|
|
|
"Memoize the result of BODY for the arguments PACKAGE and SYSTEM.
|
|
|
|
|
Return the cached result when available."
|
|
|
|
|
(let ((thunk (lambda () body ...)))
|
|
|
|
|
(match (hashq-ref %derivation-cache package)
|
|
|
|
|
((alist (... ...))
|
|
|
|
|
(match (assoc-ref alist system)
|
|
|
|
|
((vals (... ...))
|
|
|
|
|
(apply values vals))
|
|
|
|
|
(#f
|
|
|
|
|
(cache package system thunk))))
|
|
|
|
|
(#f
|
|
|
|
|
(cache package system thunk)))))
|
2012-09-01 13:21:06 -04:00
|
|
|
|
|
2013-05-20 17:00:47 -04:00
|
|
|
|
(define* (expand-input store package input system #:optional cross-system)
|
|
|
|
|
"Expand INPUT, an input tuple, such that it contains only references to
|
|
|
|
|
derivation paths or store paths. PACKAGE is only used to provide contextual
|
|
|
|
|
information in exceptions."
|
2012-10-21 10:57:50 -04:00
|
|
|
|
(define (intern file)
|
|
|
|
|
;; Add FILE to the store. Set the `recursive?' bit to #t, so that
|
|
|
|
|
;; file permissions are preserved.
|
2013-01-30 10:30:49 -05:00
|
|
|
|
(add-to-store store (basename file) #t "sha256" file))
|
2012-10-21 10:57:50 -04:00
|
|
|
|
|
2013-05-20 17:00:47 -04:00
|
|
|
|
(define derivation
|
|
|
|
|
(if cross-system
|
|
|
|
|
(cut package-cross-derivation store <> cross-system system)
|
|
|
|
|
(cut package-derivation store <> system)))
|
|
|
|
|
|
|
|
|
|
(match input
|
|
|
|
|
(((? string? name) (? package? package))
|
|
|
|
|
(list name (derivation package)))
|
|
|
|
|
(((? string? name) (? package? package)
|
|
|
|
|
(? string? sub-drv))
|
|
|
|
|
(list name (derivation package)
|
|
|
|
|
sub-drv))
|
|
|
|
|
(((? string? name)
|
|
|
|
|
(and (? string?) (? derivation-path?) drv))
|
|
|
|
|
(list name drv))
|
|
|
|
|
(((? string? name)
|
|
|
|
|
(and (? string?) (? file-exists? file)))
|
|
|
|
|
;; Add FILE to the store. When FILE is in the sub-directory of a
|
|
|
|
|
;; store path, it needs to be added anyway, so it can be used as a
|
|
|
|
|
;; source.
|
|
|
|
|
(list name (intern file)))
|
|
|
|
|
(((? string? name) (? origin? source))
|
|
|
|
|
(list name (package-source-derivation store source system)))
|
|
|
|
|
(x
|
|
|
|
|
(raise (condition (&package-input-error
|
|
|
|
|
(package package)
|
|
|
|
|
(input x)))))))
|
2012-10-21 10:57:50 -04:00
|
|
|
|
|
build-system: Introduce "bags" as an intermediate representation.
* guix/build-system.scm (<build-system>)[build, cross-build]: Remove.
[lower]: New field.
(<bag>): New record type.
(make-bag): New procedure.
* guix/packages.scm (bag-transitive-inputs, bag-transitive-build-inputs,
bag-transitive-host-inputs, bag-transitive-target-inputs,
package->bag): New procedures.
(package-derivation): Use it; use the bag, apply its build procedure,
etc.
(package-cross-derivation): Likewise.
* gnu/packages/bootstrap.scm (raw-build, make-raw-bag): New procedure.
(%bootstrap-guile): Use them.
* guix/build-system/trivial.scm (lower): New procedure.
(trivial-build, trivial-cross-build): Remove 'source' parameter. Pass
INPUTS as is.
(trivial-build-system): Adjust accordingly.
* guix/build-system/gnu.scm (%store, inputs-search-paths,
standard-search-paths, expand-inputs, standard-inputs): Remove.
(gnu-lower): New procedure.
(gnu-build): Remove 'source' and #:implicit-inputs? parameters.
Remove 'implicit-inputs' and 'implicit-search-paths' variables. Get
the source from INPUT-DRVS.
(gnu-cross-build): Likewise.
(standard-cross-packages): Remove call to 'standard-packages'.
(standard-cross-inputs, standard-cross-search-paths): Remove.
(gnu-build-system): Remove 'build' and 'cross-build'; add 'lower'.
* guix/build-system/cmake.scm (lower): New procedure.
(cmake-build): Remove 'source' and #:cmake parameters. Use INPUTS and
SEARCH-PATHS as is. Get the source from INPUTS.
* guix/build-system/perl.scm: Likewise.
* guix/build-system/python.scm: Likewise.
* guix/build-system/ruby.scm: Likewise.
* gnu/packages/cross-base.scm (cross-gcc): Change "cross-linux-headers"
to "linux-headers".
(cross-libc)[xlinux-headers]: Pass #:implicit-cross-inputs? #f.
Likewise. In 'propagated-inputs', change "cross-linux-headers" to
"linux-headers".
* guix/git-download.scm (git-fetch): Use 'standard-packages' instead of
'standard-inputs'.
* tests/builders.scm ("gnu-build-system"): Remove use of
'build-system-builder'.
("gnu-build"): Remove 'source' and #:implicit-inputs? arguments to
'gnu-build'.
* tests/packages.scm ("search paths"): Adjust to new build system API.
("package-cross-derivation, no cross builder"): Likewise.
* doc/guix.texi (Build Systems): Add paragraph on bags.
2014-10-03 12:06:16 -04:00
|
|
|
|
(define* (package->bag package #:optional
|
|
|
|
|
(system (%current-system))
|
|
|
|
|
(target (%current-target-system)))
|
|
|
|
|
"Compile PACKAGE into a bag for SYSTEM, possibly cross-compiled to TARGET,
|
|
|
|
|
and return it."
|
|
|
|
|
;; Bind %CURRENT-SYSTEM and %CURRENT-TARGET-SYSTEM so that thunked field
|
|
|
|
|
;; values can refer to it.
|
|
|
|
|
(parameterize ((%current-system system)
|
|
|
|
|
(%current-target-system target))
|
|
|
|
|
(match package
|
|
|
|
|
(($ <package> name version source build-system
|
|
|
|
|
args inputs propagated-inputs native-inputs self-native-input?
|
|
|
|
|
outputs)
|
|
|
|
|
(or (make-bag build-system (package-full-name package)
|
2014-10-05 10:32:25 -04:00
|
|
|
|
#:system system
|
build-system: Introduce "bags" as an intermediate representation.
* guix/build-system.scm (<build-system>)[build, cross-build]: Remove.
[lower]: New field.
(<bag>): New record type.
(make-bag): New procedure.
* guix/packages.scm (bag-transitive-inputs, bag-transitive-build-inputs,
bag-transitive-host-inputs, bag-transitive-target-inputs,
package->bag): New procedures.
(package-derivation): Use it; use the bag, apply its build procedure,
etc.
(package-cross-derivation): Likewise.
* gnu/packages/bootstrap.scm (raw-build, make-raw-bag): New procedure.
(%bootstrap-guile): Use them.
* guix/build-system/trivial.scm (lower): New procedure.
(trivial-build, trivial-cross-build): Remove 'source' parameter. Pass
INPUTS as is.
(trivial-build-system): Adjust accordingly.
* guix/build-system/gnu.scm (%store, inputs-search-paths,
standard-search-paths, expand-inputs, standard-inputs): Remove.
(gnu-lower): New procedure.
(gnu-build): Remove 'source' and #:implicit-inputs? parameters.
Remove 'implicit-inputs' and 'implicit-search-paths' variables. Get
the source from INPUT-DRVS.
(gnu-cross-build): Likewise.
(standard-cross-packages): Remove call to 'standard-packages'.
(standard-cross-inputs, standard-cross-search-paths): Remove.
(gnu-build-system): Remove 'build' and 'cross-build'; add 'lower'.
* guix/build-system/cmake.scm (lower): New procedure.
(cmake-build): Remove 'source' and #:cmake parameters. Use INPUTS and
SEARCH-PATHS as is. Get the source from INPUTS.
* guix/build-system/perl.scm: Likewise.
* guix/build-system/python.scm: Likewise.
* guix/build-system/ruby.scm: Likewise.
* gnu/packages/cross-base.scm (cross-gcc): Change "cross-linux-headers"
to "linux-headers".
(cross-libc)[xlinux-headers]: Pass #:implicit-cross-inputs? #f.
Likewise. In 'propagated-inputs', change "cross-linux-headers" to
"linux-headers".
* guix/git-download.scm (git-fetch): Use 'standard-packages' instead of
'standard-inputs'.
* tests/builders.scm ("gnu-build-system"): Remove use of
'build-system-builder'.
("gnu-build"): Remove 'source' and #:implicit-inputs? arguments to
'gnu-build'.
* tests/packages.scm ("search paths"): Adjust to new build system API.
("package-cross-derivation, no cross builder"): Likewise.
* doc/guix.texi (Build Systems): Add paragraph on bags.
2014-10-03 12:06:16 -04:00
|
|
|
|
#:target target
|
|
|
|
|
#:source source
|
|
|
|
|
#:inputs (append (inputs)
|
|
|
|
|
(propagated-inputs))
|
|
|
|
|
#:outputs outputs
|
|
|
|
|
#:native-inputs `(,@(if (and target self-native-input?)
|
|
|
|
|
`(("self" ,package))
|
|
|
|
|
'())
|
|
|
|
|
,@(native-inputs))
|
|
|
|
|
#:arguments (args))
|
|
|
|
|
(raise (if target
|
|
|
|
|
(condition
|
|
|
|
|
(&package-cross-build-system-error
|
|
|
|
|
(package package)))
|
|
|
|
|
(condition
|
|
|
|
|
(&package-error
|
|
|
|
|
(package package))))))))))
|
|
|
|
|
|
2014-10-05 10:32:25 -04:00
|
|
|
|
(define* (bag->derivation store bag
|
|
|
|
|
#:optional context)
|
|
|
|
|
"Return the derivation to build BAG for SYSTEM. Optionally, CONTEXT can be
|
|
|
|
|
a package object describing the context in which the call occurs, for improved
|
|
|
|
|
error reporting."
|
|
|
|
|
(if (bag-target bag)
|
|
|
|
|
(bag->cross-derivation store bag)
|
|
|
|
|
(let* ((system (bag-system bag))
|
|
|
|
|
(inputs (bag-transitive-inputs bag))
|
|
|
|
|
(input-drvs (map (cut expand-input store context <> system)
|
|
|
|
|
inputs))
|
|
|
|
|
(paths (delete-duplicates
|
|
|
|
|
(append-map (match-lambda
|
|
|
|
|
((_ (? package? p) _ ...)
|
|
|
|
|
(package-native-search-paths
|
|
|
|
|
p))
|
|
|
|
|
(_ '()))
|
|
|
|
|
inputs))))
|
|
|
|
|
|
|
|
|
|
(apply (bag-build bag)
|
|
|
|
|
store (bag-name bag) input-drvs
|
|
|
|
|
#:search-paths paths
|
|
|
|
|
#:outputs (bag-outputs bag) #:system system
|
|
|
|
|
(bag-arguments bag)))))
|
|
|
|
|
|
|
|
|
|
(define* (bag->cross-derivation store bag
|
|
|
|
|
#:optional context)
|
|
|
|
|
"Return the derivation to build BAG, which is actually a cross build.
|
|
|
|
|
Optionally, CONTEXT can be a package object denoting the context of the call.
|
|
|
|
|
This is an internal procedure."
|
|
|
|
|
(let* ((system (bag-system bag))
|
|
|
|
|
(target (bag-target bag))
|
|
|
|
|
(host (bag-transitive-host-inputs bag))
|
|
|
|
|
(host-drvs (map (cut expand-input store context <> system target)
|
|
|
|
|
host))
|
|
|
|
|
(target* (bag-transitive-target-inputs bag))
|
|
|
|
|
(target-drvs (map (cut expand-input store context <> system)
|
|
|
|
|
target*))
|
|
|
|
|
(build (bag-transitive-build-inputs bag))
|
|
|
|
|
(build-drvs (map (cut expand-input store context <> system)
|
|
|
|
|
build))
|
|
|
|
|
(all (append build target* host))
|
|
|
|
|
(paths (delete-duplicates
|
|
|
|
|
(append-map (match-lambda
|
|
|
|
|
((_ (? package? p) _ ...)
|
|
|
|
|
(package-search-paths p))
|
|
|
|
|
(_ '()))
|
|
|
|
|
all)))
|
|
|
|
|
(npaths (delete-duplicates
|
|
|
|
|
(append-map (match-lambda
|
|
|
|
|
((_ (? package? p) _ ...)
|
|
|
|
|
(package-native-search-paths
|
|
|
|
|
p))
|
|
|
|
|
(_ '()))
|
|
|
|
|
all))))
|
|
|
|
|
|
|
|
|
|
(apply (bag-build bag)
|
|
|
|
|
store (bag-name bag)
|
|
|
|
|
#:native-drvs build-drvs
|
|
|
|
|
#:target-drvs (append host-drvs target-drvs)
|
|
|
|
|
#:search-paths paths
|
|
|
|
|
#:native-search-paths npaths
|
|
|
|
|
#:outputs (bag-outputs bag)
|
|
|
|
|
#:system system #:target target
|
|
|
|
|
(bag-arguments bag))))
|
|
|
|
|
|
2013-05-20 17:00:47 -04:00
|
|
|
|
(define* (package-derivation store package
|
|
|
|
|
#:optional (system (%current-system)))
|
derivations: 'derivation' and related procedures return a single value.
* guix/derivations.scm (derivation->output-path,
derivation->output-paths): New procedures.
(derivation-path->output-path): Use 'derivation->output-path'.
(derivation-path->output-paths): Use 'derivation->output-paths'.
(derivation): Accept 'derivation?' objects as inputs. Return a single
value.
(build-derivations): New procedure.
(compiled-modules): Use 'derivation->output-paths'.
(build-expression->derivation)[source-path]: Add case for when the
input matches 'derivation?'.
[prologue]: Accept 'derivation?' objects in INPUTS.
[mod-dir, go-dir]: Use 'derivation->output-path'.
* guix/download.scm (url-fetch): Adjust to the single-value return.
* guix/packages.scm (package-output): Use 'derivation->output-path'.
* guix/scripts/build.scm (guix-build): When the argument is
'derivation-path?', pass it through 'read-derivation'.
Use 'derivation-file-name' to print out the .drv file names, and to
register them. Use 'derivation->output-path' instead of
'derivation-path->output-path'.
* guix/scripts/package.scm (roll-back): Adjust to the single-value
return.
(guix-package): Use 'derivation->output-path'.
* guix/ui.scm (show-what-to-build): Adjust to deal with 'derivation?'
objects instead of .drv file names.
* gnu/system/grub.scm (grub-configuration-file): Use
'derivation->output-path' instead of 'derivation-path->output-path'.
* gnu/system/vm.scm (qemu-image, system-qemu-image): Likewise.
* tests/builders.scm, tests/derivations.scm, tests/packages.scm,
tests/store.scm, tests/union.scm: Adjust to the new calling
convention.
* doc/guix.texi (Defining Packages, The Store, Derivations): Adjust
accordingly.
2013-09-18 11:01:40 -04:00
|
|
|
|
"Return the <derivation> object of PACKAGE for SYSTEM."
|
|
|
|
|
|
2013-01-20 16:17:58 -05:00
|
|
|
|
;; Compute the derivation and cache the result. Caching is important
|
|
|
|
|
;; because some derivations, such as the implicit inputs of the GNU build
|
|
|
|
|
;; system, will be queried many, many times in a row.
|
|
|
|
|
(cached package system
|
2014-10-05 10:32:25 -04:00
|
|
|
|
(bag->derivation store (package->bag package system #f)
|
|
|
|
|
package)))
|
2012-06-27 19:24:34 -04:00
|
|
|
|
|
2013-05-24 16:21:24 -04:00
|
|
|
|
(define* (package-cross-derivation store package target
|
2013-05-20 17:00:47 -04:00
|
|
|
|
#:optional (system (%current-system)))
|
2013-05-24 16:21:24 -04:00
|
|
|
|
"Cross-build PACKAGE for TARGET (a GNU triplet) from host SYSTEM (a Guix
|
|
|
|
|
system identifying string)."
|
|
|
|
|
(cached package (cons system target)
|
2014-10-05 10:32:25 -04:00
|
|
|
|
(bag->derivation store (package->bag package system target)
|
|
|
|
|
package)))
|
2013-02-15 19:37:26 -05:00
|
|
|
|
|
2013-09-25 17:26:42 -04:00
|
|
|
|
(define* (package-output store package
|
|
|
|
|
#:optional (output "out") (system (%current-system)))
|
2013-02-15 19:37:26 -05:00
|
|
|
|
"Return the output path of PACKAGE's OUTPUT for SYSTEM---where OUTPUT is the
|
|
|
|
|
symbolic output name, such as \"out\". Note that this procedure calls
|
|
|
|
|
`package-derivation', which is costly."
|
derivations: 'derivation' and related procedures return a single value.
* guix/derivations.scm (derivation->output-path,
derivation->output-paths): New procedures.
(derivation-path->output-path): Use 'derivation->output-path'.
(derivation-path->output-paths): Use 'derivation->output-paths'.
(derivation): Accept 'derivation?' objects as inputs. Return a single
value.
(build-derivations): New procedure.
(compiled-modules): Use 'derivation->output-paths'.
(build-expression->derivation)[source-path]: Add case for when the
input matches 'derivation?'.
[prologue]: Accept 'derivation?' objects in INPUTS.
[mod-dir, go-dir]: Use 'derivation->output-path'.
* guix/download.scm (url-fetch): Adjust to the single-value return.
* guix/packages.scm (package-output): Use 'derivation->output-path'.
* guix/scripts/build.scm (guix-build): When the argument is
'derivation-path?', pass it through 'read-derivation'.
Use 'derivation-file-name' to print out the .drv file names, and to
register them. Use 'derivation->output-path' instead of
'derivation-path->output-path'.
* guix/scripts/package.scm (roll-back): Adjust to the single-value
return.
(guix-package): Use 'derivation->output-path'.
* guix/ui.scm (show-what-to-build): Adjust to deal with 'derivation?'
objects instead of .drv file names.
* gnu/system/grub.scm (grub-configuration-file): Use
'derivation->output-path' instead of 'derivation-path->output-path'.
* gnu/system/vm.scm (qemu-image, system-qemu-image): Likewise.
* tests/builders.scm, tests/derivations.scm, tests/packages.scm,
tests/store.scm, tests/union.scm: Adjust to the new calling
convention.
* doc/guix.texi (Defining Packages, The Store, Derivations): Adjust
accordingly.
2013-09-18 11:01:40 -04:00
|
|
|
|
(let ((drv (package-derivation store package system)))
|
|
|
|
|
(derivation->output-path drv output)))
|