;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2014, 2016, 2017, 2018 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2014, 2016, 2017, 2018, 2019 Ludovic Courtès <ludo@gnu.org>
;;;
;;; This file is part of GNU Guix.
;;;
#:use-module (guix build-system gnu)
#:use-module (srfi srfi-1)
#:use-module (srfi srfi-19)
+ #:use-module (srfi srfi-34)
+ #:use-module (srfi srfi-35)
#:use-module (rnrs io ports)
#:use-module (ice-9 match)
#:use-module (ice-9 popen)
(define %state-directory
;; This must match `NIX_STATE_DIR' as defined in
;; `nix/local.mk'.
- (or (getenv "NIX_STATE_DIR")
+ (or (getenv "GUIX_STATE_DIRECTORY")
(string-append %localstatedir "/guix")))
(define %store-database-directory
- (or (getenv "NIX_DB_DIR")
+ (or (getenv "GUIX_DATABASE_DIRECTORY")
(string-append %state-directory "/db")))
(define %config-directory
#~(define-module (gcrypt hash)
#:export (sha1 sha256))))
+ (define fake-git
+ (scheme-file "git.scm" #~(define-module (git))))
+
(with-imported-modules `(((guix config)
=> ,(make-config.scm))
;; adjust %LOAD-PATH later on.
((gcrypt hash) => ,fake-gcrypt-hash)
+ ;; (guix git-download) depends on (git) but only
+ ;; for peripheral functionality. Provide a dummy
+ ;; (git) to placate it.
+ ((git) => ,fake-git)
+
,@(source-module-closure `((guix store)
(guix self)
(guix derivations)
(use-modules (ice-9 match))
(eval-when (expand load eval)
- ;; Don't augment '%load-path'.
- (unsetenv "GUIX_PACKAGE_PATH")
-
;; (gnu packages …) modules are going to be looked up
;; under SOURCE. (guix config) is looked up in FRONT.
(match (command-line)
;; Only load Guile-Gcrypt, our own modules, or those
;; of Guile.
- (match %load-compiled-path
- ((front _ ... sys1 sys2)
- (unless (string-prefix? #$guile-gcrypt front)
- (set! %load-compiled-path
- (list (string-append #$guile-gcrypt
- "/lib/guile/"
- (effective-version)
- "/site-ccache")
- front sys1 sys2))))))
+ (set! %load-compiled-path
+ (cons (string-append #$guile-gcrypt "/lib/guile/"
+ (effective-version)
+ "/site-ccache")
+ %load-compiled-path)))
(use-modules (guix store)
(guix self)
(format (current-error-port)
"Computing Guix derivation for '~a'... "
system)
- (let loop ((spin spin))
- (display (string-append "\b" (car spin))
- (current-error-port))
- (force-output (current-error-port))
- (sleep 1)
- (loop (cdr spin))))
+ (when (isatty? (current-error-port))
+ (let loop ((spin spin))
+ (display (string-append "\b" (car spin))
+ (current-error-port))
+ (force-output (current-error-port))
+ (sleep 1)
+ (loop (cdr spin)))))
(match (command-line)
((_ source system version protocol-version)
derivation-file-name))))))
#:module-path (list source))))
+(define (call-with-clean-environment thunk)
+ (let ((env (environ)))
+ (dynamic-wind
+ (lambda ()
+ (environ '()))
+ thunk
+ (lambda ()
+ (environ env)))))
+
+(define-syntax-rule (with-clean-environment exp ...)
+ "Evaluate EXP in a context where zero environment variables are defined."
+ (call-with-clean-environment (lambda () exp ...)))
+
;; The procedure below is our return value.
(define* (build source
#:key verbose? (version (date-version-string)) system
;; stdin will actually be /dev/null.
(let* ((pipe (with-input-from-port port
(lambda ()
- (setenv "GUILE_WARN_DEPRECATED" "no") ;be quiet and drive
- (open-pipe* OPEN_READ
- (derivation->output-path build)
- source system version
- (if (file-port? port)
- (number->string
- (logior major minor))
- "none")))))
+ ;; Make sure BUILD is not influenced by
+ ;; $GUILE_LOAD_PATH & co.
+ (with-clean-environment
+ (setenv "GUILE_WARN_DEPRECATED" "no") ;be quiet and drive
+ (open-pipe* OPEN_READ
+ (derivation->output-path build)
+ source system version
+ (if (file-port? port)
+ (number->string
+ (logior major minor))
+ "none"))))))
(str (get-string-all pipe))
(status (close-pipe pipe)))
(match str
(error "build program failed" (list build status)))
((? derivation-path? drv)
(mbegin %store-monad
- (return (newline (current-output-port)))
+ (return (newline (current-error-port)))
((store-lift add-temp-root) drv)
(return (read-derivation-from-file drv))))
("#f"
;; Unsupported PULL-VERSION.
(return #f))
((? string? str)
- (error "invalid build result" (list build str))))))))
+ (raise (condition
+ (&message
+ (message (format #f "You found a bug: the program '~a'
+failed to compute the derivation for Guix (version: ~s; system: ~s;
+host version: ~s; pull-version: ~s).
+Please report it by email to <~a>.~%"
+ (derivation->output-path build)
+ version system %guix-version pull-version
+ %guix-bug-report-address)))))))))))
;; This file is loaded by 'guix pull'; return it the build procedure.
build