summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--Makefile.am1
-rw-r--r--guix/channels.scm77
-rw-r--r--guix/quirks.scm124
3 files changed, 129 insertions, 73 deletions
diff --git a/Makefile.am b/Makefile.am
index 6a5dd64fed..fd368d7493 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -95,6 +95,7 @@ MODULES =					\
   guix/repl.scm					\
   guix/inferior.scm				\
   guix/describe.scm				\
+  guix/quirks.scm				\
   guix/channels.scm				\
   guix/gnu-maintenance.scm			\
   guix/self.scm					\
diff --git a/guix/channels.scm b/guix/channels.scm
index 0fa036446c..aca8302ba0 100644
--- a/guix/channels.scm
+++ b/guix/channels.scm
@@ -38,7 +38,6 @@
                 #:select (source-properties->location
                           &error-location
                           &fix-hint))
-  #:use-module ((guix build utils) #:select (substitute*))
   #:use-module (srfi srfi-1)
   #:use-module (srfi srfi-2)
   #:use-module (srfi srfi-9)
@@ -48,6 +47,7 @@
   #:use-module (srfi srfi-35)
   #:autoload   (guix self) (whole-package make-config.scm)
   #:autoload   (guix inferior) (gexp->derivation-in-inferior) ;FIXME: circular dep
+  #:autoload   (guix quirks) (%quirks %patches applicable-patch? apply-patch)
   #:use-module (ice-9 match)
   #:use-module (ice-9 vlist)
   #:use-module ((ice-9 rdelim) #:select (read-string))
@@ -200,24 +200,15 @@ description file or its default value."
 channel INSTANCE."
   (channel-metadata-dependencies (channel-instance-metadata instance)))
 
-;; Patch to apply to a source tree.
-(define-record-type <patch>
-  (patch predicate application)
-  patch?
-  (predicate    patch-predicate)                  ;procedure
-  (application  patch-application))               ;procedure
-
 (define (apply-patches checkout commit patches)
   "Apply the matching PATCHES to CHECKOUT, modifying files in place.  The
 result is unspecified."
   (let loop ((patches patches))
     (match patches
       (() #t)
-      ((($ <patch> predicate modify) rest ...)
-       ;; PREDICATE is passed COMMIT so that it can choose to only apply to
-       ;; ancestors.
-       (when (predicate checkout commit)
-         (modify checkout))
+      ((patch rest ...)
+       (when (applicable-patch? patch checkout commit)
+         (apply-patch patch checkout))
        (loop rest)))))
 
 (define* (latest-channel-instance store channel
@@ -346,66 +337,6 @@ to '%package-module-path'."
 
     (gexp->derivation-in-inferior name build core)))
 
-(define (syscalls-reexports-local-variables? source)
-  "Return true if (guix build syscalls) contains the bug described at
-<https://bugs.gnu.org/36723>."
-  (catch 'system-error
-    (lambda ()
-      (define content
-        (call-with-input-file (string-append source
-                                             "/guix/build/syscalls.scm")
-          read-string))
-
-      ;; The faulty code would use the 're-export' macro, causing the
-      ;; 'AT_SYMLINK_NOFOLLOW' local variable to be re-exported when using
-      ;; Guile > 2.2.4.
-      (string-contains content "(re-export variable)"))
-    (lambda args
-      (if (= ENOENT (system-error-errno args))
-          #f
-          (apply throw args)))))
-
-(define (guile-2.2.4)
-  (module-ref (resolve-interface '(gnu packages guile))
-              'guile-2.2.4))
-
-(define %quirks
-  ;; List of predicate/package pairs.  This allows us to provide information
-  ;; about specific Guile versions that old Guix revisions might need to use
-  ;; just to be able to build and run the trampoline in %SELF-BUILD-FILE.  See
-  ;; <https://bugs.gnu.org/37506>
-  `((,syscalls-reexports-local-variables? . ,guile-2.2.4)))
-
-
-(define %bug-41028-patch
-  ;; Patch for <https://bugs.gnu.org/41028>.  The faulty code is the
-  ;; 'compute-guix-derivation' body, which uses 'call-with-new-thread' without
-  ;; importing (ice-9 threads).  However, the 'call-with-new-thread' binding
-  ;; is no longer available in the default name space on Guile 3.0.
-  (let ()
-    (define (missing-ice-9-threads-import? source commit)
-      ;; Return true if %SELF-BUILD-FILE is missing an (ice-9 threads) import.
-      (define content
-        (call-with-input-file (string-append source "/" %self-build-file)
-          read-string))
-
-      (and (string-contains content "(call-with-new-thread")
-           (not (string-contains content "(ice-9 threads)"))))
-
-    (define (add-missing-ice-9-threads-import source)
-      ;; Add (ice-9 threads) import in the gexp of 'compute-guix-derivation'.
-      (substitute* (string-append source "/" %self-build-file)
-        (("^ +\\(use-modules \\(ice-9 match\\)\\)")
-         (object->string '(use-modules (ice-9 match) (ice-9 threads))))))
-
-   (patch missing-ice-9-threads-import? add-missing-ice-9-threads-import)))
-
-(define %patches
-  ;; Bits of past Guix revisions can become incompatible with newer Guix and
-  ;; Guile.  This variable lists <patch> records for the Guix source tree that
-  ;; apply to the Guix source.
-  (list %bug-41028-patch))
-
 (define* (guile-for-source source #:optional (quirks %quirks))
   "Return the Guile package to use when building SOURCE or #f if the default
 '%guile-for-build' should be good enough."
diff --git a/guix/quirks.scm b/guix/quirks.scm
new file mode 100644
index 0000000000..483169e70d
--- /dev/null
+++ b/guix/quirks.scm
@@ -0,0 +1,124 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2020 Ludovic Courtès <ludo@gnu.org>
+;;;
+;;; 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 quirks)
+  #:use-module ((guix build utils) #:select (substitute*))
+  #:use-module (srfi srfi-9)
+  #:use-module (ice-9 rdelim)
+  #:export (%quirks
+
+            patch?
+            applicable-patch?
+            apply-patch
+
+            %patches))
+
+;;; Commentary:
+;;;
+;;; Time traveling is a challenge!  Sometimes, going back to the past requires
+;;; adjusting the old source code so it can be evaluated with our modern day
+;;; Guile and against our modern Guix APIs.  This file describes quirks found
+;;; in old Guix revisions, along with ways to address them or patch them.
+;;;
+;;; Code:
+
+(define (syscalls-reexports-local-variables? source)
+  "Return true if (guix build syscalls) contains the bug described at
+<https://bugs.gnu.org/36723>."
+  (catch 'system-error
+    (lambda ()
+      (define content
+        (call-with-input-file (string-append source
+                                             "/guix/build/syscalls.scm")
+          read-string))
+
+      ;; The faulty code would use the 're-export' macro, causing the
+      ;; 'AT_SYMLINK_NOFOLLOW' local variable to be re-exported when using
+      ;; Guile > 2.2.4.
+      (string-contains content "(re-export variable)"))
+    (lambda args
+      (if (= ENOENT (system-error-errno args))
+          #f
+          (apply throw args)))))
+
+(define (guile-2.2.4)
+  (module-ref (resolve-interface '(gnu packages guile))
+              'guile-2.2.4))
+
+(define %quirks
+  ;; List of predicate/package pairs.  This allows us to provide information
+  ;; about specific Guile versions that old Guix revisions might need to use
+  ;; just to be able to build and run the trampoline in %SELF-BUILD-FILE.  See
+  ;; <https://bugs.gnu.org/37506>
+  `((,syscalls-reexports-local-variables? . ,guile-2.2.4)))
+
+
+;;;
+;;; Patches.
+;;;
+
+;; Patch to apply to a source tree.
+(define-record-type <patch>
+  (patch predicate application)
+  patch?
+  (predicate    patch-predicate)                  ;procedure
+  (application  patch-application))               ;procedure
+
+(define (applicable-patch? patch source commit)
+  "Return true if PATCH is applicable to SOURCE, a directory, which
+corresponds to the given Guix COMMIT, a SHA1 hexadecimal string."
+  ;; The predicate is passed COMMIT so that it can choose to only apply to
+  ;; ancestors.
+  ((patch-predicate patch) source commit))
+
+(define (apply-patch patch source)
+  "Apply PATCH onto SOURCE, directly modifying files beneath it."
+  ((patch-application patch) source))
+
+(define %self-build-file
+  ;; The file containing code to build Guix.
+  "build-aux/build-self.scm")
+
+(define %bug-41028-patch
+  ;; Patch for <https://bugs.gnu.org/41028>.  The faulty code is the
+  ;; 'compute-guix-derivation' body, which uses 'call-with-new-thread' without
+  ;; importing (ice-9 threads).  However, the 'call-with-new-thread' binding
+  ;; is no longer available in the default name space on Guile 3.0.
+  (let ()
+    (define (missing-ice-9-threads-import? source commit)
+      ;; Return true if %SELF-BUILD-FILE is missing an (ice-9 threads) import.
+      (define content
+        (call-with-input-file (string-append source "/" %self-build-file)
+          read-string))
+
+      (and (string-contains content "(call-with-new-thread")
+           (not (string-contains content "(ice-9 threads)"))))
+
+    (define (add-missing-ice-9-threads-import source)
+      ;; Add (ice-9 threads) import in the gexp of 'compute-guix-derivation'.
+      (substitute* (string-append source "/" %self-build-file)
+        (("^ +\\(use-modules \\(ice-9 match\\)\\)")
+         (object->string '(use-modules (ice-9 match) (ice-9 threads))))))
+
+   (patch missing-ice-9-threads-import? add-missing-ice-9-threads-import)))
+
+(define %patches
+  ;; Bits of past Guix revisions can become incompatible with newer Guix and
+  ;; Guile.  This variable lists <patch> records for the Guix source tree that
+  ;; apply to the Guix source.
+  (list %bug-41028-patch))