;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2014, 2016, 2017 Ludovic Courtès ;;; ;;; 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 . (define-module (build-self) #:use-module (srfi srfi-1) #:use-module (srfi srfi-19) #:use-module (ice-9 match) #:export (build)) ;;; Commentary: ;;; ;;; When loaded, this module returns a monadic procedure of at least one ;;; argument: the source tree to build. It returns a derivation that ;;; builds it. ;;; ;;; This file uses modules provided by the already-installed Guix. Those ;;; modules may be arbitrarily old compared to the version we want to ;;; build. Because of that, it must rely on the smallest set of features ;;; that are likely to be provided by the (guix) and (gnu) modules, and by ;;; Guile itself, forever and ever. ;;; ;;; Code: ;; Use our very own Guix modules. (eval-when (compile load eval) ;; Ignore any available .go, and force recompilation. This is because our ;; checkout in the store has mtime set to the epoch, and thus .go files look ;; newer, even though they may not correspond. (set! %fresh-auto-compile #t) (and=> (assoc-ref (current-source-location) 'filename) (lambda (file) (let ((dir (string-append (dirname file) "/../.."))) (set! %load-path (cons dir %load-path)))))) (define (date-version-string) "Return the current date and hour in UTC timezone, for use as a poor person's version identifier." ;; XXX: Last resort when the Git commit id is missing. (date->string (current-date 0) "~Y~m~d.~H")) ;; The procedure below is our return value. (define* (build source #:key verbose? (version (date-version-string)) #:allow-other-keys #:rest rest) "Return a derivation that unpacks SOURCE into STORE and compiles Scheme files." ;; FIXME: Closures in (guix scripts pull) have already cached old values of ;; (guix …), so they keep referring to the "old" world, with different ;; record types than the one we get after reloading (because record types ;; are "generative".) ;; (let ((reload-guix (module-ref (resolve-interface '(guix self)) ;; 'reload-guix))) ;; (reload-guix)) ;cross fingers! (let ((guix-derivation (module-ref (resolve-interface '(guix self)) 'guix-derivation))) (guix-derivation source version))) ;; This file is loaded by 'guix pull'; return it the build procedure. build ;;; build-self.scm ends here