2017-03-12 16:48:40 +01:00
|
|
|
|
;;; GNU Guix --- Functional package management for GNU
|
2018-05-07 10:36:13 +02:00
|
|
|
|
;;; Copyright © 2015, 2017, 2018 Ludovic Courtès <ludo@gnu.org>
|
2017-03-23 10:47:32 +01:00
|
|
|
|
;;; Copyright © 2017 Efraim Flashner <efraim@flashner.co.il>
|
2017-08-19 17:56:28 +02:00
|
|
|
|
;;; Copyright © 2017 Ricardo Wurmus <rekado@elephly.net>
|
2018-02-09 20:33:12 +01:00
|
|
|
|
;;; Copyright © 2018 Konrad Hinsen <konrad.hinsen@fastmail.net>
|
2018-03-11 01:13:01 +01:00
|
|
|
|
;;; Copyright © 2018 Chris Marusich <cmmarusich@gmail.com>
|
2017-03-12 16:48:40 +01:00
|
|
|
|
;;;
|
|
|
|
|
;;; 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 (at
|
|
|
|
|
;;; 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 <http://www.gnu.org/licenses/>.
|
|
|
|
|
|
|
|
|
|
(define-module (guix scripts pack)
|
|
|
|
|
#:use-module (guix scripts)
|
|
|
|
|
#:use-module (guix ui)
|
|
|
|
|
#:use-module (guix gexp)
|
|
|
|
|
#:use-module (guix utils)
|
|
|
|
|
#:use-module (guix store)
|
|
|
|
|
#:use-module (guix grafts)
|
|
|
|
|
#:use-module (guix monads)
|
2017-03-16 18:02:59 +01:00
|
|
|
|
#:use-module (guix modules)
|
2017-03-12 16:48:40 +01:00
|
|
|
|
#:use-module (guix packages)
|
|
|
|
|
#:use-module (guix profiles)
|
|
|
|
|
#:use-module (guix derivations)
|
2018-05-02 17:08:37 +02:00
|
|
|
|
#:use-module (guix search-paths)
|
|
|
|
|
#:use-module (guix build-system gnu)
|
2017-03-12 16:48:40 +01:00
|
|
|
|
#:use-module (guix scripts build)
|
|
|
|
|
#:use-module (gnu packages)
|
2018-03-11 01:13:01 +01:00
|
|
|
|
#:use-module (gnu packages bootstrap)
|
2017-03-12 16:48:40 +01:00
|
|
|
|
#:use-module (gnu packages compression)
|
2018-03-11 01:13:01 +01:00
|
|
|
|
#:use-module (gnu packages guile)
|
2018-05-07 10:36:13 +02:00
|
|
|
|
#:use-module (gnu packages base)
|
2017-03-12 16:48:40 +01:00
|
|
|
|
#:autoload (gnu packages package-management) (guix)
|
2017-03-16 18:02:59 +01:00
|
|
|
|
#:autoload (gnu packages gnupg) (libgcrypt)
|
2017-05-20 14:28:24 +02:00
|
|
|
|
#:autoload (gnu packages guile) (guile2.0-json guile-json)
|
2017-03-12 16:48:40 +01:00
|
|
|
|
#:use-module (srfi srfi-1)
|
|
|
|
|
#:use-module (srfi srfi-9)
|
2018-05-07 10:44:18 +02:00
|
|
|
|
#:use-module (srfi srfi-26)
|
2017-03-12 16:48:40 +01:00
|
|
|
|
#:use-module (srfi srfi-37)
|
|
|
|
|
#:use-module (ice-9 match)
|
|
|
|
|
#:export (compressor?
|
|
|
|
|
lookup-compressor
|
|
|
|
|
self-contained-tarball
|
|
|
|
|
guix-pack))
|
|
|
|
|
|
|
|
|
|
;; Type of a compression tool.
|
|
|
|
|
(define-record-type <compressor>
|
2017-03-17 17:37:00 +01:00
|
|
|
|
(compressor name extension command)
|
2017-03-12 16:48:40 +01:00
|
|
|
|
compressor?
|
2017-03-17 17:37:00 +01:00
|
|
|
|
(name compressor-name) ;string (e.g., "gzip")
|
2017-08-19 17:56:28 +02:00
|
|
|
|
(extension compressor-extension) ;string (e.g., ".lz")
|
2017-03-17 17:37:00 +01:00
|
|
|
|
(command compressor-command)) ;gexp (e.g., #~("/gnu/store/…/gzip" "-9n"))
|
2017-03-12 16:48:40 +01:00
|
|
|
|
|
|
|
|
|
(define %compressors
|
|
|
|
|
;; Available compression tools.
|
2017-08-19 17:56:28 +02:00
|
|
|
|
(list (compressor "gzip" ".gz"
|
2017-03-17 17:37:00 +01:00
|
|
|
|
#~(#+(file-append gzip "/bin/gzip") "-9n"))
|
2017-08-19 17:56:28 +02:00
|
|
|
|
(compressor "lzip" ".lz"
|
2017-03-17 17:37:00 +01:00
|
|
|
|
#~(#+(file-append lzip "/bin/lzip") "-9"))
|
2017-08-19 17:56:28 +02:00
|
|
|
|
(compressor "xz" ".xz"
|
2017-03-23 10:47:32 +01:00
|
|
|
|
#~(#+(file-append xz "/bin/xz") "-e -T0"))
|
2017-08-19 17:56:28 +02:00
|
|
|
|
(compressor "bzip2" ".bz2"
|
|
|
|
|
#~(#+(file-append bzip2 "/bin/bzip2") "-9"))
|
|
|
|
|
(compressor "none" "" #f)))
|
2017-03-12 16:48:40 +01:00
|
|
|
|
|
2018-03-11 01:13:01 +01:00
|
|
|
|
;; This one is only for use in this module, so don't put it in %compressors.
|
|
|
|
|
(define bootstrap-xz
|
|
|
|
|
(compressor "bootstrap-xz" ".xz"
|
|
|
|
|
#~(#+(file-append %bootstrap-coreutils&co "/bin/xz") "-e -T0")))
|
|
|
|
|
|
2017-03-12 16:48:40 +01:00
|
|
|
|
(define (lookup-compressor name)
|
|
|
|
|
"Return the compressor object called NAME. Error out if it could not be
|
|
|
|
|
found."
|
|
|
|
|
(or (find (match-lambda
|
|
|
|
|
(($ <compressor> name*)
|
|
|
|
|
(string=? name* name)))
|
|
|
|
|
%compressors)
|
ui: Rename '_' to 'G_'.
This avoids collisions with '_' when the latter is used as a 'match'
pattern for instance. See
<https://lists.gnu.org/archive/html/guix-devel/2017-04/msg00464.html>.
* guix/ui.scm: Rename '_' to 'G_'.
* po/guix/Makevars (XGETTEXT_OPTIONS): Adjust accordingly.
* build-aux/compile-all.scm (warnings): Remove 'format'.
* gnu/packages.scm,
gnu/services.scm,
gnu/services/shepherd.scm,
gnu/system.scm,
gnu/system/shadow.scm,
guix/gnupg.scm,
guix/http-client.scm,
guix/import/cpan.scm,
guix/import/elpa.scm,
guix/import/pypi.scm,
guix/nar.scm,
guix/scripts.scm,
guix/scripts/archive.scm,
guix/scripts/authenticate.scm,
guix/scripts/build.scm,
guix/scripts/challenge.scm,
guix/scripts/container.scm,
guix/scripts/container/exec.scm,
guix/scripts/copy.scm,
guix/scripts/download.scm,
guix/scripts/edit.scm,
guix/scripts/environment.scm,
guix/scripts/gc.scm,
guix/scripts/graph.scm,
guix/scripts/hash.scm,
guix/scripts/import.scm,
guix/scripts/import/cpan.scm,
guix/scripts/import/cran.scm,
guix/scripts/import/crate.scm,
guix/scripts/import/elpa.scm,
guix/scripts/import/gem.scm,
guix/scripts/import/gnu.scm,
guix/scripts/import/hackage.scm,
guix/scripts/import/nix.scm,
guix/scripts/import/pypi.scm,
guix/scripts/import/stackage.scm,
guix/scripts/lint.scm,
guix/scripts/offload.scm,
guix/scripts/pack.scm,
guix/scripts/package.scm,
guix/scripts/perform-download.scm,
guix/scripts/publish.scm,
guix/scripts/pull.scm,
guix/scripts/refresh.scm,
guix/scripts/size.scm,
guix/scripts/substitute.scm,
guix/scripts/system.scm,
guix/ssh.scm,
guix/upstream.scm: Use 'G_' instead of '_'. Most of this change was
obtained by running: "sed -i -e's/(_ "/(G_ "/g' `find -name \*.scm`".
2017-05-03 15:57:02 +02:00
|
|
|
|
(leave (G_ "~a: compressor not found~%") name)))
|
2017-03-12 16:48:40 +01:00
|
|
|
|
|
|
|
|
|
(define* (self-contained-tarball name profile
|
2017-03-17 22:45:32 +01:00
|
|
|
|
#:key target
|
|
|
|
|
deduplicate?
|
2017-03-14 15:11:03 +01:00
|
|
|
|
(compressor (first %compressors))
|
2017-03-14 16:37:17 +01:00
|
|
|
|
localstatedir?
|
2017-03-14 22:43:10 +01:00
|
|
|
|
(symlinks '())
|
|
|
|
|
(tar tar))
|
2017-03-12 16:48:40 +01:00
|
|
|
|
"Return a self-contained tarball containing a store initialized with the
|
2017-03-14 15:11:03 +01:00
|
|
|
|
closure of PROFILE, a derivation. The tarball contains /gnu/store; if
|
|
|
|
|
LOCALSTATEDIR? is true, it also contains /var/guix, including /var/guix/db
|
2017-03-14 16:37:17 +01:00
|
|
|
|
with a properly initialized store database.
|
|
|
|
|
|
|
|
|
|
SYMLINKS must be a list of (SOURCE -> TARGET) tuples denoting symlinks to be
|
|
|
|
|
added to the pack."
|
2017-03-12 16:48:40 +01:00
|
|
|
|
(define build
|
2018-05-02 17:08:37 +02:00
|
|
|
|
(with-imported-modules (source-module-closure
|
|
|
|
|
'((guix build utils)
|
|
|
|
|
(guix build union)
|
|
|
|
|
(guix build store-copy)
|
|
|
|
|
(gnu build install)))
|
2017-03-12 16:48:40 +01:00
|
|
|
|
#~(begin
|
|
|
|
|
(use-modules (guix build utils)
|
2018-05-02 17:08:37 +02:00
|
|
|
|
((guix build union) #:select (relative-file-name))
|
2017-03-14 16:37:17 +01:00
|
|
|
|
(gnu build install)
|
|
|
|
|
(srfi srfi-1)
|
|
|
|
|
(srfi srfi-26)
|
|
|
|
|
(ice-9 match))
|
2017-03-12 16:48:40 +01:00
|
|
|
|
|
|
|
|
|
(define %root "root")
|
|
|
|
|
|
2017-03-14 16:37:17 +01:00
|
|
|
|
(define symlink->directives
|
|
|
|
|
;; Return "populate directives" to make the given symlink and its
|
|
|
|
|
;; parent directories.
|
|
|
|
|
(match-lambda
|
|
|
|
|
((source '-> target)
|
2018-05-11 16:56:19 +02:00
|
|
|
|
(let ((target (string-append #$profile "/" target))
|
|
|
|
|
(parent (dirname source)))
|
|
|
|
|
;; Never add a 'directory' directive for "/" so as to
|
|
|
|
|
;; preserve its ownnership when extracting the archive (see
|
|
|
|
|
;; below), and also because this would lead to adding the
|
|
|
|
|
;; same entries twice in the tarball.
|
|
|
|
|
`(,@(if (string=? parent "/")
|
|
|
|
|
'()
|
|
|
|
|
`((directory ,parent)))
|
2018-05-02 17:08:37 +02:00
|
|
|
|
(,source
|
2018-05-11 16:56:19 +02:00
|
|
|
|
-> ,(relative-file-name parent target)))))))
|
2017-03-14 16:37:17 +01:00
|
|
|
|
|
|
|
|
|
(define directives
|
|
|
|
|
;; Fully-qualified symlinks.
|
|
|
|
|
(append-map symlink->directives '#$symlinks))
|
|
|
|
|
|
2017-03-14 22:43:10 +01:00
|
|
|
|
;; The --sort option was added to GNU tar in version 1.28, released
|
|
|
|
|
;; 2014-07-28. For testing, we use the bootstrap tar, which is
|
|
|
|
|
;; older and doesn't support it.
|
|
|
|
|
(define tar-supports-sort?
|
|
|
|
|
(zero? (system* (string-append #+tar "/bin/tar")
|
|
|
|
|
"cf" "/dev/null" "--files-from=/dev/null"
|
|
|
|
|
"--sort=name")))
|
|
|
|
|
|
2017-03-12 16:48:40 +01:00
|
|
|
|
;; We need Guix here for 'guix-register'.
|
|
|
|
|
(setenv "PATH"
|
2017-03-14 15:11:03 +01:00
|
|
|
|
(string-append #$(if localstatedir?
|
|
|
|
|
(file-append guix "/sbin:")
|
|
|
|
|
"")
|
2017-03-17 17:37:00 +01:00
|
|
|
|
#$tar "/bin"))
|
2017-03-12 16:48:40 +01:00
|
|
|
|
|
2018-05-11 16:56:19 +02:00
|
|
|
|
;; Note: there is not much to gain here with deduplication and there
|
|
|
|
|
;; is the overhead of the '.links' directory, so turn it off.
|
|
|
|
|
;; Furthermore GNU tar < 1.30 sometimes fails to extract tarballs
|
|
|
|
|
;; with hard links:
|
|
|
|
|
;; <http://lists.gnu.org/archive/html/bug-tar/2017-11/msg00009.html>.
|
2017-03-12 16:48:40 +01:00
|
|
|
|
(populate-single-profile-directory %root
|
|
|
|
|
#:profile #$profile
|
|
|
|
|
#:closure "profile"
|
2017-03-14 15:11:03 +01:00
|
|
|
|
#:deduplicate? #f
|
|
|
|
|
#:register? #$localstatedir?)
|
2017-03-12 16:48:40 +01:00
|
|
|
|
|
2017-03-14 16:37:17 +01:00
|
|
|
|
;; Create SYMLINKS.
|
|
|
|
|
(for-each (cut evaluate-populate-directive <> %root)
|
|
|
|
|
directives)
|
|
|
|
|
|
2017-03-12 16:48:40 +01:00
|
|
|
|
;; Create the tarball. Use GNU format so there's no file name
|
|
|
|
|
;; length limitation.
|
|
|
|
|
(with-directory-excursion %root
|
2017-03-14 16:37:17 +01:00
|
|
|
|
(exit
|
2017-03-14 21:31:10 +01:00
|
|
|
|
(zero? (apply system* "tar"
|
2017-03-17 17:37:00 +01:00
|
|
|
|
"-I"
|
|
|
|
|
(string-join '#+(compressor-command compressor))
|
2017-03-14 16:37:17 +01:00
|
|
|
|
"--format=gnu"
|
|
|
|
|
|
|
|
|
|
;; Avoid non-determinism in the archive. Use
|
|
|
|
|
;; mtime = 1, not zero, because that is what the
|
|
|
|
|
;; daemon does for files in the store (see the
|
|
|
|
|
;; 'mtimeStore' constant in local-store.cc.)
|
2017-03-14 22:43:10 +01:00
|
|
|
|
(if tar-supports-sort? "--sort=name" "--mtime=@1")
|
2017-03-14 16:37:17 +01:00
|
|
|
|
"--mtime=@1" ;for files in /var/guix
|
|
|
|
|
"--owner=root:0"
|
|
|
|
|
"--group=root:0"
|
|
|
|
|
|
|
|
|
|
"--check-links"
|
|
|
|
|
"-cvf" #$output
|
|
|
|
|
;; Avoid adding / and /var to the tarball, so
|
|
|
|
|
;; that the ownership and permissions of those
|
|
|
|
|
;; directories will not be overwritten when
|
|
|
|
|
;; extracting the archive. Do not include /root
|
|
|
|
|
;; because the root account might have a
|
|
|
|
|
;; different home directory.
|
|
|
|
|
#$@(if localstatedir?
|
|
|
|
|
'("./var/guix")
|
|
|
|
|
'())
|
|
|
|
|
|
|
|
|
|
(string-append "." (%store-directory))
|
|
|
|
|
|
|
|
|
|
(delete-duplicates
|
|
|
|
|
(filter-map (match-lambda
|
|
|
|
|
(('directory directory)
|
|
|
|
|
(string-append "." directory))
|
2018-05-11 16:56:19 +02:00
|
|
|
|
((source '-> _)
|
|
|
|
|
(string-append "." source))
|
2017-03-14 16:37:17 +01:00
|
|
|
|
(_ #f))
|
|
|
|
|
directives)))))))))
|
2017-03-12 16:48:40 +01:00
|
|
|
|
|
2017-08-19 17:56:28 +02:00
|
|
|
|
(gexp->derivation (string-append name ".tar"
|
2017-03-12 16:48:40 +01:00
|
|
|
|
(compressor-extension compressor))
|
|
|
|
|
build
|
|
|
|
|
#:references-graphs `(("profile" ,profile))))
|
|
|
|
|
|
2017-03-16 18:02:59 +01:00
|
|
|
|
(define* (docker-image name profile
|
2017-03-17 22:45:32 +01:00
|
|
|
|
#:key target
|
|
|
|
|
deduplicate?
|
2017-03-16 18:02:59 +01:00
|
|
|
|
(compressor (first %compressors))
|
|
|
|
|
localstatedir?
|
|
|
|
|
(symlinks '())
|
|
|
|
|
(tar tar))
|
|
|
|
|
"Return a derivation to construct a Docker image of PROFILE. The
|
|
|
|
|
image is a tarball conforming to the Docker Image Specification, compressed
|
2017-03-17 22:45:32 +01:00
|
|
|
|
with COMPRESSOR. It can be passed to 'docker load'. If TARGET is true, it
|
|
|
|
|
must a be a GNU triplet and it is used to derive the architecture metadata in
|
|
|
|
|
the image."
|
2017-03-16 22:40:06 +01:00
|
|
|
|
;; FIXME: Honor LOCALSTATEDIR?.
|
2017-03-16 18:02:59 +01:00
|
|
|
|
(define not-config?
|
|
|
|
|
(match-lambda
|
|
|
|
|
(('guix 'config) #f)
|
|
|
|
|
(('guix rest ...) #t)
|
|
|
|
|
(('gnu rest ...) #t)
|
|
|
|
|
(rest #f)))
|
|
|
|
|
|
2018-05-02 17:08:37 +02:00
|
|
|
|
(define defmod 'define-module) ;trick Geiser
|
|
|
|
|
|
2017-03-16 18:02:59 +01:00
|
|
|
|
(define config
|
|
|
|
|
;; (guix config) module for consumption by (guix gcrypt).
|
|
|
|
|
(scheme-file "gcrypt-config.scm"
|
|
|
|
|
#~(begin
|
2018-05-02 17:08:37 +02:00
|
|
|
|
(#$defmod (guix config)
|
2017-03-16 18:02:59 +01:00
|
|
|
|
#:export (%libgcrypt))
|
|
|
|
|
|
|
|
|
|
;; XXX: Work around <http://bugs.gnu.org/15602>.
|
|
|
|
|
(eval-when (expand load eval)
|
|
|
|
|
(define %libgcrypt
|
|
|
|
|
#+(file-append libgcrypt "/lib/libgcrypt"))))))
|
|
|
|
|
|
2017-05-20 14:28:24 +02:00
|
|
|
|
(define json
|
|
|
|
|
;; Pick the guile-json package that corresponds to the Guile used to build
|
|
|
|
|
;; derivations.
|
|
|
|
|
(if (string-prefix? "2.0" (package-version (default-guile)))
|
|
|
|
|
guile2.0-json
|
|
|
|
|
guile-json))
|
|
|
|
|
|
2017-03-16 18:02:59 +01:00
|
|
|
|
(define build
|
|
|
|
|
(with-imported-modules `(,@(source-module-closure '((guix docker))
|
|
|
|
|
#:select? not-config?)
|
2018-03-15 05:09:13 +01:00
|
|
|
|
(guix build store-copy)
|
2017-03-16 18:02:59 +01:00
|
|
|
|
((guix config) => ,config))
|
|
|
|
|
#~(begin
|
|
|
|
|
;; Guile-JSON is required by (guix docker).
|
|
|
|
|
(add-to-load-path
|
2017-05-20 14:28:24 +02:00
|
|
|
|
(string-append #+json "/share/guile/site/"
|
2017-03-16 18:02:59 +01:00
|
|
|
|
(effective-version)))
|
|
|
|
|
|
2018-03-15 05:09:13 +01:00
|
|
|
|
(use-modules (guix docker) (srfi srfi-19) (guix build store-copy))
|
2017-03-16 18:02:59 +01:00
|
|
|
|
|
2017-03-17 17:37:00 +01:00
|
|
|
|
(setenv "PATH" (string-append #$tar "/bin"))
|
2017-03-16 18:02:59 +01:00
|
|
|
|
|
2018-03-15 05:09:13 +01:00
|
|
|
|
(build-docker-image #$output
|
|
|
|
|
(call-with-input-file "profile"
|
|
|
|
|
read-reference-graph)
|
|
|
|
|
#$profile
|
2017-03-17 22:45:32 +01:00
|
|
|
|
#:system (or #$target (utsname:machine (uname)))
|
2017-03-16 22:40:06 +01:00
|
|
|
|
#:symlinks '#$symlinks
|
2017-03-16 21:41:38 +01:00
|
|
|
|
#:compressor '#$(compressor-command compressor)
|
|
|
|
|
#:creation-time (make-time time-utc 0 1)))))
|
2017-03-16 18:02:59 +01:00
|
|
|
|
|
2017-08-19 17:56:28 +02:00
|
|
|
|
(gexp->derivation (string-append name ".tar"
|
2017-03-16 18:02:59 +01:00
|
|
|
|
(compressor-extension compressor))
|
|
|
|
|
build
|
|
|
|
|
#:references-graphs `(("profile" ,profile))))
|
2017-03-12 16:48:40 +01:00
|
|
|
|
|
2018-05-02 17:08:37 +02:00
|
|
|
|
|
|
|
|
|
;;;
|
|
|
|
|
;;; Compiling C programs.
|
|
|
|
|
;;;
|
|
|
|
|
|
|
|
|
|
;; A C compiler. That lowers to a single program that can be passed typical C
|
|
|
|
|
;; compiler flags, and it makes sure the whole toolchain is available.
|
|
|
|
|
(define-record-type <c-compiler>
|
|
|
|
|
(%c-compiler toolchain guile)
|
|
|
|
|
c-compiler?
|
|
|
|
|
(toolchain c-compiler-toolchain)
|
|
|
|
|
(guile c-compiler-guile))
|
|
|
|
|
|
|
|
|
|
(define* (c-compiler #:optional inputs
|
|
|
|
|
#:key (guile (default-guile)))
|
|
|
|
|
(%c-compiler inputs guile))
|
|
|
|
|
|
|
|
|
|
(define (bootstrap-c-compiler)
|
|
|
|
|
"Return the C compiler that uses the bootstrap toolchain. This is used only
|
|
|
|
|
by '--bootstrap', for testing purposes."
|
|
|
|
|
(define bootstrap-toolchain
|
|
|
|
|
(list (first (assoc-ref %bootstrap-inputs "gcc"))
|
|
|
|
|
(first (assoc-ref %bootstrap-inputs "binutils"))
|
|
|
|
|
(first (assoc-ref %bootstrap-inputs "libc"))))
|
|
|
|
|
|
|
|
|
|
(c-compiler bootstrap-toolchain
|
|
|
|
|
#:guile %bootstrap-guile))
|
|
|
|
|
|
|
|
|
|
(define-gexp-compiler (c-compiler-compiler (compiler <c-compiler>) system target)
|
|
|
|
|
"Lower COMPILER to a single script that does the right thing."
|
|
|
|
|
(define toolchain
|
|
|
|
|
(or (c-compiler-toolchain compiler)
|
|
|
|
|
(list (first (assoc-ref (standard-packages) "gcc"))
|
|
|
|
|
(first (assoc-ref (standard-packages) "ld-wrapper"))
|
|
|
|
|
(first (assoc-ref (standard-packages) "binutils"))
|
|
|
|
|
(first (assoc-ref (standard-packages) "libc"))
|
|
|
|
|
(gexp-input (first (assoc-ref (standard-packages) "libc"))
|
|
|
|
|
"static"))))
|
|
|
|
|
|
|
|
|
|
(define inputs
|
|
|
|
|
(match (append-map package-propagated-inputs
|
|
|
|
|
(filter package? toolchain))
|
|
|
|
|
(((labels things . _) ...)
|
|
|
|
|
(append toolchain things))))
|
|
|
|
|
|
|
|
|
|
(define search-paths
|
|
|
|
|
(cons $PATH
|
|
|
|
|
(append-map package-native-search-paths
|
|
|
|
|
(filter package? inputs))))
|
|
|
|
|
|
|
|
|
|
(define run
|
|
|
|
|
(with-imported-modules (source-module-closure
|
|
|
|
|
'((guix build utils)
|
|
|
|
|
(guix search-paths)))
|
|
|
|
|
#~(begin
|
|
|
|
|
(use-modules (guix build utils) (guix search-paths)
|
|
|
|
|
(ice-9 match))
|
|
|
|
|
|
|
|
|
|
(define (output-file args)
|
|
|
|
|
(let loop ((args args))
|
|
|
|
|
(match args
|
|
|
|
|
(() "a.out")
|
|
|
|
|
(("-o" file _ ...) file)
|
|
|
|
|
((head rest ...) (loop rest)))))
|
|
|
|
|
|
|
|
|
|
(set-search-paths (map sexp->search-path-specification
|
|
|
|
|
'#$(map search-path-specification->sexp
|
|
|
|
|
search-paths))
|
|
|
|
|
'#$inputs)
|
|
|
|
|
|
|
|
|
|
(let ((output (output-file (command-line))))
|
|
|
|
|
(apply invoke "gcc" (cdr (command-line)))
|
|
|
|
|
(invoke "strip" output)))))
|
|
|
|
|
|
|
|
|
|
(when target
|
|
|
|
|
;; TODO: Yep, we'll have to do it someday!
|
|
|
|
|
(leave (G_ "cross-compilation not implemented here;
|
|
|
|
|
please email '~a'~%")
|
|
|
|
|
(@ (guix config) %guix-bug-report-address)))
|
|
|
|
|
|
|
|
|
|
(gexp->script "c-compiler" run
|
|
|
|
|
#:guile (c-compiler-guile compiler)))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
;;;
|
|
|
|
|
;;; Wrapped package.
|
|
|
|
|
;;;
|
|
|
|
|
|
|
|
|
|
(define* (wrapped-package package
|
|
|
|
|
#:optional (compiler (c-compiler)))
|
|
|
|
|
(define runner
|
|
|
|
|
(local-file (search-auxiliary-file "run-in-namespace.c")))
|
|
|
|
|
|
|
|
|
|
(define build
|
|
|
|
|
(with-imported-modules '((guix build utils))
|
|
|
|
|
#~(begin
|
|
|
|
|
(use-modules (guix build utils)
|
|
|
|
|
(ice-9 match))
|
|
|
|
|
|
|
|
|
|
(define (strip-store-prefix file)
|
|
|
|
|
;; Given a file name like "/gnu/store/…-foo-1.2/bin/foo", return
|
|
|
|
|
;; "/bin/foo".
|
|
|
|
|
(let* ((len (string-length (%store-directory)))
|
|
|
|
|
(base (string-drop file (+ 1 len))))
|
|
|
|
|
(match (string-index base #\/)
|
|
|
|
|
(#f base)
|
|
|
|
|
(index (string-drop base index)))))
|
|
|
|
|
|
|
|
|
|
(define (build-wrapper program)
|
|
|
|
|
;; Build a user-namespace wrapper for PROGRAM.
|
|
|
|
|
(format #t "building wrapper for '~a'...~%" program)
|
|
|
|
|
(copy-file #$runner "run.c")
|
|
|
|
|
|
|
|
|
|
(substitute* "run.c"
|
|
|
|
|
(("@WRAPPED_PROGRAM@") program)
|
|
|
|
|
(("@STORE_DIRECTORY@") (%store-directory)))
|
|
|
|
|
|
|
|
|
|
(let* ((base (strip-store-prefix program))
|
|
|
|
|
(result (string-append #$output "/" base)))
|
|
|
|
|
(mkdir-p (dirname result))
|
|
|
|
|
(invoke #$compiler "-std=gnu99" "-static" "-Os" "-g0" "-Wall"
|
|
|
|
|
"run.c" "-o" result)
|
|
|
|
|
(delete-file "run.c")))
|
|
|
|
|
|
|
|
|
|
(setvbuf (current-output-port)
|
|
|
|
|
(cond-expand (guile-2.2 'line)
|
|
|
|
|
(else _IOLBF)))
|
|
|
|
|
(for-each build-wrapper
|
|
|
|
|
(append (find-files #$(file-append package "/bin"))
|
|
|
|
|
(find-files #$(file-append package "/sbin"))
|
|
|
|
|
(find-files #$(file-append package "/libexec")))))))
|
|
|
|
|
|
|
|
|
|
(computed-file (string-append (package-full-name package "-") "R")
|
|
|
|
|
build))
|
|
|
|
|
|
|
|
|
|
(define (map-manifest-entries proc manifest)
|
|
|
|
|
"Apply PROC to all the entries of MANIFEST and return a new manifest."
|
|
|
|
|
(make-manifest
|
|
|
|
|
(map (lambda (entry)
|
|
|
|
|
(manifest-entry
|
|
|
|
|
(inherit entry)
|
|
|
|
|
(item (proc (manifest-entry-item entry)))))
|
|
|
|
|
(manifest-entries manifest))))
|
|
|
|
|
|
2017-03-12 16:48:40 +01:00
|
|
|
|
|
|
|
|
|
;;;
|
|
|
|
|
;;; Command-line options.
|
|
|
|
|
;;;
|
|
|
|
|
|
|
|
|
|
(define %default-options
|
|
|
|
|
;; Alist of default option values.
|
2017-03-16 18:02:59 +01:00
|
|
|
|
`((format . tarball)
|
|
|
|
|
(system . ,(%current-system))
|
2017-03-12 16:48:40 +01:00
|
|
|
|
(substitutes? . #t)
|
2017-12-07 22:49:08 +01:00
|
|
|
|
(build-hook? . #t)
|
2017-03-12 16:48:40 +01:00
|
|
|
|
(graft? . #t)
|
|
|
|
|
(verbosity . 0)
|
2017-03-14 16:37:17 +01:00
|
|
|
|
(symlinks . ())
|
2017-03-12 16:48:40 +01:00
|
|
|
|
(compressor . ,(first %compressors))))
|
|
|
|
|
|
2017-03-16 18:02:59 +01:00
|
|
|
|
(define %formats
|
|
|
|
|
;; Supported pack formats.
|
|
|
|
|
`((tarball . ,self-contained-tarball)
|
|
|
|
|
(docker . ,docker-image)))
|
|
|
|
|
|
2017-03-12 16:48:40 +01:00
|
|
|
|
(define %options
|
|
|
|
|
;; Specifications of the command-line options.
|
|
|
|
|
(cons* (option '(#\h "help") #f #f
|
|
|
|
|
(lambda args
|
|
|
|
|
(show-help)
|
|
|
|
|
(exit 0)))
|
|
|
|
|
(option '(#\V "version") #f #f
|
|
|
|
|
(lambda args
|
|
|
|
|
(show-version-and-exit "guix pack")))
|
|
|
|
|
|
|
|
|
|
(option '(#\n "dry-run") #f #f
|
|
|
|
|
(lambda (opt name arg result)
|
|
|
|
|
(alist-cons 'dry-run? #t (alist-cons 'graft? #f result))))
|
2017-03-16 18:02:59 +01:00
|
|
|
|
(option '(#\f "format") #t #f
|
|
|
|
|
(lambda (opt name arg result)
|
|
|
|
|
(alist-cons 'format (string->symbol arg) result)))
|
2018-05-02 17:08:37 +02:00
|
|
|
|
(option '(#\R "relocatable") #f #f
|
|
|
|
|
(lambda (opt name arg result)
|
|
|
|
|
(alist-cons 'relocatable? #t result)))
|
2017-04-07 22:20:28 +02:00
|
|
|
|
(option '(#\e "expression") #t #f
|
|
|
|
|
(lambda (opt name arg result)
|
|
|
|
|
(alist-cons 'expression arg result)))
|
2018-02-09 20:33:12 +01:00
|
|
|
|
(option '(#\m "manifest") #t #f
|
|
|
|
|
(lambda (opt name arg result)
|
|
|
|
|
(alist-cons 'manifest arg result)))
|
2017-03-12 16:48:40 +01:00
|
|
|
|
(option '(#\s "system") #t #f
|
|
|
|
|
(lambda (opt name arg result)
|
|
|
|
|
(alist-cons 'system arg
|
|
|
|
|
(alist-delete 'system result eq?))))
|
2017-03-17 22:45:32 +01:00
|
|
|
|
(option '("target") #t #f
|
|
|
|
|
(lambda (opt name arg result)
|
|
|
|
|
(alist-cons 'target arg
|
|
|
|
|
(alist-delete 'target result eq?))))
|
2017-03-12 16:48:40 +01:00
|
|
|
|
(option '(#\C "compression") #t #f
|
|
|
|
|
(lambda (opt name arg result)
|
|
|
|
|
(alist-cons 'compressor (lookup-compressor arg)
|
|
|
|
|
result)))
|
2017-03-14 16:37:17 +01:00
|
|
|
|
(option '(#\S "symlink") #t #f
|
|
|
|
|
(lambda (opt name arg result)
|
2017-03-16 22:46:43 +01:00
|
|
|
|
;; Note: Using 'string-split' allows us to handle empty
|
|
|
|
|
;; TARGET (as in "/opt/guile=", meaning that /opt/guile is
|
|
|
|
|
;; a symlink to the profile) correctly.
|
|
|
|
|
(match (string-split arg (char-set #\=))
|
2017-03-14 16:37:17 +01:00
|
|
|
|
((source target)
|
|
|
|
|
(let ((symlinks (assoc-ref result 'symlinks)))
|
|
|
|
|
(alist-cons 'symlinks
|
|
|
|
|
`((,source -> ,target) ,@symlinks)
|
|
|
|
|
(alist-delete 'symlinks result eq?))))
|
|
|
|
|
(x
|
ui: Rename '_' to 'G_'.
This avoids collisions with '_' when the latter is used as a 'match'
pattern for instance. See
<https://lists.gnu.org/archive/html/guix-devel/2017-04/msg00464.html>.
* guix/ui.scm: Rename '_' to 'G_'.
* po/guix/Makevars (XGETTEXT_OPTIONS): Adjust accordingly.
* build-aux/compile-all.scm (warnings): Remove 'format'.
* gnu/packages.scm,
gnu/services.scm,
gnu/services/shepherd.scm,
gnu/system.scm,
gnu/system/shadow.scm,
guix/gnupg.scm,
guix/http-client.scm,
guix/import/cpan.scm,
guix/import/elpa.scm,
guix/import/pypi.scm,
guix/nar.scm,
guix/scripts.scm,
guix/scripts/archive.scm,
guix/scripts/authenticate.scm,
guix/scripts/build.scm,
guix/scripts/challenge.scm,
guix/scripts/container.scm,
guix/scripts/container/exec.scm,
guix/scripts/copy.scm,
guix/scripts/download.scm,
guix/scripts/edit.scm,
guix/scripts/environment.scm,
guix/scripts/gc.scm,
guix/scripts/graph.scm,
guix/scripts/hash.scm,
guix/scripts/import.scm,
guix/scripts/import/cpan.scm,
guix/scripts/import/cran.scm,
guix/scripts/import/crate.scm,
guix/scripts/import/elpa.scm,
guix/scripts/import/gem.scm,
guix/scripts/import/gnu.scm,
guix/scripts/import/hackage.scm,
guix/scripts/import/nix.scm,
guix/scripts/import/pypi.scm,
guix/scripts/import/stackage.scm,
guix/scripts/lint.scm,
guix/scripts/offload.scm,
guix/scripts/pack.scm,
guix/scripts/package.scm,
guix/scripts/perform-download.scm,
guix/scripts/publish.scm,
guix/scripts/pull.scm,
guix/scripts/refresh.scm,
guix/scripts/size.scm,
guix/scripts/substitute.scm,
guix/scripts/system.scm,
guix/ssh.scm,
guix/upstream.scm: Use 'G_' instead of '_'. Most of this change was
obtained by running: "sed -i -e's/(_ "/(G_ "/g' `find -name \*.scm`".
2017-05-03 15:57:02 +02:00
|
|
|
|
(leave (G_ "~a: invalid symlink specification~%")
|
2017-03-14 16:37:17 +01:00
|
|
|
|
arg)))))
|
2017-03-14 15:11:03 +01:00
|
|
|
|
(option '("localstatedir") #f #f
|
|
|
|
|
(lambda (opt name arg result)
|
|
|
|
|
(alist-cons 'localstatedir? #t result)))
|
2018-03-11 01:13:01 +01:00
|
|
|
|
(option '("bootstrap") #f #f
|
|
|
|
|
(lambda (opt name arg result)
|
|
|
|
|
(alist-cons 'bootstrap? #t result)))
|
2017-03-12 16:48:40 +01:00
|
|
|
|
|
|
|
|
|
(append %transformation-options
|
|
|
|
|
%standard-build-options)))
|
|
|
|
|
|
|
|
|
|
(define (show-help)
|
ui: Rename '_' to 'G_'.
This avoids collisions with '_' when the latter is used as a 'match'
pattern for instance. See
<https://lists.gnu.org/archive/html/guix-devel/2017-04/msg00464.html>.
* guix/ui.scm: Rename '_' to 'G_'.
* po/guix/Makevars (XGETTEXT_OPTIONS): Adjust accordingly.
* build-aux/compile-all.scm (warnings): Remove 'format'.
* gnu/packages.scm,
gnu/services.scm,
gnu/services/shepherd.scm,
gnu/system.scm,
gnu/system/shadow.scm,
guix/gnupg.scm,
guix/http-client.scm,
guix/import/cpan.scm,
guix/import/elpa.scm,
guix/import/pypi.scm,
guix/nar.scm,
guix/scripts.scm,
guix/scripts/archive.scm,
guix/scripts/authenticate.scm,
guix/scripts/build.scm,
guix/scripts/challenge.scm,
guix/scripts/container.scm,
guix/scripts/container/exec.scm,
guix/scripts/copy.scm,
guix/scripts/download.scm,
guix/scripts/edit.scm,
guix/scripts/environment.scm,
guix/scripts/gc.scm,
guix/scripts/graph.scm,
guix/scripts/hash.scm,
guix/scripts/import.scm,
guix/scripts/import/cpan.scm,
guix/scripts/import/cran.scm,
guix/scripts/import/crate.scm,
guix/scripts/import/elpa.scm,
guix/scripts/import/gem.scm,
guix/scripts/import/gnu.scm,
guix/scripts/import/hackage.scm,
guix/scripts/import/nix.scm,
guix/scripts/import/pypi.scm,
guix/scripts/import/stackage.scm,
guix/scripts/lint.scm,
guix/scripts/offload.scm,
guix/scripts/pack.scm,
guix/scripts/package.scm,
guix/scripts/perform-download.scm,
guix/scripts/publish.scm,
guix/scripts/pull.scm,
guix/scripts/refresh.scm,
guix/scripts/size.scm,
guix/scripts/substitute.scm,
guix/scripts/system.scm,
guix/ssh.scm,
guix/upstream.scm: Use 'G_' instead of '_'. Most of this change was
obtained by running: "sed -i -e's/(_ "/(G_ "/g' `find -name \*.scm`".
2017-05-03 15:57:02 +02:00
|
|
|
|
(display (G_ "Usage: guix pack [OPTION]... PACKAGE...
|
2017-03-12 16:48:40 +01:00
|
|
|
|
Create a bundle of PACKAGE.\n"))
|
|
|
|
|
(show-build-options-help)
|
|
|
|
|
(newline)
|
|
|
|
|
(show-transformation-options-help)
|
|
|
|
|
(newline)
|
ui: Rename '_' to 'G_'.
This avoids collisions with '_' when the latter is used as a 'match'
pattern for instance. See
<https://lists.gnu.org/archive/html/guix-devel/2017-04/msg00464.html>.
* guix/ui.scm: Rename '_' to 'G_'.
* po/guix/Makevars (XGETTEXT_OPTIONS): Adjust accordingly.
* build-aux/compile-all.scm (warnings): Remove 'format'.
* gnu/packages.scm,
gnu/services.scm,
gnu/services/shepherd.scm,
gnu/system.scm,
gnu/system/shadow.scm,
guix/gnupg.scm,
guix/http-client.scm,
guix/import/cpan.scm,
guix/import/elpa.scm,
guix/import/pypi.scm,
guix/nar.scm,
guix/scripts.scm,
guix/scripts/archive.scm,
guix/scripts/authenticate.scm,
guix/scripts/build.scm,
guix/scripts/challenge.scm,
guix/scripts/container.scm,
guix/scripts/container/exec.scm,
guix/scripts/copy.scm,
guix/scripts/download.scm,
guix/scripts/edit.scm,
guix/scripts/environment.scm,
guix/scripts/gc.scm,
guix/scripts/graph.scm,
guix/scripts/hash.scm,
guix/scripts/import.scm,
guix/scripts/import/cpan.scm,
guix/scripts/import/cran.scm,
guix/scripts/import/crate.scm,
guix/scripts/import/elpa.scm,
guix/scripts/import/gem.scm,
guix/scripts/import/gnu.scm,
guix/scripts/import/hackage.scm,
guix/scripts/import/nix.scm,
guix/scripts/import/pypi.scm,
guix/scripts/import/stackage.scm,
guix/scripts/lint.scm,
guix/scripts/offload.scm,
guix/scripts/pack.scm,
guix/scripts/package.scm,
guix/scripts/perform-download.scm,
guix/scripts/publish.scm,
guix/scripts/pull.scm,
guix/scripts/refresh.scm,
guix/scripts/size.scm,
guix/scripts/substitute.scm,
guix/scripts/system.scm,
guix/ssh.scm,
guix/upstream.scm: Use 'G_' instead of '_'. Most of this change was
obtained by running: "sed -i -e's/(_ "/(G_ "/g' `find -name \*.scm`".
2017-05-03 15:57:02 +02:00
|
|
|
|
(display (G_ "
|
2017-03-16 18:02:59 +01:00
|
|
|
|
-f, --format=FORMAT build a pack in the given FORMAT"))
|
ui: Rename '_' to 'G_'.
This avoids collisions with '_' when the latter is used as a 'match'
pattern for instance. See
<https://lists.gnu.org/archive/html/guix-devel/2017-04/msg00464.html>.
* guix/ui.scm: Rename '_' to 'G_'.
* po/guix/Makevars (XGETTEXT_OPTIONS): Adjust accordingly.
* build-aux/compile-all.scm (warnings): Remove 'format'.
* gnu/packages.scm,
gnu/services.scm,
gnu/services/shepherd.scm,
gnu/system.scm,
gnu/system/shadow.scm,
guix/gnupg.scm,
guix/http-client.scm,
guix/import/cpan.scm,
guix/import/elpa.scm,
guix/import/pypi.scm,
guix/nar.scm,
guix/scripts.scm,
guix/scripts/archive.scm,
guix/scripts/authenticate.scm,
guix/scripts/build.scm,
guix/scripts/challenge.scm,
guix/scripts/container.scm,
guix/scripts/container/exec.scm,
guix/scripts/copy.scm,
guix/scripts/download.scm,
guix/scripts/edit.scm,
guix/scripts/environment.scm,
guix/scripts/gc.scm,
guix/scripts/graph.scm,
guix/scripts/hash.scm,
guix/scripts/import.scm,
guix/scripts/import/cpan.scm,
guix/scripts/import/cran.scm,
guix/scripts/import/crate.scm,
guix/scripts/import/elpa.scm,
guix/scripts/import/gem.scm,
guix/scripts/import/gnu.scm,
guix/scripts/import/hackage.scm,
guix/scripts/import/nix.scm,
guix/scripts/import/pypi.scm,
guix/scripts/import/stackage.scm,
guix/scripts/lint.scm,
guix/scripts/offload.scm,
guix/scripts/pack.scm,
guix/scripts/package.scm,
guix/scripts/perform-download.scm,
guix/scripts/publish.scm,
guix/scripts/pull.scm,
guix/scripts/refresh.scm,
guix/scripts/size.scm,
guix/scripts/substitute.scm,
guix/scripts/system.scm,
guix/ssh.scm,
guix/upstream.scm: Use 'G_' instead of '_'. Most of this change was
obtained by running: "sed -i -e's/(_ "/(G_ "/g' `find -name \*.scm`".
2017-05-03 15:57:02 +02:00
|
|
|
|
(display (G_ "
|
2018-05-02 17:08:37 +02:00
|
|
|
|
-R, --relocatable produce relocatable executables"))
|
|
|
|
|
(display (G_ "
|
2017-04-07 22:20:28 +02:00
|
|
|
|
-e, --expression=EXPR consider the package EXPR evaluates to"))
|
ui: Rename '_' to 'G_'.
This avoids collisions with '_' when the latter is used as a 'match'
pattern for instance. See
<https://lists.gnu.org/archive/html/guix-devel/2017-04/msg00464.html>.
* guix/ui.scm: Rename '_' to 'G_'.
* po/guix/Makevars (XGETTEXT_OPTIONS): Adjust accordingly.
* build-aux/compile-all.scm (warnings): Remove 'format'.
* gnu/packages.scm,
gnu/services.scm,
gnu/services/shepherd.scm,
gnu/system.scm,
gnu/system/shadow.scm,
guix/gnupg.scm,
guix/http-client.scm,
guix/import/cpan.scm,
guix/import/elpa.scm,
guix/import/pypi.scm,
guix/nar.scm,
guix/scripts.scm,
guix/scripts/archive.scm,
guix/scripts/authenticate.scm,
guix/scripts/build.scm,
guix/scripts/challenge.scm,
guix/scripts/container.scm,
guix/scripts/container/exec.scm,
guix/scripts/copy.scm,
guix/scripts/download.scm,
guix/scripts/edit.scm,
guix/scripts/environment.scm,
guix/scripts/gc.scm,
guix/scripts/graph.scm,
guix/scripts/hash.scm,
guix/scripts/import.scm,
guix/scripts/import/cpan.scm,
guix/scripts/import/cran.scm,
guix/scripts/import/crate.scm,
guix/scripts/import/elpa.scm,
guix/scripts/import/gem.scm,
guix/scripts/import/gnu.scm,
guix/scripts/import/hackage.scm,
guix/scripts/import/nix.scm,
guix/scripts/import/pypi.scm,
guix/scripts/import/stackage.scm,
guix/scripts/lint.scm,
guix/scripts/offload.scm,
guix/scripts/pack.scm,
guix/scripts/package.scm,
guix/scripts/perform-download.scm,
guix/scripts/publish.scm,
guix/scripts/pull.scm,
guix/scripts/refresh.scm,
guix/scripts/size.scm,
guix/scripts/substitute.scm,
guix/scripts/system.scm,
guix/ssh.scm,
guix/upstream.scm: Use 'G_' instead of '_'. Most of this change was
obtained by running: "sed -i -e's/(_ "/(G_ "/g' `find -name \*.scm`".
2017-05-03 15:57:02 +02:00
|
|
|
|
(display (G_ "
|
2017-03-12 16:48:40 +01:00
|
|
|
|
-s, --system=SYSTEM attempt to build for SYSTEM--e.g., \"i686-linux\""))
|
ui: Rename '_' to 'G_'.
This avoids collisions with '_' when the latter is used as a 'match'
pattern for instance. See
<https://lists.gnu.org/archive/html/guix-devel/2017-04/msg00464.html>.
* guix/ui.scm: Rename '_' to 'G_'.
* po/guix/Makevars (XGETTEXT_OPTIONS): Adjust accordingly.
* build-aux/compile-all.scm (warnings): Remove 'format'.
* gnu/packages.scm,
gnu/services.scm,
gnu/services/shepherd.scm,
gnu/system.scm,
gnu/system/shadow.scm,
guix/gnupg.scm,
guix/http-client.scm,
guix/import/cpan.scm,
guix/import/elpa.scm,
guix/import/pypi.scm,
guix/nar.scm,
guix/scripts.scm,
guix/scripts/archive.scm,
guix/scripts/authenticate.scm,
guix/scripts/build.scm,
guix/scripts/challenge.scm,
guix/scripts/container.scm,
guix/scripts/container/exec.scm,
guix/scripts/copy.scm,
guix/scripts/download.scm,
guix/scripts/edit.scm,
guix/scripts/environment.scm,
guix/scripts/gc.scm,
guix/scripts/graph.scm,
guix/scripts/hash.scm,
guix/scripts/import.scm,
guix/scripts/import/cpan.scm,
guix/scripts/import/cran.scm,
guix/scripts/import/crate.scm,
guix/scripts/import/elpa.scm,
guix/scripts/import/gem.scm,
guix/scripts/import/gnu.scm,
guix/scripts/import/hackage.scm,
guix/scripts/import/nix.scm,
guix/scripts/import/pypi.scm,
guix/scripts/import/stackage.scm,
guix/scripts/lint.scm,
guix/scripts/offload.scm,
guix/scripts/pack.scm,
guix/scripts/package.scm,
guix/scripts/perform-download.scm,
guix/scripts/publish.scm,
guix/scripts/pull.scm,
guix/scripts/refresh.scm,
guix/scripts/size.scm,
guix/scripts/substitute.scm,
guix/scripts/system.scm,
guix/ssh.scm,
guix/upstream.scm: Use 'G_' instead of '_'. Most of this change was
obtained by running: "sed -i -e's/(_ "/(G_ "/g' `find -name \*.scm`".
2017-05-03 15:57:02 +02:00
|
|
|
|
(display (G_ "
|
2017-03-17 22:45:32 +01:00
|
|
|
|
--target=TRIPLET cross-build for TRIPLET--e.g., \"armel-linux-gnu\""))
|
ui: Rename '_' to 'G_'.
This avoids collisions with '_' when the latter is used as a 'match'
pattern for instance. See
<https://lists.gnu.org/archive/html/guix-devel/2017-04/msg00464.html>.
* guix/ui.scm: Rename '_' to 'G_'.
* po/guix/Makevars (XGETTEXT_OPTIONS): Adjust accordingly.
* build-aux/compile-all.scm (warnings): Remove 'format'.
* gnu/packages.scm,
gnu/services.scm,
gnu/services/shepherd.scm,
gnu/system.scm,
gnu/system/shadow.scm,
guix/gnupg.scm,
guix/http-client.scm,
guix/import/cpan.scm,
guix/import/elpa.scm,
guix/import/pypi.scm,
guix/nar.scm,
guix/scripts.scm,
guix/scripts/archive.scm,
guix/scripts/authenticate.scm,
guix/scripts/build.scm,
guix/scripts/challenge.scm,
guix/scripts/container.scm,
guix/scripts/container/exec.scm,
guix/scripts/copy.scm,
guix/scripts/download.scm,
guix/scripts/edit.scm,
guix/scripts/environment.scm,
guix/scripts/gc.scm,
guix/scripts/graph.scm,
guix/scripts/hash.scm,
guix/scripts/import.scm,
guix/scripts/import/cpan.scm,
guix/scripts/import/cran.scm,
guix/scripts/import/crate.scm,
guix/scripts/import/elpa.scm,
guix/scripts/import/gem.scm,
guix/scripts/import/gnu.scm,
guix/scripts/import/hackage.scm,
guix/scripts/import/nix.scm,
guix/scripts/import/pypi.scm,
guix/scripts/import/stackage.scm,
guix/scripts/lint.scm,
guix/scripts/offload.scm,
guix/scripts/pack.scm,
guix/scripts/package.scm,
guix/scripts/perform-download.scm,
guix/scripts/publish.scm,
guix/scripts/pull.scm,
guix/scripts/refresh.scm,
guix/scripts/size.scm,
guix/scripts/substitute.scm,
guix/scripts/system.scm,
guix/ssh.scm,
guix/upstream.scm: Use 'G_' instead of '_'. Most of this change was
obtained by running: "sed -i -e's/(_ "/(G_ "/g' `find -name \*.scm`".
2017-05-03 15:57:02 +02:00
|
|
|
|
(display (G_ "
|
2017-03-12 16:48:40 +01:00
|
|
|
|
-C, --compression=TOOL compress using TOOL--e.g., \"lzip\""))
|
ui: Rename '_' to 'G_'.
This avoids collisions with '_' when the latter is used as a 'match'
pattern for instance. See
<https://lists.gnu.org/archive/html/guix-devel/2017-04/msg00464.html>.
* guix/ui.scm: Rename '_' to 'G_'.
* po/guix/Makevars (XGETTEXT_OPTIONS): Adjust accordingly.
* build-aux/compile-all.scm (warnings): Remove 'format'.
* gnu/packages.scm,
gnu/services.scm,
gnu/services/shepherd.scm,
gnu/system.scm,
gnu/system/shadow.scm,
guix/gnupg.scm,
guix/http-client.scm,
guix/import/cpan.scm,
guix/import/elpa.scm,
guix/import/pypi.scm,
guix/nar.scm,
guix/scripts.scm,
guix/scripts/archive.scm,
guix/scripts/authenticate.scm,
guix/scripts/build.scm,
guix/scripts/challenge.scm,
guix/scripts/container.scm,
guix/scripts/container/exec.scm,
guix/scripts/copy.scm,
guix/scripts/download.scm,
guix/scripts/edit.scm,
guix/scripts/environment.scm,
guix/scripts/gc.scm,
guix/scripts/graph.scm,
guix/scripts/hash.scm,
guix/scripts/import.scm,
guix/scripts/import/cpan.scm,
guix/scripts/import/cran.scm,
guix/scripts/import/crate.scm,
guix/scripts/import/elpa.scm,
guix/scripts/import/gem.scm,
guix/scripts/import/gnu.scm,
guix/scripts/import/hackage.scm,
guix/scripts/import/nix.scm,
guix/scripts/import/pypi.scm,
guix/scripts/import/stackage.scm,
guix/scripts/lint.scm,
guix/scripts/offload.scm,
guix/scripts/pack.scm,
guix/scripts/package.scm,
guix/scripts/perform-download.scm,
guix/scripts/publish.scm,
guix/scripts/pull.scm,
guix/scripts/refresh.scm,
guix/scripts/size.scm,
guix/scripts/substitute.scm,
guix/scripts/system.scm,
guix/ssh.scm,
guix/upstream.scm: Use 'G_' instead of '_'. Most of this change was
obtained by running: "sed -i -e's/(_ "/(G_ "/g' `find -name \*.scm`".
2017-05-03 15:57:02 +02:00
|
|
|
|
(display (G_ "
|
2017-03-14 16:37:17 +01:00
|
|
|
|
-S, --symlink=SPEC create symlinks to the profile according to SPEC"))
|
2018-02-09 20:33:12 +01:00
|
|
|
|
(display (G_ "
|
2018-02-15 22:23:20 +01:00
|
|
|
|
-m, --manifest=FILE create a pack with the manifest from FILE"))
|
ui: Rename '_' to 'G_'.
This avoids collisions with '_' when the latter is used as a 'match'
pattern for instance. See
<https://lists.gnu.org/archive/html/guix-devel/2017-04/msg00464.html>.
* guix/ui.scm: Rename '_' to 'G_'.
* po/guix/Makevars (XGETTEXT_OPTIONS): Adjust accordingly.
* build-aux/compile-all.scm (warnings): Remove 'format'.
* gnu/packages.scm,
gnu/services.scm,
gnu/services/shepherd.scm,
gnu/system.scm,
gnu/system/shadow.scm,
guix/gnupg.scm,
guix/http-client.scm,
guix/import/cpan.scm,
guix/import/elpa.scm,
guix/import/pypi.scm,
guix/nar.scm,
guix/scripts.scm,
guix/scripts/archive.scm,
guix/scripts/authenticate.scm,
guix/scripts/build.scm,
guix/scripts/challenge.scm,
guix/scripts/container.scm,
guix/scripts/container/exec.scm,
guix/scripts/copy.scm,
guix/scripts/download.scm,
guix/scripts/edit.scm,
guix/scripts/environment.scm,
guix/scripts/gc.scm,
guix/scripts/graph.scm,
guix/scripts/hash.scm,
guix/scripts/import.scm,
guix/scripts/import/cpan.scm,
guix/scripts/import/cran.scm,
guix/scripts/import/crate.scm,
guix/scripts/import/elpa.scm,
guix/scripts/import/gem.scm,
guix/scripts/import/gnu.scm,
guix/scripts/import/hackage.scm,
guix/scripts/import/nix.scm,
guix/scripts/import/pypi.scm,
guix/scripts/import/stackage.scm,
guix/scripts/lint.scm,
guix/scripts/offload.scm,
guix/scripts/pack.scm,
guix/scripts/package.scm,
guix/scripts/perform-download.scm,
guix/scripts/publish.scm,
guix/scripts/pull.scm,
guix/scripts/refresh.scm,
guix/scripts/size.scm,
guix/scripts/substitute.scm,
guix/scripts/system.scm,
guix/ssh.scm,
guix/upstream.scm: Use 'G_' instead of '_'. Most of this change was
obtained by running: "sed -i -e's/(_ "/(G_ "/g' `find -name \*.scm`".
2017-05-03 15:57:02 +02:00
|
|
|
|
(display (G_ "
|
2017-03-14 15:11:03 +01:00
|
|
|
|
--localstatedir include /var/guix in the resulting pack"))
|
2018-03-11 01:13:01 +01:00
|
|
|
|
(display (G_ "
|
|
|
|
|
--bootstrap use the bootstrap binaries to build the pack"))
|
2017-03-12 16:48:40 +01:00
|
|
|
|
(newline)
|
ui: Rename '_' to 'G_'.
This avoids collisions with '_' when the latter is used as a 'match'
pattern for instance. See
<https://lists.gnu.org/archive/html/guix-devel/2017-04/msg00464.html>.
* guix/ui.scm: Rename '_' to 'G_'.
* po/guix/Makevars (XGETTEXT_OPTIONS): Adjust accordingly.
* build-aux/compile-all.scm (warnings): Remove 'format'.
* gnu/packages.scm,
gnu/services.scm,
gnu/services/shepherd.scm,
gnu/system.scm,
gnu/system/shadow.scm,
guix/gnupg.scm,
guix/http-client.scm,
guix/import/cpan.scm,
guix/import/elpa.scm,
guix/import/pypi.scm,
guix/nar.scm,
guix/scripts.scm,
guix/scripts/archive.scm,
guix/scripts/authenticate.scm,
guix/scripts/build.scm,
guix/scripts/challenge.scm,
guix/scripts/container.scm,
guix/scripts/container/exec.scm,
guix/scripts/copy.scm,
guix/scripts/download.scm,
guix/scripts/edit.scm,
guix/scripts/environment.scm,
guix/scripts/gc.scm,
guix/scripts/graph.scm,
guix/scripts/hash.scm,
guix/scripts/import.scm,
guix/scripts/import/cpan.scm,
guix/scripts/import/cran.scm,
guix/scripts/import/crate.scm,
guix/scripts/import/elpa.scm,
guix/scripts/import/gem.scm,
guix/scripts/import/gnu.scm,
guix/scripts/import/hackage.scm,
guix/scripts/import/nix.scm,
guix/scripts/import/pypi.scm,
guix/scripts/import/stackage.scm,
guix/scripts/lint.scm,
guix/scripts/offload.scm,
guix/scripts/pack.scm,
guix/scripts/package.scm,
guix/scripts/perform-download.scm,
guix/scripts/publish.scm,
guix/scripts/pull.scm,
guix/scripts/refresh.scm,
guix/scripts/size.scm,
guix/scripts/substitute.scm,
guix/scripts/system.scm,
guix/ssh.scm,
guix/upstream.scm: Use 'G_' instead of '_'. Most of this change was
obtained by running: "sed -i -e's/(_ "/(G_ "/g' `find -name \*.scm`".
2017-05-03 15:57:02 +02:00
|
|
|
|
(display (G_ "
|
2017-03-12 16:48:40 +01:00
|
|
|
|
-h, --help display this help and exit"))
|
ui: Rename '_' to 'G_'.
This avoids collisions with '_' when the latter is used as a 'match'
pattern for instance. See
<https://lists.gnu.org/archive/html/guix-devel/2017-04/msg00464.html>.
* guix/ui.scm: Rename '_' to 'G_'.
* po/guix/Makevars (XGETTEXT_OPTIONS): Adjust accordingly.
* build-aux/compile-all.scm (warnings): Remove 'format'.
* gnu/packages.scm,
gnu/services.scm,
gnu/services/shepherd.scm,
gnu/system.scm,
gnu/system/shadow.scm,
guix/gnupg.scm,
guix/http-client.scm,
guix/import/cpan.scm,
guix/import/elpa.scm,
guix/import/pypi.scm,
guix/nar.scm,
guix/scripts.scm,
guix/scripts/archive.scm,
guix/scripts/authenticate.scm,
guix/scripts/build.scm,
guix/scripts/challenge.scm,
guix/scripts/container.scm,
guix/scripts/container/exec.scm,
guix/scripts/copy.scm,
guix/scripts/download.scm,
guix/scripts/edit.scm,
guix/scripts/environment.scm,
guix/scripts/gc.scm,
guix/scripts/graph.scm,
guix/scripts/hash.scm,
guix/scripts/import.scm,
guix/scripts/import/cpan.scm,
guix/scripts/import/cran.scm,
guix/scripts/import/crate.scm,
guix/scripts/import/elpa.scm,
guix/scripts/import/gem.scm,
guix/scripts/import/gnu.scm,
guix/scripts/import/hackage.scm,
guix/scripts/import/nix.scm,
guix/scripts/import/pypi.scm,
guix/scripts/import/stackage.scm,
guix/scripts/lint.scm,
guix/scripts/offload.scm,
guix/scripts/pack.scm,
guix/scripts/package.scm,
guix/scripts/perform-download.scm,
guix/scripts/publish.scm,
guix/scripts/pull.scm,
guix/scripts/refresh.scm,
guix/scripts/size.scm,
guix/scripts/substitute.scm,
guix/scripts/system.scm,
guix/ssh.scm,
guix/upstream.scm: Use 'G_' instead of '_'. Most of this change was
obtained by running: "sed -i -e's/(_ "/(G_ "/g' `find -name \*.scm`".
2017-05-03 15:57:02 +02:00
|
|
|
|
(display (G_ "
|
2017-03-12 16:48:40 +01:00
|
|
|
|
-V, --version display version information and exit"))
|
|
|
|
|
(newline)
|
|
|
|
|
(show-bug-report-information))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
;;;
|
|
|
|
|
;;; Entry point.
|
|
|
|
|
;;;
|
|
|
|
|
|
|
|
|
|
(define (guix-pack . args)
|
|
|
|
|
(define opts
|
|
|
|
|
(parse-command-line args %options (list %default-options)))
|
|
|
|
|
|
2017-04-07 22:20:28 +02:00
|
|
|
|
(define maybe-package-argument
|
|
|
|
|
;; Given an option pair, return a package, a package/output tuple, or #f.
|
|
|
|
|
(match-lambda
|
|
|
|
|
(('argument . spec)
|
|
|
|
|
(call-with-values
|
|
|
|
|
(lambda ()
|
|
|
|
|
(specification->package+output spec))
|
|
|
|
|
list))
|
|
|
|
|
(('expression . exp)
|
|
|
|
|
(read/eval-package-expression exp))
|
|
|
|
|
(x #f)))
|
|
|
|
|
|
2018-05-07 10:44:18 +02:00
|
|
|
|
(define (manifest-from-args store opts)
|
|
|
|
|
(let* ((transform (options->transformation opts))
|
|
|
|
|
(packages (map (match-lambda
|
|
|
|
|
(((? package? package) output)
|
2018-05-07 14:04:19 +02:00
|
|
|
|
(list (transform store package) output))
|
|
|
|
|
((? package? package)
|
|
|
|
|
(list (transform store package) "out")))
|
2018-05-07 10:44:18 +02:00
|
|
|
|
(filter-map maybe-package-argument opts)))
|
|
|
|
|
(manifest-file (assoc-ref opts 'manifest)))
|
2018-02-09 20:33:12 +01:00
|
|
|
|
(cond
|
|
|
|
|
((and manifest-file (not (null? packages)))
|
|
|
|
|
(leave (G_ "both a manifest and a package list were given~%")))
|
|
|
|
|
(manifest-file
|
|
|
|
|
(let ((user-module (make-user-module '((guix profiles) (gnu)))))
|
|
|
|
|
(load* manifest-file user-module)))
|
|
|
|
|
(else (packages->manifest packages)))))
|
|
|
|
|
|
2017-03-12 16:48:40 +01:00
|
|
|
|
(with-error-handling
|
2018-05-07 10:44:18 +02:00
|
|
|
|
(with-store store
|
2018-05-02 17:08:37 +02:00
|
|
|
|
;; Set the build options before we do anything else.
|
|
|
|
|
(set-build-options-from-command-line store opts)
|
|
|
|
|
|
2018-05-07 10:44:18 +02:00
|
|
|
|
(parameterize ((%graft? (assoc-ref opts 'graft?))
|
|
|
|
|
(%guile-for-build (package-derivation
|
|
|
|
|
store
|
|
|
|
|
(if (assoc-ref opts 'bootstrap?)
|
|
|
|
|
%bootstrap-guile
|
|
|
|
|
(canonical-package guile-2.2))
|
|
|
|
|
#:graft? (assoc-ref opts 'graft?))))
|
|
|
|
|
(let* ((dry-run? (assoc-ref opts 'dry-run?))
|
2018-05-02 17:08:37 +02:00
|
|
|
|
(relocatable? (assoc-ref opts 'relocatable?))
|
|
|
|
|
(manifest (let ((manifest (manifest-from-args store opts)))
|
|
|
|
|
;; Note: We cannot honor '--bootstrap' here because
|
|
|
|
|
;; 'glibc-bootstrap' lacks 'libc.a'.
|
|
|
|
|
(if relocatable?
|
|
|
|
|
(map-manifest-entries wrapped-package manifest)
|
|
|
|
|
manifest)))
|
2018-05-07 10:44:18 +02:00
|
|
|
|
(pack-format (assoc-ref opts 'format))
|
|
|
|
|
(name (string-append (symbol->string pack-format)
|
|
|
|
|
"-pack"))
|
|
|
|
|
(target (assoc-ref opts 'target))
|
|
|
|
|
(bootstrap? (assoc-ref opts 'bootstrap?))
|
|
|
|
|
(compressor (if bootstrap?
|
|
|
|
|
bootstrap-xz
|
|
|
|
|
(assoc-ref opts 'compressor)))
|
|
|
|
|
(tar (if bootstrap?
|
|
|
|
|
%bootstrap-coreutils&co
|
|
|
|
|
tar))
|
|
|
|
|
(symlinks (assoc-ref opts 'symlinks))
|
|
|
|
|
(build-image (match (assq-ref %formats pack-format)
|
|
|
|
|
((? procedure? proc) proc)
|
|
|
|
|
(#f
|
|
|
|
|
(leave (G_ "~a: unknown pack format")
|
|
|
|
|
format))))
|
|
|
|
|
(localstatedir? (assoc-ref opts 'localstatedir?)))
|
2017-03-12 16:48:40 +01:00
|
|
|
|
(run-with-store store
|
|
|
|
|
(mlet* %store-monad ((profile (profile-derivation
|
2018-02-09 20:33:12 +01:00
|
|
|
|
manifest
|
2018-05-02 17:08:37 +02:00
|
|
|
|
#:relative-symlinks? relocatable?
|
2018-03-11 01:13:01 +01:00
|
|
|
|
#:hooks (if bootstrap?
|
|
|
|
|
'()
|
|
|
|
|
%default-profile-hooks)
|
|
|
|
|
#:locales? (not bootstrap?)
|
2017-03-17 22:45:32 +01:00
|
|
|
|
#:target target))
|
2017-03-16 18:02:59 +01:00
|
|
|
|
(drv (build-image name profile
|
2017-03-17 22:45:32 +01:00
|
|
|
|
#:target
|
|
|
|
|
target
|
2017-03-16 18:02:59 +01:00
|
|
|
|
#:compressor
|
|
|
|
|
compressor
|
|
|
|
|
#:symlinks
|
|
|
|
|
symlinks
|
|
|
|
|
#:localstatedir?
|
2018-03-11 01:13:01 +01:00
|
|
|
|
localstatedir?
|
|
|
|
|
#:tar
|
|
|
|
|
tar)))
|
2017-03-12 16:48:40 +01:00
|
|
|
|
(mbegin %store-monad
|
|
|
|
|
(show-what-to-build* (list drv)
|
|
|
|
|
#:use-substitutes?
|
|
|
|
|
(assoc-ref opts 'substitutes?)
|
|
|
|
|
#:dry-run? dry-run?)
|
|
|
|
|
(munless dry-run?
|
|
|
|
|
(built-derivations (list drv))
|
|
|
|
|
(return (format #t "~a~%"
|
|
|
|
|
(derivation->output-path drv))))))
|
|
|
|
|
#:system (assoc-ref opts 'system)))))))
|