diff options
author | Ludovic Courtès <ludo@gnu.org> | 2013-12-16 23:07:17 +0100 |
---|---|---|
committer | Ludovic Courtès <ludo@gnu.org> | 2013-12-16 23:26:48 +0100 |
commit | 3dbeecd2ffb912d0a114593038e3a9f987d3eb38 (patch) | |
tree | 27cdd0c2eff16b0b21f961738d640436e102271a /guix/scripts | |
parent | 9cc98f8aa6376ca28529b5b748d2a52bffb16902 (diff) | |
download | gnu-guix-3dbeecd2ffb912d0a114593038e3a9f987d3eb38.tar gnu-guix-3dbeecd2ffb912d0a114593038e3a9f987d3eb38.tar.gz |
pull: Move build code to (guix build pull).
* guix/build/pull.scm: New file.
* Makefile.am (MODULES): Add it.
* guix/scripts/pull.scm (unpack): Use it.
Diffstat (limited to 'guix/scripts')
-rw-r--r-- | guix/scripts/pull.scm | 132 |
1 files changed, 9 insertions, 123 deletions
diff --git a/guix/scripts/pull.scm b/guix/scripts/pull.scm index 11f5cc1493..00bea1707d 100644 --- a/guix/scripts/pull.scm +++ b/guix/scripts/pull.scm @@ -41,129 +41,14 @@ "Return a derivation that unpacks TARBALL into STORE and compiles Scheme files." (define builder - `(begin - (use-modules (guix build utils) - (system base compile) - (ice-9 ftw) - (ice-9 match) - (srfi srfi-1) - (srfi srfi-11) - (srfi srfi-26)) + '(begin + (use-modules (guix build pull)) - (setvbuf (current-output-port) _IOLBF) - (setvbuf (current-error-port) _IOLBF) - - (let ((out (assoc-ref %outputs "out")) - (tar (assoc-ref %build-inputs "tar")) - (gzip (assoc-ref %build-inputs "gzip")) - (gcrypt (assoc-ref %build-inputs "gcrypt")) - (tarball (assoc-ref %build-inputs "tarball"))) - - (define (call-with-process thunk) - ;; Run THUNK in a separate process that will return 0 if THUNK - ;; terminates normally, and 1 if an exception is raised. - (match (primitive-fork) - (0 - (catch #t - (lambda () - (thunk) - (primitive-exit 0)) - (lambda (key . args) - (print-exception (current-error-port) #f key args) - (primitive-exit 1)))) - (pid - #t))) - - (define (p-for-each proc lst) - ;; Invoke PROC for each element of LST in a separate process. - ;; Raise an error if one of the processes exit with non-zero. - (define (wait-for-one-process) - (match (waitpid WAIT_ANY) - ((_ . status) - (unless (zero? (status:exit-val status)) - (error "process failed" proc status))))) - - (define max-processes - (current-processor-count)) - - (let loop ((lst lst) - (running 0)) - (match lst - (() - (or (zero? running) - (begin - (wait-for-one-process) - (loop lst (- running 1))))) - ((head . tail) - (if (< running max-processes) - (begin - (call-with-process (cut proc head)) - (loop tail (+ running 1))) - (begin - (wait-for-one-process) - (loop lst (- running 1)))))))) - - (setenv "PATH" (string-append tar "/bin:" gzip "/bin")) - - (system* "tar" "xvf" tarball) - (match (scandir "." (lambda (name) - (and (not (member name '("." ".."))) - (file-is-directory? name)))) - ((dir) - (chdir dir)) - (x - (error "tarball did not produce a single source directory" x))) - - (format #t "copying and compiling Guix to `~a'...~%" out) - - ;; Copy everything under guix/ and gnu/ plus guix.scm. - (copy-recursively "guix" (string-append out "/guix")) - (copy-recursively "gnu" (string-append out "/gnu")) - (copy-file "guix.scm" (string-append out "/guix.scm")) - - ;; Add a fake (guix config) module to allow the other modules to be - ;; compiled. The user's (guix config) is the one that will be used. - (copy-file "guix/config.scm.in" - (string-append out "/guix/config.scm")) - (substitute* (string-append out "/guix/config.scm") - (("@LIBGCRYPT@") - (string-append gcrypt "/lib/libgcrypt"))) - - ;; Augment the search path so Scheme code can be compiled. - (set! %load-path (cons out %load-path)) - (set! %load-compiled-path (cons out %load-compiled-path)) - - ;; Compile the .scm files. Do that in independent processes, à la - ;; 'make -j', to work around <http://bugs.gnu.org/15602> (FIXME). - ;; This ensures correctness, but is overly conservative and slow. - ;; The solution initially implemented (and described in the bug - ;; above) was slightly faster but consumed memory proportional to the - ;; number of modules, which quickly became unacceptable. - (p-for-each (lambda (file) - (let ((go (string-append (string-drop-right file 4) - ".go"))) - (format (current-error-port) - "compiling '~a'...~%" file) - (compile-file file - #:output-file go - #:opts - %auto-compilation-options))) - - (filter (cut string-suffix? ".scm" <>) - - ;; Build guix/*.scm before gnu/*.scm to speed - ;; things up. - (sort (find-files out "\\.scm") - (let ((guix (string-append out "/guix")) - (gnu (string-append out "/gnu"))) - (lambda (a b) - (or (and (string-prefix? guix a) - (string-prefix? gnu b)) - (string<? a b))))))) - - ;; Remove the "fake" (guix config). - (delete-file (string-append out "/guix/config.scm")) - (delete-file (string-append out "/guix/config.go"))))) + (build-guix (assoc-ref %outputs "out") + (assoc-ref %build-inputs "tarball") + #:tar (assoc-ref %build-inputs "tar") + #:gzip (assoc-ref %build-inputs "gzip") + #:gcrypt (assoc-ref %build-inputs "gcrypt")))) (build-expression->derivation store "guix-latest" builder #:inputs @@ -172,7 +57,8 @@ files." ("gcrypt" ,(package-derivation store libgcrypt)) ("tarball" ,tarball)) - #:modules '((guix build utils)))) + #:modules '((guix build pull) + (guix build utils)))) ;;; |