[PATCH 0/6] Adding a (guix transformations) module

  • Done
  • quality assurance status badge
Details
3 participants
  • Ludovic Courtès
  • Miguel Ángel Arruga Vivas
  • zimoun
Owner
unassigned
Submitted by
Ludovic Courtès
Severity
normal
L
L
Ludovic Courtès wrote on 30 Oct 2020 00:08
(address . guix-patches@gnu.org)(name . Ludovic Courtès)(address . ludo@gnu.org)
20201029230831.14456-1-ludo@gnu.org
Hello Guix!

This patch series is to make ‘options->transformation’ public,
mostly so that users can directly translate package transformation
options to code they can use in manifests.

The second goal of the patch is to have a new “Defining Package
Variants” section that gives an introduction to this topic with
all the relevant pointers.

That’s it! Thoughts?

Ludo’.

PS: I swear this is the last non-trivial change I’d submit for 1.2.
:-)

Ludovic Courtès (6):
guix build: 'package-with-source' no longer takes a 'store' parameter.
guix build: Remove unnecessary (replacement #f).
guix build: 'options->transformation' no longer takes a 'store'
parameter.
guix build: Move transformation options to (guix transformations).
transformations: Raise '&formatted-message' exceptions instead of
'leave'.
doc: Add "Defining Package Variants" section.

Makefile.am | 3 +-
doc/guix.texi | 278 +++++---
guix/scripts/build.scm | 544 +--------------
guix/scripts/environment.scm | 3 +-
guix/scripts/graph.scm | 13 +-
guix/scripts/install.scm | 1 +
guix/scripts/pack.scm | 5 +-
guix/scripts/package.scm | 5 +-
guix/scripts/upgrade.scm | 1 +
guix/transformations.scm | 620 ++++++++++++++++++
...{scripts-build.scm => transformations.scm} | 267 ++++----
11 files changed, 976 insertions(+), 764 deletions(-)
create mode 100644 guix/transformations.scm
rename tests/{scripts-build.scm => transformations.scm} (63%)

--
2.28.0
L
L
Ludovic Courtès wrote on 30 Oct 2020 00:09
[PATCH 1/6] guix build: 'package-with-source' no longer takes a 'store' parameter.
(address . 44321@debbugs.gnu.org)(name . Ludovic Courtès)(address . ludo@gnu.org)
20201029231000.14568-1-ludo@gnu.org
* guix/scripts/build.scm (<downloaded-file>): New record type.
(download-to-store*): New variable.
(compile-downloaded-file): New procedure.
(package-with-source): Remove 'store' parameter. Use 'downloaded-file'
instead of 'download-to-store'.
(transform-package-source): Adjust accordingly.
---
guix/scripts/build.scm | 26 ++++++++++++++++++++++----
1 file changed, 22 insertions(+), 4 deletions(-)

Toggle diff (60 lines)
diff --git a/guix/scripts/build.scm b/guix/scripts/build.scm
index f4a8af035b..831ac8f798 100644
--- a/guix/scripts/build.scm
+++ b/guix/scripts/build.scm
@@ -45,6 +45,7 @@
#:use-module (ice-9 match)
#:use-module (ice-9 vlist)
#:use-module (srfi srfi-1)
+ #:use-module (srfi srfi-9)
#:use-module (srfi srfi-11)
#:use-module (srfi srfi-26)
#:use-module (srfi srfi-34)
@@ -172,7 +173,25 @@ extensions."
(else
file-name)))
-(define* (package-with-source store p uri #:optional version)
+
+;; Files to be downloaded.
+(define-record-type <downloaded-file>
+ (downloaded-file uri recursive?)
+ downloaded-file?
+ (uri downloaded-file-uri)
+ (recursive? downloaded-file-recursive?))
+
+(define download-to-store*
+ (store-lift download-to-store))
+
+(define-gexp-compiler (compile-downloaded-file (file <downloaded-file>)
+ system target)
+ "Download FILE and return the result as a store item."
+ (match file
+ (($ <downloaded-file> uri recursive?)
+ (download-to-store* uri #:recursive? recursive?))))
+
+(define* (package-with-source p uri #:optional version)
"Return a package based on P but with its source taken from URI. Extract
the new package's version number from URI."
(let ((base (tarball-base-name (basename uri))))
@@ -183,8 +202,7 @@ the new package's version number from URI."
(package-version p)))
;; Use #:recursive? #t to allow for directories.
- (source (download-to-store store uri
- #:recursive? #t))
+ (source (downloaded-file uri #t))
;; Override the replacement, otherwise '--with-source' would
;; have no effect.
@@ -226,7 +244,7 @@ matching URIs given in SOURCES."
((? package? p)
(match (assoc-ref sources (package-name p))
((version source)
- (package-with-source store p source version))
+ (package-with-source p source version))
(#f
p)))
(_
--
2.28.0
L
L
Ludovic Courtès wrote on 30 Oct 2020 00:09
[PATCH 2/6] guix build: Remove unnecessary (replacement #f).
(address . 44321@debbugs.gnu.org)(name . Ludovic Courtès)(address . ludo@gnu.org)
20201029231000.14568-2-ludo@gnu.org
* guix/scripts/build.scm (package-with-source): Remove 'replacement'
field, which is innate since d5ec5ed7197d121130af6953378bcfd8929a9754.
---
guix/scripts/build.scm | 6 +-----
1 file changed, 1 insertion(+), 5 deletions(-)

Toggle diff (19 lines)
diff --git a/guix/scripts/build.scm b/guix/scripts/build.scm
index 831ac8f798..65a125263d 100644
--- a/guix/scripts/build.scm
+++ b/guix/scripts/build.scm
@@ -202,11 +202,7 @@ the new package's version number from URI."
(package-version p)))
;; Use #:recursive? #t to allow for directories.
- (source (downloaded-file uri #t))
-
- ;; Override the replacement, otherwise '--with-source' would
- ;; have no effect.
- (replacement #f)))))
+ (source (downloaded-file uri #t))))))
;;;
--
2.28.0
L
L
Ludovic Courtès wrote on 30 Oct 2020 00:09
[PATCH 3/6] guix build: 'options->transformation' no longer takes a 'store' parameter.
(address . 44321@debbugs.gnu.org)(name . Ludovic Courtès)(address . ludo@gnu.org)
20201029231000.14568-3-ludo@gnu.org
* guix/scripts/build.scm (transform-package-source)
(transform-package-inputs, transform-package-inputs/graft)
(transform-package-source-branch, transform-package-source-commit)
(transform-package-source-git-url, transform-package-toolchain)
(transform-package-with-debug-info, transform-package-tests): Remove
'store' parameter.
(options->transformation, options->derivations): Adjust accordingly.
* guix/scripts/environment.scm (options/resolve-packages): Likewise.
* guix/scripts/graph.scm (guix-graph): Likewise.
* guix/scripts/pack.scm (guix-pack): Likewise.
* guix/scripts/package.scm (transaction-upgrade-entry): Likewise.
(process-actions): Likewise.
* tests/scripts-build.scm ("options->transformation, no transformations"):
Adjust test.
("options->transformation, with-source")
("options->transformation, with-source, replacement")
("options->transformation, with-source, with version")
("options->transformation, with-source, PKG=URI"): Use 'lower-object' to
compute the store file name of the source.
("options->transformation, with-source, no matches"): Remove
'with-store' and adjust accordingly.
("options->transformation, with-input"): Likewise.
("options->transformation, with-graft"): Likewise.
("options->transformation, with-branch"): Likewise.
("options->transformation, with-commit"): Likewise.
("options->transformation, with-git-url"): Likewise.
("options->transformation, with-git-url + with-branch"): Likewise.
("options->transformation, with-c-toolchain"): Likewise.
("options->transformation, with-c-toolchain twice"): Likewise.
("options->transformation, with-c-toolchain, no effect"): Likewise.
("options->transformation, with-debug-info"): Likewise.
("options->transformation, without-tests"): Likewise.
---
guix/scripts/build.scm | 25 ++--
guix/scripts/environment.scm | 2 +-
guix/scripts/graph.scm | 8 +-
guix/scripts/pack.scm | 4 +-
guix/scripts/package.scm | 4 +-
tests/scripts-build.scm | 261 +++++++++++++++++------------------
6 files changed, 148 insertions(+), 156 deletions(-)

Toggle diff (410 lines)
diff --git a/guix/scripts/build.scm b/guix/scripts/build.scm
index 65a125263d..4b86047587 100644
--- a/guix/scripts/build.scm
+++ b/guix/scripts/build.scm
@@ -233,7 +233,7 @@ matching URIs given in SOURCES."
(string-drop uri (+ 1 index))))))))
sources))
- (lambda (store obj)
+ (lambda (obj)
(let loop ((sources new-sources)
(result '()))
(match obj
@@ -276,7 +276,7 @@ called \"guile\" must be replaced with a dependency on a version 2.1 of
(lambda (old new)
new)))
(rewrite (package-input-rewriting/spec replacements)))
- (lambda (store obj)
+ (lambda (obj)
(if (package? obj)
(rewrite obj)
obj))))
@@ -292,7 +292,7 @@ current 'gnutls' package, after which version 3.5.4 is grafted onto them."
(let* ((replacements (evaluate-replacement-specs replacement-specs
set-replacement))
(rewrite (package-input-rewriting/spec replacements)))
- (lambda (store obj)
+ (lambda (obj)
(if (package? obj)
(rewrite obj)
obj))))
@@ -349,7 +349,7 @@ strings like \"guile-next=stable-3.0\" meaning that packages are built using
(let* ((replacements (evaluate-git-replacement-specs replacement-specs
replace))
(rewrite (package-input-rewriting/spec replacements)))
- (lambda (store obj)
+ (lambda (obj)
(if (package? obj)
(rewrite obj)
obj))))
@@ -377,7 +377,7 @@ strings like \"guile-next=cabba9e\" meaning that packages are built using
(let* ((replacements (evaluate-git-replacement-specs replacement-specs
replace))
(rewrite (package-input-rewriting/spec replacements)))
- (lambda (store obj)
+ (lambda (obj)
(if (package? obj)
(rewrite obj)
obj))))
@@ -405,7 +405,7 @@ a checkout of the Git repository at the given URL."
(define rewrite
(package-input-rewriting/spec replacements))
- (lambda (store obj)
+ (lambda (obj)
(if (package? obj)
(rewrite obj)
obj)))
@@ -478,7 +478,7 @@ the equal sign."
spec))))
replacement-specs))
- (lambda (store obj)
+ (lambda (obj)
(if (package? obj)
(or (any (match-lambda
((bottom . toolchain)
@@ -516,7 +516,7 @@ to the same package but with #:strip-binaries? #f in its 'arguments' field."
(cons spec package-with-debug-info))
specs)))
- (lambda (store obj)
+ (lambda (obj)
(if (package? obj)
(rewrite obj)
obj)))
@@ -535,7 +535,7 @@ to the same package but with #:strip-binaries? #f in its 'arguments' field."
(cons spec package-without-tests))
specs)))
- (lambda (store obj)
+ (lambda (obj)
(if (package? obj)
(rewrite obj)
obj)))
@@ -646,7 +646,7 @@ derivation, etc.), applies the transformations specified by OPTS."
applicable))
,@(package-properties p)))))
- (lambda (store obj)
+ (lambda (obj)
(define (tagged-object new)
(if (and (not (eq? obj new))
(package? new) (not (null? applicable)))
@@ -656,7 +656,7 @@ derivation, etc.), applies the transformations specified by OPTS."
(tagged-object
(fold (match-lambda*
(((name value transform) obj)
- (let ((new (transform store obj)))
+ (let ((new (transform obj)))
(when (eq? new obj)
(warning (G_ "transformation '~a' had no effect on ~a~%")
name
@@ -1113,8 +1113,7 @@ build."
(systems systems)))
(define things-to-build
- (map (cut transform store <>)
- (options->things-to-build opts)))
+ (map transform (options->things-to-build opts)))
(define (compute-derivation obj system)
;; Compute the derivation of OBJ for SYSTEM.
diff --git a/guix/scripts/environment.scm b/guix/scripts/environment.scm
index 91ce2af9bb..4db6c5d2d7 100644
--- a/guix/scripts/environment.scm
+++ b/guix/scripts/environment.scm
@@ -320,7 +320,7 @@ for the corresponding packages."
(manifest-entry-output e2))))
(define transform
- (cut (options->transformation opts) store <>))
+ (options->transformation opts))
(define* (package->manifest-entry* package #:optional (output "out"))
(package->manifest-entry (transform package) output))
diff --git a/guix/scripts/graph.scm b/guix/scripts/graph.scm
index 0d11fc9795..6b2e60d7e2 100644
--- a/guix/scripts/graph.scm
+++ b/guix/scripts/graph.scm
@@ -582,11 +582,11 @@ Emit a representation of the dependency graph of PACKAGE...\n"))
(('argument . (? store-path? item))
item)
(('argument . spec)
- (transform store
- (specification->package spec)))
+ (transform
+ (specification->package spec)))
(('expression . exp)
- (transform store
- (read/eval-package-expression exp)))
+ (transform
+ (read/eval-package-expression exp)))
(_ #f))
opts)))
(run-with-store store
diff --git a/guix/scripts/pack.scm b/guix/scripts/pack.scm
index a5a70d5162..8a6aa2882b 100644
--- a/guix/scripts/pack.scm
+++ b/guix/scripts/pack.scm
@@ -1116,9 +1116,9 @@ Create a bundle of PACKAGE.\n"))
(let* ((transform (options->transformation opts))
(packages (map (match-lambda
(((? package? package) output)
- (list (transform store package) output))
+ (list (transform package) output))
((? package? package)
- (list (transform store package) "out")))
+ (list (transform package) "out")))
(reverse
(filter-map maybe-package-argument opts))))
(manifests (filter-map (match-lambda
diff --git a/guix/scripts/package.scm b/guix/scripts/package.scm
index ba62d98682..5599e26f5d 100644
--- a/guix/scripts/package.scm
+++ b/guix/scripts/package.scm
@@ -223,7 +223,7 @@ non-zero relevance score."
(($ <manifest-entry> name version output (? string? path))
(match (find-best-packages-by-name name #f)
((pkg . rest)
- (let* ((pkg (transform store pkg))
+ (let* ((pkg (transform pkg))
(candidate-version (package-version pkg)))
(match (package-superseded pkg)
((? package? new)
@@ -871,7 +871,7 @@ processed, #f otherwise."
(define transform (options->transformation opts))
(define (transform-entry entry)
- (let ((item (transform store (manifest-entry-item entry))))
+ (let ((item (transform (manifest-entry-item entry))))
(manifest-entry-with-transformations
(manifest-entry
(inherit entry)
diff --git a/tests/scripts-build.scm b/tests/scripts-build.scm
index 3a49759567..d56e02b452 100644
--- a/tests/scripts-build.scm
+++ b/tests/scripts-build.scm
@@ -19,6 +19,7 @@
(define-module (test-scripts-build)
#:use-module (guix tests)
#:use-module (guix store)
+ #:use-module ((guix gexp) #:select (lower-object))
#:use-module (guix derivations)
#:use-module (guix packages)
#:use-module (guix git-download)
@@ -42,8 +43,7 @@
(test-assert "options->transformation, no transformations"
(let ((p (dummy-package "foo"))
(t (options->transformation '())))
- (with-store store
- (eq? (t store p) p))))
+ (eq? (t p) p)))
(test-assert "options->transformation, with-source"
;; Our pseudo-package is called 'guix.scm' so the 'guix.scm' source should
@@ -52,9 +52,11 @@
(s (search-path %load-path "guix.scm"))
(t (options->transformation `((with-source . ,s)))))
(with-store store
- (let ((new (t store p)))
+ (let* ((new (t p))
+ (source (run-with-store store
+ (lower-object (package-source new)))))
(and (not (eq? new p))
- (string=? (package-source new)
+ (string=? source
(add-to-store store "guix.scm" #t
"sha256" s)))))))
@@ -64,12 +66,9 @@
(let* ((p (dummy-package "guix.scm" (replacement coreutils)))
(s (search-path %load-path "guix.scm"))
(t (options->transformation `((with-source . ,s)))))
- (with-store store
- (let ((new (t store p)))
- (and (not (eq? new p))
- (string=? (package-source new)
- (add-to-store store "guix.scm" #t "sha256" s))
- (not (package-replacement new)))))))
+ (let ((new (t p)))
+ (and (not (eq? new p))
+ (not (package-replacement new))))))
(test-assert "options->transformation, with-source, with version"
;; Our pseudo-package is called 'guix.scm' so the 'guix.scm-2.0' source
@@ -82,11 +81,13 @@
(t (options->transformation `((with-source . ,f)))))
(copy-file s f)
(with-store store
- (let ((new (t store p)))
+ (let* ((new (t p))
+ (source (run-with-store store
+ (lower-object (package-source new)))))
(and (not (eq? new p))
(string=? (package-name new) (package-name p))
(string=? (package-version new) "42.0")
- (string=? (package-source new)
+ (string=? source
(add-to-store store (basename f) #t
"sha256" f))))))))))
@@ -95,13 +96,12 @@
(let* ((p (dummy-package "foobar"))
(s (search-path %load-path "guix.scm"))
(t (options->transformation `((with-source . ,s)))))
- (with-store store
- (let* ((port (open-output-string))
- (new (parameterize ((guix-warning-port port))
- (t store p))))
- (and (eq? new p)
- (string-contains (get-output-string port)
- "had no effect"))))))
+ (let* ((port (open-output-string))
+ (new (parameterize ((guix-warning-port port))
+ (t p))))
+ (and (eq? new p)
+ (string-contains (get-output-string port)
+ "had no effect")))))
(test-assert "options->transformation, with-source, PKG=URI"
(let* ((p (dummy-package "foo"))
@@ -109,12 +109,14 @@
(f (string-append "foo=" s))
(t (options->transformation `((with-source . ,f)))))
(with-store store
- (let ((new (t store p)))
+ (let* ((new (t p))
+ (source (run-with-store store
+ (lower-object (package-source new)))))
(and (not (eq? new p))
(string=? (package-name new) (package-name p))
(string=? (package-version new)
(package-version p))
- (string=? (package-source new)
+ (string=? source
(add-to-store store (basename s) #t
"sha256" s)))))))
@@ -124,11 +126,13 @@
(f (string-append "foo@42.0=" s))
(t (options->transformation `((with-source . ,f)))))
(with-store store
- (let ((new (t store p)))
+ (let* ((new (t p))
+ (source (run-with-store store
+ (lower-object (package-source new)))))
(and (not (eq? new p))
(string=? (package-name new) (package-name p))
(string=? (package-version new) "42.0")
- (string=? (package-source new)
+ (string=? source
(add-to-store store (basename s) #t
"sha256" s)))))))
@@ -140,20 +144,19 @@
(native-inputs `(("x" ,grep)))))))))
(t (options->transformation '((with-input . "coreutils=busybox")
(with-input . "grep=findutils")))))
- (with-store store
- (let ((new (t store p)))
- (and (not (eq? new p))
- (match (package-inputs new)
- ((("foo" dep1) ("bar" dep2) ("baz" dep3))
- (and (string=? (package-full-name dep1)
- (package-full-name busybox))
- (string=? (package-full-name dep2)
- (package-full-name findutils))
- (string=? (package-name dep3) "chbouib")
- (match (package-native-inputs dep3)
- ((("x" dep))
- (string=? (package-full-name dep)
- (package-full-name findutils))))))))))))
+ (let ((new (t p)))
+ (and (not (eq? new p))
+ (match (package-inputs new)
+ ((("foo" dep1) ("bar" dep2) ("baz" dep3))
+ (and (string=? (package-full-name dep1)
+ (package-full-name busybox))
+ (string=? (package-full-name dep2)
+ (package-full-name findutils))
+ (string=? (package-name dep3) "chbouib")
+ (match (package-native-inputs dep3)
+ ((("x" dep))
+ (string=? (package-full-name dep)
+ (package-full-name findutils)))))))))))
(test-assert "options->transformation, with-graft"
(let* ((p (dummy-package "guix.scm"
@@ -161,23 +164,22 @@
("bar" ,(dummy-package "chbouib"
(native-inputs `(("x" ,grep)))))))))
(t (options->transformation '((with-graft . "grep=findutils")))))
- (with-store store
- (let ((new (t store p)))
- (and (not (eq? new p))
- (match (package-inputs new)
- ((("foo" dep1) ("bar" dep2))
- (and (string=? (package-full-name dep1)
- (package-full-name grep))
- (string=? (package-full-name (package-replacement dep1))
- (package-full-name findutils))
- (string=? (package-name dep2) "chbouib")
- (match (package-native-inputs dep2)
- ((("x" dep))
- (with-store store
- (string=? (derivation-file-name
- (package-derivation store findutils))
- (derivation-file-name
- (package-derivation store dep))))))))))))))
+ (let ((new (t p)))
+ (and (not (eq? new p))
+ (match (package-inputs new)
+ ((("foo" dep1) ("bar" dep2))
+ (and (string=? (package-full-name dep1)
+ (package-full-name grep))
+ (string=? (package-full-name (package-replacement dep1))
+ (package-full-name findutils))
+ (string=? (package-name dep2) "chbouib")
+ (match (package-native-inputs dep2)
+ ((("x" dep))
+ (with-store store
+ (string=? (derivation-file-name
+ (package-derivation store findutils))
+ (derivation-file-name
+ (package-derivation store dep)))))))))))))
(test-equal "options->transformation, with-branch"
(git-checkout (url "https://example.org")
@@ -193,15 +195,14 @@
(commit "cabba9e")))
(sha256 #f)))))))))
(t (options->transformation '((with-branch . "chbouib=devel")))))
- (with-store store
- (let ((new (t store p)))
- (and (not (eq? new p))
- (match (package-inputs new)
- ((("foo" dep1) ("bar" dep2))
- (and (string=? (package-full-name dep1)
- (package-full-name grep))
- (string=? (package-name dep2) "chbouib")
- (package-source dep2)))))))))
+ (let ((new (t p)))
+ (and (not (eq? new p))
+ (match (package-inputs new)
+ ((("foo" dep1) ("bar" dep2))
+ (and (string=? (package-full-name dep1)
+ (package-full-name grep))
+ (string=? (package-name dep2) "chbouib")
+ (package-source dep2))))))))
(test-equal "options->transformation, with-commit"
(git-checkout (url "https://example.org")
@@ -217,15 +218,14 @@
(commit "cabba9e")))
(sha256 #f)))))))))
(t (options->transformation '((with-commit . "chbouib=abcdef")))))
- (with-store store
- (let ((new (t store p)))
-
This message was truncated. Download the full message here.
L
L
Ludovic Courtès wrote on 30 Oct 2020 00:09
[PATCH 5/6] transformations: Raise '&formatted-message' exceptions instead of 'leave'.
(address . 44321@debbugs.gnu.org)(name . Ludovic Courtès)(address . ludo@gnu.org)
20201029231000.14568-5-ludo@gnu.org
* guix/transformations.scm (evaluate-replacement-specs)
(package-git-url, evaluate-git-replacement-specs)
(transform-package-source-git-url)
(transform-package-toolchain): Use 'raise' and 'formatted-message'
instead of 'leave'.
---
guix/transformations.scm | 26 ++++++++++++++++++--------
1 file changed, 18 insertions(+), 8 deletions(-)

Toggle diff (74 lines)
diff --git a/guix/transformations.scm b/guix/transformations.scm
index 126a9a69d3..30142dd059 100644
--- a/guix/transformations.scm
+++ b/guix/transformations.scm
@@ -38,6 +38,7 @@
#:use-module (srfi srfi-9)
#:use-module (srfi srfi-11)
#:use-module (srfi srfi-26)
+ #:use-module (srfi srfi-34)
#:use-module (srfi srfi-37)
#:use-module (ice-9 match)
#:export (options->transformation
@@ -169,7 +170,9 @@ package it refers to could not be found."
(lambda (old)
(proc old new)))))
(x
- (leave (G_ "invalid replacement specification: ~s~%") spec))))
+ (raise (formatted-message
+ (G_ "invalid replacement specification: ~s")
+ spec)))))
specs))
(define (transform-package-inputs replacement-specs)
@@ -216,8 +219,9 @@ the source of PACKAGE is not fetched from a Git repository."
((git-checkout? source)
(git-checkout-url source))
(else
- (leave (G_ "the source of ~a is not a Git reference~%")
- (package-full-name package))))))
+ (raise
+ (formatted-message (G_ "the source of ~a is not a Git reference")
+ (package-full-name package)))))))
(define (evaluate-git-replacement-specs specs proc)
"Parse SPECS, a list of strings like \"guile=stable-2.2\", and return a list
@@ -234,7 +238,9 @@ syntax, or if a package it refers to could not be found."
(cons spec replace))
(_
- (leave (G_ "invalid replacement specification: ~s~%") spec))))
+ (raise
+ (formatted-message (G_ "invalid replacement specification: ~s")
+ spec)))))
specs))
(define (transform-package-source-branch replacement-specs)
@@ -304,8 +310,10 @@ a checkout of the Git repository at the given URL."
(source (git-checkout (url url)
(recursive? #t)))))))
(_
- (leave (G_ "~a: invalid Git URL replacement specification~%")
- spec))))
+ (raise
+ (formatted-message
+ (G_ "~a: invalid Git URL replacement specification")
+ spec)))))
replacement-specs))
(define rewrite
@@ -380,8 +388,10 @@ the equal sign."
((spec (= split-on-commas toolchain))
(cons spec (map specification->input toolchain)))
(_
- (leave (G_ "~a: invalid toolchain replacement specification~%")
- spec))))
+ (raise
+ (formatted-message
+ (G_ "~a: invalid toolchain replacement specification")
+ spec)))))
replacement-specs))
(lambda (obj)
--
2.28.0
L
L
Ludovic Courtès wrote on 30 Oct 2020 00:09
[PATCH 4/6] guix build: Move transformation options to (guix transformations).
(address . 44321@debbugs.gnu.org)(name . Ludovic Courtès)(address . ludo@gnu.org)
20201029231000.14568-4-ludo@gnu.org
* guix/transformations.scm: New file.
* tests/scripts-build.scm: Rename to...
* tests/transformations.scm: ... this.
* Makefile.am (MODULES): Add 'guix/transformations.scm'.
(SCM_TESTS): Adjust to rename.
* guix/scripts/build.scm (numeric-extension?)
(tarball-base-name, <downloaded-file>, download-to-store*)
(compile-downloaded-file, package-with-source)
(transform-package-source, evaluate-replacement-specs)
(transform-package-inputs, transform-package-inputs/graft)
(%not-equal, package-git-url, evaluate-git-replacement-specs)
(transform-package-source-branch, transform-package-source-commit)
(transform-package-source-git-url, package-dependents/spec)
(package-toolchain-rewriting, transform-package-toolchain)
(transform-package-with-debug-info, transform-package-tests)
(%transformations, transformation-procedure, %transformation-options)
(show-transformation-options-help, options->transformation)
(package-transformations): Move to (guix transformations).
* guix/scripts/environment.scm: Adjust accordingly.
* guix/scripts/graph.scm: Likewise.
* guix/scripts/install.scm: Likewise.
* guix/scripts/pack.scm: Likewise.
* guix/scripts/package.scm: Likewise.
* guix/scripts/upgrade.scm: Likewise.
---
Makefile.am | 3 +-
guix/scripts/build.scm | 553 +---------------
guix/scripts/environment.scm | 1 +
guix/scripts/graph.scm | 5 +-
guix/scripts/install.scm | 1 +
guix/scripts/pack.scm | 1 +
guix/scripts/package.scm | 1 +
guix/scripts/upgrade.scm | 1 +
guix/transformations.scm | 610 ++++++++++++++++++
...{scripts-build.scm => transformations.scm} | 6 +-
10 files changed, 624 insertions(+), 558 deletions(-)
create mode 100644 guix/transformations.scm
rename tests/{scripts-build.scm => transformations.scm} (99%)

Toggle diff (465 lines)
diff --git a/Makefile.am b/Makefile.am
index f3eb681a2b..e7053ee4f4 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -105,6 +105,7 @@ MODULES = \
guix/derivations.scm \
guix/grafts.scm \
guix/repl.scm \
+ guix/transformations.scm \
guix/inferior.scm \
guix/describe.scm \
guix/quirks.scm \
@@ -456,7 +457,6 @@ SCM_TESTS = \
tests/pypi.scm \
tests/records.scm \
tests/scripts.scm \
- tests/scripts-build.scm \
tests/search-paths.scm \
tests/services.scm \
tests/services/linux.scm \
@@ -473,6 +473,7 @@ SCM_TESTS = \
tests/syscalls.scm \
tests/system.scm \
tests/texlive.scm \
+ tests/transformations.scm \
tests/ui.scm \
tests/union.scm \
tests/upstream.scm \
diff --git a/guix/scripts/build.scm b/guix/scripts/build.scm
index 4b86047587..e9de97c881 100644
--- a/guix/scripts/build.scm
+++ b/guix/scripts/build.scm
@@ -31,11 +31,6 @@
#:use-module (guix utils)
- ;; Use the procedure that destructures "NAME-VERSION" forms.
- #:use-module ((guix build utils)
- #:select ((package-name->name+version
- . hyphen-package-name->name+version)))
-
#:use-module (guix monads)
#:use-module (guix gexp)
#:use-module (guix profiles)
@@ -52,21 +47,15 @@
#:use-module (srfi srfi-35)
#:use-module (srfi srfi-37)
#:use-module (gnu packages)
- #:autoload (guix download) (download-to-store)
- #:autoload (guix git-download) (git-reference? git-reference-url)
- #:autoload (guix git) (git-checkout git-checkout? git-checkout-url)
#:use-module ((guix status) #:select (with-status-verbosity))
#:use-module ((guix progress) #:select (current-terminal-columns))
#:use-module ((guix build syscalls) #:select (terminal-columns))
+ #:use-module (guix transformations)
#:export (%standard-build-options
set-build-options-from-command-line
set-build-options-from-command-line*
show-build-options-help
- %transformation-options
- options->transformation
- manifest-entry-with-transformations
-
guix-build
register-root
register-root*))
@@ -151,546 +140,6 @@ found. Return #f if no build log was found."
(define register-root*
(store-lift register-root))
-(define (numeric-extension? file-name)
- "Return true if FILE-NAME ends with digits."
- (string-every char-set:hex-digit (file-extension file-name)))
-
-(define (tarball-base-name file-name)
- "Return the \"base\" of FILE-NAME, removing '.tar.gz' or similar
-extensions."
- ;; TODO: Factorize.
- (cond ((not (file-extension file-name))
- file-name)
- ((numeric-extension? file-name)
- file-name)
- ((string=? (file-extension file-name) "tar")
- (file-sans-extension file-name))
- ((file-extension file-name)
- =>
- (match-lambda
- ("scm" file-name)
- (else (tarball-base-name (file-sans-extension file-name)))))
- (else
- file-name)))
-
-
-;; Files to be downloaded.
-(define-record-type <downloaded-file>
- (downloaded-file uri recursive?)
- downloaded-file?
- (uri downloaded-file-uri)
- (recursive? downloaded-file-recursive?))
-
-(define download-to-store*
- (store-lift download-to-store))
-
-(define-gexp-compiler (compile-downloaded-file (file <downloaded-file>)
- system target)
- "Download FILE and return the result as a store item."
- (match file
- (($ <downloaded-file> uri recursive?)
- (download-to-store* uri #:recursive? recursive?))))
-
-(define* (package-with-source p uri #:optional version)
- "Return a package based on P but with its source taken from URI. Extract
-the new package's version number from URI."
- (let ((base (tarball-base-name (basename uri))))
- (let-values (((_ version*)
- (hyphen-package-name->name+version base)))
- (package (inherit p)
- (version (or version version*
- (package-version p)))
-
- ;; Use #:recursive? #t to allow for directories.
- (source (downloaded-file uri #t))))))
-
-
-;;;
-;;; Transformations.
-;;;
-
-(define (transform-package-source sources)
- "Return a transformation procedure that replaces package sources with the
-matching URIs given in SOURCES."
- (define new-sources
- (map (lambda (uri)
- (match (string-index uri #\=)
- (#f
- ;; Determine the package name and version from URI.
- (call-with-values
- (lambda ()
- (hyphen-package-name->name+version
- (tarball-base-name (basename uri))))
- (lambda (name version)
- (list name version uri))))
- (index
- ;; What's before INDEX is a "PKG@VER" or "PKG" spec.
- (call-with-values
- (lambda ()
- (package-name->name+version (string-take uri index)))
- (lambda (name version)
- (list name version
- (string-drop uri (+ 1 index))))))))
- sources))
-
- (lambda (obj)
- (let loop ((sources new-sources)
- (result '()))
- (match obj
- ((? package? p)
- (match (assoc-ref sources (package-name p))
- ((version source)
- (package-with-source p source version))
- (#f
- p)))
- (_
- obj)))))
-
-(define (evaluate-replacement-specs specs proc)
- "Parse SPECS, a list of strings like \"guile=guile@2.1\" and return a list
-of package spec/procedure pairs as expected by 'package-input-rewriting/spec'.
-PROC is called with the package to be replaced and its replacement according
-to SPECS. Raise an error if an element of SPECS uses invalid syntax, or if a
-package it refers to could not be found."
- (define not-equal
- (char-set-complement (char-set #\=)))
-
- (map (lambda (spec)
- (match (string-tokenize spec not-equal)
- ((spec new)
- (cons spec
- (let ((new (specification->package new)))
- (lambda (old)
- (proc old new)))))
- (x
- (leave (G_ "invalid replacement specification: ~s~%") spec))))
- specs))
-
-(define (transform-package-inputs replacement-specs)
- "Return a procedure that, when passed a package, replaces its direct
-dependencies according to REPLACEMENT-SPECS. REPLACEMENT-SPECS is a list of
-strings like \"guile=guile@2.1\" meaning that, any dependency on a package
-called \"guile\" must be replaced with a dependency on a version 2.1 of
-\"guile\"."
- (let* ((replacements (evaluate-replacement-specs replacement-specs
- (lambda (old new)
- new)))
- (rewrite (package-input-rewriting/spec replacements)))
- (lambda (obj)
- (if (package? obj)
- (rewrite obj)
- obj))))
-
-(define (transform-package-inputs/graft replacement-specs)
- "Return a procedure that, when passed a package, replaces its direct
-dependencies according to REPLACEMENT-SPECS. REPLACEMENT-SPECS is a list of
-strings like \"gnutls=gnutls@3.5.4\" meaning that packages are built using the
-current 'gnutls' package, after which version 3.5.4 is grafted onto them."
- (define (set-replacement old new)
- (package (inherit old) (replacement new)))
-
- (let* ((replacements (evaluate-replacement-specs replacement-specs
- set-replacement))
- (rewrite (package-input-rewriting/spec replacements)))
- (lambda (obj)
- (if (package? obj)
- (rewrite obj)
- obj))))
-
-(define %not-equal
- (char-set-complement (char-set #\=)))
-
-(define (package-git-url package)
- "Return the URL of the Git repository for package, or raise an error if
-the source of PACKAGE is not fetched from a Git repository."
- (let ((source (package-source package)))
- (cond ((and (origin? source)
- (git-reference? (origin-uri source)))
- (git-reference-url (origin-uri source)))
- ((git-checkout? source)
- (git-checkout-url source))
- (else
- (leave (G_ "the source of ~a is not a Git reference~%")
- (package-full-name package))))))
-
-(define (evaluate-git-replacement-specs specs proc)
- "Parse SPECS, a list of strings like \"guile=stable-2.2\", and return a list
-of package pairs, where (PROC PACKAGE URL BRANCH-OR-COMMIT) returns the
-replacement package. Raise an error if an element of SPECS uses invalid
-syntax, or if a package it refers to could not be found."
- (map (lambda (spec)
- (match (string-tokenize spec %not-equal)
- ((spec branch-or-commit)
- (define (replace old)
- (let* ((source (package-source old))
- (url (package-git-url old)))
- (proc old url branch-or-commit)))
-
- (cons spec replace))
- (x
- (leave (G_ "invalid replacement specification: ~s~%") spec))))
- specs))
-
-(define (transform-package-source-branch replacement-specs)
- "Return a procedure that, when passed a package, replaces its direct
-dependencies according to REPLACEMENT-SPECS. REPLACEMENT-SPECS is a list of
-strings like \"guile-next=stable-3.0\" meaning that packages are built using
-'guile-next' from the latest commit on its 'stable-3.0' branch."
- (define (replace old url branch)
- (package
- (inherit old)
- (version (string-append "git." (string-map (match-lambda
- (#\/ #\-)
- (chr chr))
- branch)))
- (source (git-checkout (url url) (branch branch)
- (recursive? #t)))))
-
- (let* ((replacements (evaluate-git-replacement-specs replacement-specs
- replace))
- (rewrite (package-input-rewriting/spec replacements)))
- (lambda (obj)
- (if (package? obj)
- (rewrite obj)
- obj))))
-
-(define (transform-package-source-commit replacement-specs)
- "Return a procedure that, when passed a package, replaces its direct
-dependencies according to REPLACEMENT-SPECS. REPLACEMENT-SPECS is a list of
-strings like \"guile-next=cabba9e\" meaning that packages are built using
-'guile-next' from commit 'cabba9e'."
- (define (replace old url commit)
- (package
- (inherit old)
- (version (if (and (> (string-length commit) 1)
- (string-prefix? "v" commit)
- (char-set-contains? char-set:digit
- (string-ref commit 1)))
- (string-drop commit 1) ;looks like a tag like "v1.0"
- (string-append "git."
- (if (< (string-length commit) 7)
- commit
- (string-take commit 7)))))
- (source (git-checkout (url url) (commit commit)
- (recursive? #t)))))
-
- (let* ((replacements (evaluate-git-replacement-specs replacement-specs
- replace))
- (rewrite (package-input-rewriting/spec replacements)))
- (lambda (obj)
- (if (package? obj)
- (rewrite obj)
- obj))))
-
-(define (transform-package-source-git-url replacement-specs)
- "Return a procedure that, when passed a package, replaces its dependencies
-according to REPLACEMENT-SPECS. REPLACEMENT-SPECS is a list of strings like
-\"guile-json=https://gitthing.com/…\" meaning that packages are built using
-a checkout of the Git repository at the given URL."
- (define replacements
- (map (lambda (spec)
- (match (string-tokenize spec %not-equal)
- ((spec url)
- (cons spec
- (lambda (old)
- (package
- (inherit old)
- (source (git-checkout (url url)
- (recursive? #t)))))))
- (_
- (leave (G_ "~a: invalid Git URL replacement specification~%")
- spec))))
- replacement-specs))
-
- (define rewrite
- (package-input-rewriting/spec replacements))
-
- (lambda (obj)
- (if (package? obj)
- (rewrite obj)
- obj)))
-
-(define (package-dependents/spec top bottom)
- "Return the list of dependents of BOTTOM, a spec string, that are also
-dependencies of TOP, a package."
- (define-values (name version)
- (package-name->name+version bottom))
-
- (define dependent?
- (mlambda (p)
- (and (package? p)
- (or (and (string=? name (package-name p))
- (or (not version)
- (version-prefix? version (package-version p))))
- (match (bag-direct-inputs (package->bag p))
- (((labels dependencies . _) ...)
- (any dependent? dependencies)))))))
-
- (filter dependent? (package-closure (list top))))
-
-(define (package-toolchain-rewriting p bottom toolchain)
- "Return a procedure that, when passed a package that's either BOTTOM or one
-of its dependents up to P so, changes it so it is built with TOOLCHAIN.
-TOOLCHAIN must be an input list."
- (define rewriting-property
- (gensym " package-toolchain-rewriting"))
-
- (match (package-dependents/spec p bottom)
- (() ;P does not depend on BOTTOM
- identity)
- (set
- ;; SET is the list of packages "between" P and BOTTOM (included) whose
- ;; toolchain needs to be changed.
- (package-mapping (lambda (p)
- (if (or (assq rewriting-property
- (package-properties p))
- (not (memq p set)))
- p
- (let ((p (package-with-c-toolchain p toolchain)))
- (package/inherit p
- (properties `((,rewriting-property . #t)
- ,@(package-properties p)))))))
- (lambda (p)
- (or (assq rewriting-property (package-properties p))
- (not (memq p set))))
- #:deep? #t))))
-
-(define (transform-package-toolchain replacement-specs)
- "Return a procedure that, when passed a package, changes its toolchain or
-that of its dependencies according to REPLACEMENT-SPECS. REPLACEMENT-SPECS is
-a list of strings like \"fftw=gcc-toolchain@10\" meaning that the package to
-the left of the equal sign must be built with the toolchain to the right of
-the equal sign."
- (define split-on-commas
- (cute string-tokenize <> (char-set-complement (char-set #\,))))
-
- (define (specification->input spec)
- (let ((package (specification->package spec)))
- (list (package-name package) package)))
-
- (define replacements
- (map (lambda (spec)
- (match (string-tokenize spec %not-equal)
- ((spec (= split-on-commas toolchain))
- (cons spec (map specification->input toolchain)))
- (_
- (leave (G_ "~a: invalid toolchain replacement specification~%")
- spec))))
- replacement-specs))
-
- (lambda (obj)
- (if (package? obj)
- (or (any (match-lambda
- ((bottom . toolchain)
- ((package-toolchain-rewriting obj bottom toolchain) obj)))
- replacements)
- obj)
- obj)))
-
-(define (transform-package-with-debug-info specs)
- "Return a procedure that, when passed a package, set its 'replacement' field
-to the same package but with #:strip-binaries? #f in its 'arguments' field."
- (define (non-stripped p)
- (package
- (inherit p)
- (arguments
- (substitute-keyword-arguments (package-arguments p)
- ((#:strip-binaries? _ #f) #f)))))
-
- (define (package-with-debug-info p)
- (if (member "debug" (package-outputs p))
- p
- (let loop ((p p))
- (match (package-replacement p)
- (#f
- (package
- (inherit p)
- (replacement (non-stripped p))))
- (next
- (package
- (inherit p)
- (replacement (loop next))))))))
-
- (define rewrite
- (package-input-rewriting/spec (map (lambda (spec)
- (cons spec package-with-debug-info))
- specs)))
-
- (lambda (obj)
- (if (package? obj)
- (rewrite obj)
- obj)))
-
-(define (transform-package-tests specs)
- "Return a procedure that, when passed a package, sets #:tests? #f in its
-'arguments' field."
- (define (package-without-tests p)
- (package/inherit p
- (arguments
- (substitute-keyword-arguments (package-arguments p)
- ((#:tests? _ #f) #f)))))
-
- (define rewrite
- (package-input-rewriting/spec (map (lambda (spec)
- (cons spec package-without-tests))
- specs)))
-
- (lambda (obj)
- (if (package? obj)
- (rewrite obj)
- obj)))
-
-(define %transformations
- ;; Transformations that can be applied to things to build. The car is the
- ;; key used in the option alist, and the cdr is the transformation
- ;; procedure; it is called with two arguments: the store, and a list of
- ;; things to build.
This message was truncated. Download the full message here.
L
L
Ludovic Courtès wrote on 30 Oct 2020 00:10
[PATCH 6/6] doc: Add "Defining Package Variants" section.
(address . 44321@debbugs.gnu.org)(name . Ludovic Courtès)(address . ludo@gnu.org)
20201029231000.14568-6-ludo@gnu.org
* doc/guix.texi (Defining Packages): Move documentation of
'package-input-rewriting' & co. to...
(Defining Package Variants): ... here. New node. Also document
'inherit' and 'options->transformation'.
---
doc/guix.texi | 278 ++++++++++++++++++++++++++++++++++++--------------
1 file changed, 204 insertions(+), 74 deletions(-)

Toggle diff (326 lines)
diff --git a/doc/guix.texi b/doc/guix.texi
index 22bddf10e3..831ee3f881 100644
--- a/doc/guix.texi
+++ b/doc/guix.texi
@@ -253,6 +253,7 @@ Programming Interface
* Package Modules:: Packages from the programmer's viewpoint.
* Defining Packages:: Defining new packages.
+* Defining Package Variants:: Customizing packages.
* Build Systems:: Specifying how packages are built.
* Build Phases:: Phases of the build process of a package.
* Build Utilities:: Helpers for your package definitions and more.
@@ -260,7 +261,7 @@ Programming Interface
* Derivations:: Low-level interface to package derivations.
* The Store Monad:: Purely functional interface to the store.
* G-Expressions:: Manipulating build expressions.
-* Invoking guix repl:: Programming Guix in Guile.
+* Invoking guix repl:: Programming Guix in Guile
Defining Packages
@@ -6204,6 +6205,7 @@ package definitions.
@menu
* Package Modules:: Packages from the programmer's viewpoint.
* Defining Packages:: Defining new packages.
+* Defining Package Variants:: Customizing packages.
* Build Systems:: Specifying how packages are built.
* Build Phases:: Phases of the build process of a package.
* Build Utilities:: Helpers for your package definitions and more.
@@ -6473,79 +6475,8 @@ and operating system, such as @code{"aarch64-linux-gnu"}
(@pxref{Specifying Target Triplets,,, autoconf, Autoconf}).
@end deffn
-@cindex package transformations
-@cindex input rewriting
-@cindex dependency tree rewriting
-Packages can be manipulated in arbitrary ways. An example of a useful
-transformation is @dfn{input rewriting}, whereby the dependency tree of
-a package is rewritten by replacing specific inputs by others:
-
-@deffn {Scheme Procedure} package-input-rewriting @var{replacements} @
- [@var{rewrite-name}] [#:deep? #t]
-Return a procedure that, when passed a package, replaces its direct and
-indirect dependencies, including implicit inputs when @var{deep?} is
-true, according to @var{replacements}. @var{replacements} is a list of
-package pairs; the first element of each pair is the package to replace,
-and the second one is the replacement.
-
-Optionally, @var{rewrite-name} is a one-argument procedure that takes
-the name of a package and returns its new name after rewrite.
-@end deffn
-
-@noindent
-Consider this example:
-
-@lisp
-(define libressl-instead-of-openssl
- ;; This is a procedure to replace OPENSSL by LIBRESSL,
- ;; recursively.
- (package-input-rewriting `((,openssl . ,libressl))))
-
-(define git-with-libressl
- (libressl-instead-of-openssl git))
-@end lisp
-
-@noindent
-Here we first define a rewriting procedure that replaces @var{openssl}
-with @var{libressl}. Then we use it to define a @dfn{variant} of the
-@var{git} package that uses @var{libressl} instead of @var{openssl}.
-This is exactly what the @option{--with-input} command-line option does
-(@pxref{Package Transformation Options, @option{--with-input}}).
-
-The following variant of @code{package-input-rewriting} can match packages to
-be replaced by name rather than by identity.
-
-@deffn {Scheme Procedure} package-input-rewriting/spec @var{replacements} [#:deep? #t]
-Return a procedure that, given a package, applies the given
-@var{replacements} to all the package graph, including implicit inputs
-unless @var{deep?} is false. @var{replacements} is a list of
-spec/procedures pair; each spec is a package specification such as
-@code{"gcc"} or @code{"guile@@2"}, and each procedure takes a matching
-package and returns a replacement for that package.
-@end deffn
-
-The example above could be rewritten this way:
-
-@lisp
-(define libressl-instead-of-openssl
- ;; Replace all the packages called "openssl" with LibreSSL.
- (package-input-rewriting/spec `(("openssl" . ,(const libressl)))))
-@end lisp
-
-The key difference here is that, this time, packages are matched by spec and
-not by identity. In other words, any package in the graph that is called
-@code{openssl} will be replaced.
-
-A more generic procedure to rewrite a package dependency graph is
-@code{package-mapping}: it supports arbitrary changes to nodes in the
-graph.
-
-@deffn {Scheme Procedure} package-mapping @var{proc} [@var{cut?}] [#:deep? #f]
-Return a procedure that, given a package, applies @var{proc} to all the packages
-depended on and returns the resulting package. The procedure stops recursion
-when @var{cut?} returns true for a given package. When @var{deep?} is true, @var{proc} is
-applied to implicit inputs as well.
-@end deffn
+Once you have package definitions, you can easily define @emph{variants}
+of those packages. @xref{Defining Package Variants}, for more on that.
@menu
* package Reference:: The package data type.
@@ -6903,6 +6834,200 @@ commit:
@end lisp
@end deftp
+@node Defining Package Variants
+@section Defining Package Variants
+
+@cindex customizing packages
+@cindex variants, of packages
+One of the nice things with Guix is that, given a package definition,
+you can easily @emph{derive} variants of that package---for a different
+upstream version, with different dependencies, different compilation
+options, and so on. Some of these custom packages can be defined
+straight from the command line (@pxref{Package Transformation Options}).
+This section describes how to define package variants in code. This can
+be useful in ``manifests'' (@pxref{profile-manifest,
+@option{--manifest}}) and in your own package collection
+(@pxref{Creating a Channel}), among others!
+
+@cindex inherit, for package definitions
+As discussed earlier, packages are first-class objects in the Scheme
+language. The @code{(guix packages)} module provides the @code{package}
+construct to define new package objects (@pxref{package Reference}).
+The easiest way to define a package variant is using the @code{inherit}
+keyword together with @code{package}. This allows you to inherit from a
+package definition while overriding the fields you want.
+
+For example, given the @code{hello} variable, which contains a
+definition for the current version of GNU@tie{}Hello, here's how you
+would define a variant for version 2.2 (released in 2006, it's
+vintage!):
+
+@lisp
+(use-modules (gnu packages base)) ;for 'hello'
+
+(define hello-2.2
+ (package
+ (inherit hello)
+ (version "2.2")
+ (source (origin
+ (method url-fetch)
+ (uri (string-append "mirror://gnu/hello/hello-" version
+ ".tar.gz"))
+ (sha256
+ (base32
+ "0lappv4slgb5spyqbh6yl5r013zv72yqg2pcl30mginf3wdqd8k9"))))))
+@end lisp
+
+The example above corresponds to what the @option{--with-source} package
+transformation option does. Essentially @code{hello-2.2} preserves all
+the fields of @code{hello}, except @code{version} and @code{source},
+which it overrides. Note that the original @code{hello} variable is
+still there, in the @code{(gnu packages base)} module, unchanged. When
+you define a custom package like this, you are really @emph{adding} a
+new package definition; the original one remains available.
+
+You can just as well define variants with a different set of
+dependencies than the original package. For example, the default
+@code{gdb} package depends on @code{guile}, but since that is an
+optional dependency, you can define a variant that removes that
+dependency like so:
+
+@lisp
+(use-modules (gnu packages gdb) ;for 'gdb'
+ (srfi srfi-1)) ;for 'alist-delete'
+
+(define gdb-sans-guile
+ (package
+ (inherit gdb)
+ (inputs (alist-delete "guile"
+ (package-inputs gdb)))))
+@end lisp
+
+@cindex package transformations
+These are pretty simple package variants. As a convenience, the
+@code{(guix transformations)} module provides a high-level interface
+that directly maps to package transformation options (@pxref{Package
+Transformation Options}):
+
+@deffn {Scheme Procedure} options->transformation @var{opts}
+Return a procedure that, when passed an object to build (package,
+derivation, etc.), applies the transformations specified by @var{opts} and returns
+the resulting objects. @var{opts} must be a list of symbol/string pairs such as:
+
+@example
+((with-branch . "guile-gcrypt=master")
+ (without-tests . "libgcrypt"))
+@end example
+
+Each symbol names a transformation and the corresponding string is an argument
+to that transformation.
+@end deffn
+
+For instance, a manifest equivalent to this command:
+
+@example
+guix build guix \
+ --with-branch=guile-gcrypt=master \
+ --with-debug-info=zlib
+@end example
+
+@noindent
+... would look like this:
+
+@lisp
+(use-modules (guix transformations))
+
+(define transform
+ ;; The package transformation procedure.
+ (options->transformation
+ '((with-branch . "guile-gcrypt=master")
+ (with-debug-info . "zlib"))))
+
+(packages->manifest
+ (list (transform (specification->package "guix"))))
+@end lisp
+
+@cindex input rewriting
+@cindex dependency graph rewriting
+The @code{options->transformation} procedure is convenient, but it's
+perhaps also not as flexible as you may like. How is it implemented?
+The astute reader probably noticed that most package transformation
+options go beyond the superficial changes shown in the first examples of
+this section: they involve @dfn{input rewriting}, whereby the dependency
+graph of a package is rewritten by replacing specific inputs by others.
+
+Dependency graph rewriting, for the purposes of swapping packages in the
+graph, is what the @code{package-input-rewriting} procedure in
+@code{(guix packages)} implements.
+
+@deffn {Scheme Procedure} package-input-rewriting @var{replacements} @
+ [@var{rewrite-name}] [#:deep? #t]
+Return a procedure that, when passed a package, replaces its direct and
+indirect dependencies, including implicit inputs when @var{deep?} is
+true, according to @var{replacements}. @var{replacements} is a list of
+package pairs; the first element of each pair is the package to replace,
+and the second one is the replacement.
+
+Optionally, @var{rewrite-name} is a one-argument procedure that takes
+the name of a package and returns its new name after rewrite.
+@end deffn
+
+@noindent
+Consider this example:
+
+@lisp
+(define libressl-instead-of-openssl
+ ;; This is a procedure to replace OPENSSL by LIBRESSL,
+ ;; recursively.
+ (package-input-rewriting `((,openssl . ,libressl))))
+
+(define git-with-libressl
+ (libressl-instead-of-openssl git))
+@end lisp
+
+@noindent
+Here we first define a rewriting procedure that replaces @var{openssl}
+with @var{libressl}. Then we use it to define a @dfn{variant} of the
+@var{git} package that uses @var{libressl} instead of @var{openssl}.
+This is exactly what the @option{--with-input} command-line option does
+(@pxref{Package Transformation Options, @option{--with-input}}).
+
+The following variant of @code{package-input-rewriting} can match packages to
+be replaced by name rather than by identity.
+
+@deffn {Scheme Procedure} package-input-rewriting/spec @var{replacements} [#:deep? #t]
+Return a procedure that, given a package, applies the given
+@var{replacements} to all the package graph, including implicit inputs
+unless @var{deep?} is false. @var{replacements} is a list of
+spec/procedures pair; each spec is a package specification such as
+@code{"gcc"} or @code{"guile@@2"}, and each procedure takes a matching
+package and returns a replacement for that package.
+@end deffn
+
+The example above could be rewritten this way:
+
+@lisp
+(define libressl-instead-of-openssl
+ ;; Replace all the packages called "openssl" with LibreSSL.
+ (package-input-rewriting/spec `(("openssl" . ,(const libressl)))))
+@end lisp
+
+The key difference here is that, this time, packages are matched by spec and
+not by identity. In other words, any package in the graph that is called
+@code{openssl} will be replaced.
+
+A more generic procedure to rewrite a package dependency graph is
+@code{package-mapping}: it supports arbitrary changes to nodes in the
+graph.
+
+@deffn {Scheme Procedure} package-mapping @var{proc} [@var{cut?}] [#:deep? #f]
+Return a procedure that, given a package, applies @var{proc} to all the packages
+depended on and returns the resulting package. The procedure stops recursion
+when @var{cut?} returns true for a given package. When @var{deep?} is true, @var{proc} is
+applied to implicit inputs as well.
+@end deffn
+
+
@node Build Systems
@section Build Systems
@@ -10155,6 +10280,11 @@ that does not respect a @code{#:tests? #f} setting. Therefore,
@end table
+Wondering how to achieve the same effect using Scheme code, for example
+in your manifest, or how to write your own package transformation?
+@xref{Defining Package Variants}, for an overview of the programming
+interfaces available.
+
@node Additional Build Options
@subsection Additional Build Options
--
2.28.0
Z
Z
zimoun wrote on 30 Oct 2020 11:59
Re: [bug#44321] [PATCH 5/6] transformations: Raise '&formatted-message' exceptions instead of 'leave'.
(name . Ludovic Courtès)(address . ludo@gnu.org)(address . 44321@debbugs.gnu.org)
878sbo6ku6.fsf@gmail.com
Hi,

On Fri, 30 Oct 2020 at 00:09, Ludovic Courtès <ludo@gnu.org> wrote:

Toggle quote (3 lines)
> (transform-package-toolchain): Use 'raise' and 'formatted-message'
> instead of 'leave'.

Naive question: what is the difference? Other said why? And so why not
replaces ’leave’ here and there by ’raise’+’formatted-message’?


All the best,
simon
Z
Z
zimoun wrote on 30 Oct 2020 12:20
Re: [bug#44321] [PATCH 6/6] doc: Add "Defining Package Variants" section.
(name . Ludovic Courtès)(address . ludo@gnu.org)(address . 44321@debbugs.gnu.org)
875z6s6jv1.fsf@gmail.com
Hi,

On Fri, 30 Oct 2020 at 00:10, Ludovic Courtès <ludo@gnu.org> wrote:

Toggle quote (3 lines)
> -* Invoking guix repl:: Programming Guix in Guile.
> +* Invoking guix repl:: Programming Guix in Guile

This change is already in commit 729d4ba025bc8556d00041f9af5b6609eeec9d80.


Toggle quote (17 lines)
> +You can just as well define variants with a different set of
> +dependencies than the original package. For example, the default
> +@code{gdb} package depends on @code{guile}, but since that is an
> +optional dependency, you can define a variant that removes that
> +dependency like so:
> +
> +@lisp
> +(use-modules (gnu packages gdb) ;for 'gdb'
> + (srfi srfi-1)) ;for 'alist-delete'
> +
> +(define gdb-sans-guile
> + (package
> + (inherit gdb)
> + (inputs (alist-delete "guile"
> + (package-inputs gdb)))))
> +@end lisp

Does it make sense to add a sentence explaining that the “guile” is the
name provided by the string in the ’inputs’ list of the package ’gdb’,
namely:

Toggle snippet (18 lines)
(inputs
`(("expat" ,expat)
("mpfr" ,mpfr)
("gmp" ,gmp)
("readline" ,readline)
("ncurses" ,ncurses)
("guile" ,guile-2.0)
("python-wrapper" ,python-wrapper)
("source-highlight" ,source-highlight)

;; Allow use of XML-formatted syscall information. This enables 'catch
;; syscall' and similar commands.
("libxml2" ,libxml2)

;; The Hurd needs -lshouldbeinlibc.
,@(if (hurd-target?) `(("hurd" ,hurd)) '())))

? Because it can be confusing. Especially when the ’rewriting’ works
on symbols instead.


Toggle quote (10 lines)
> +@deffn {Scheme Procedure} options->transformation @var{opts}
> +Return a procedure that, when passed an object to build (package,
> +derivation, etc.), applies the transformations specified by @var{opts} and returns
> +the resulting objects. @var{opts} must be a list of symbol/string pairs such as:
> +
> +@example
> +((with-branch . "guile-gcrypt=master")
> + (without-tests . "libgcrypt"))
> +@end example

Is it on purpose that here you use ’without-tests’ and then…

Toggle quote (28 lines)
> +Each symbol names a transformation and the corresponding string is an argument
> +to that transformation.
> +@end deffn
> +
> +For instance, a manifest equivalent to this command:
> +
> +@example
> +guix build guix \
> + --with-branch=guile-gcrypt=master \
> + --with-debug-info=zlib
> +@end example
> +
> +@noindent
> +... would look like this:
> +
> +@lisp
> +(use-modules (guix transformations))
> +
> +(define transform
> + ;; The package transformation procedure.
> + (options->transformation
> + '((with-branch . "guile-gcrypt=master")
> + (with-debug-info . "zlib"))))
> +
> +(packages->manifest
> + (list (transform (specification->package "guix"))))
> +@end lisp

…you use ’with-debug-info’ as example?


Toggle quote (6 lines)
> +@lisp
> +(define libressl-instead-of-openssl
> + ;; Replace all the packages called "openssl" with LibreSSL.
> + (package-input-rewriting/spec `(("openssl" . ,(const libressl)))))
> +@end lisp

It is already in the manual but why this ’const’?


BTW, cool! Nice features! :-)

All the best,
simon
M
M
Miguel Ángel Arruga Vivas wrote on 30 Oct 2020 23:27
Re: [bug#44321] [PATCH 3/6] guix build: 'options->transformation' no longer takes a 'store' parameter.
(name . Ludovic Courtès)(address . ludo@gnu.org)(address . 44321@debbugs.gnu.org)
87wnz74aem.fsf@gmail.com
Hi Ludo,

I just have one comment here:

Ludovic Courtès <ludo@gnu.org> writes:
Toggle quote (5 lines)
> ("options->transformation, with-source")
> ("options->transformation, with-source, replacement")
> ("options->transformation, with-source, with version")
> ("options->transformation, with-source, PKG=URI"): Use 'lower-object' to
> compute the store file name of the source.
[...]
Toggle quote (17 lines)
> @@ -64,12 +66,9 @@
> (let* ((p (dummy-package "guix.scm" (replacement coreutils)))
> (s (search-path %load-path "guix.scm"))
> (t (options->transformation `((with-source . ,s)))))
> - (with-store store
> - (let ((new (t store p)))
> - (and (not (eq? new p))
> - (string=? (package-source new)
> - (add-to-store store "guix.scm" #t "sha256" s))
> - (not (package-replacement new)))))))
> + (let ((new (t p)))
> + (and (not (eq? new p))
> + (not (package-replacement new))))))
>
> (test-assert "options->transformation, with-source, with version"
> ;; Our pseudo-package is called 'guix.scm' so the 'guix.scm-2.0' source

It's the only one that doesn't follow the same pattern as others, where
the change look quite similar: instead of (t store p) -> (t p) (source
(run-...)), also specified in the message.

If removing that comparison is intended, I think the commit message
should be changed. Otherwise it LGTM.

Happy hacking!
Miguel
-----BEGIN PGP SIGNATURE-----

iQGzBAEBCgAdFiEEiIeExBRZrMuD5+hMY0xuiXn6vsIFAl+ck1IACgkQY0xuiXn6
vsKo/gv/Xhu0sH5etKV3ctPxZA5HDvBkXkEBdHG8KTNcE+tcVvjhj5k7JbrJzeMw
UmFnUCGyX8G5jZ4tzvlHwLPpDZ8enumrRP+9y7nawyQmzBmeHEjtBymP8B7wecQk
c2PD5T0WPfjBWKGw1gOfMgvr/xU8yCNXk8hH1CRb/yHg9cypuQTMoiZ6EzcivW7v
Ixhos7B2BYAoHEg1Blj26AGC+BTOXlKJQMsbuCjcbYpek47AC3hQaB37jWEehCI+
LDZhxV3inWJjFoXXltFp8e1/67J3FDw3U9AJ9n7lopn51dUBvQhdeJe7TV0bNtGw
O2E/gS0wv07USoW3b2uslbizYny/Yo1/KFo4NJnNKW58T9ct4CT/tgT7h/uqtbTE
y5Ah5TgP3MgFzIRvYPHaswJyuDifqQ8/Oph/XNmFxP6rL44Y2U1AB74OjVYMKray
HVhzGBcB2gRxcGYq478k589bvs27gHCMOXUIoGSO544VrbOkHG6Jlru8/4HjsKZI
0BH3QM1j
=DI0J
-----END PGP SIGNATURE-----

M
M
Miguel Ángel Arruga Vivas wrote on 30 Oct 2020 23:39
Re: [bug#44321] [PATCH 5/6] transformations: Raise '&formatted-message' exceptions instead of 'leave'.
(name . zimoun)(address . zimon.toutoune@gmail.com)
87sg9v49vc.fsf@gmail.com
Hi simon and Ludo,

zimoun <zimon.toutoune@gmail.com> writes:

Toggle quote (10 lines)
> Hi,
>
> On Fri, 30 Oct 2020 at 00:09, Ludovic Courtès <ludo@gnu.org> wrote:
>
>> (transform-package-toolchain): Use 'raise' and 'formatted-message'
>> instead of 'leave'.
>
> Naive question: what is the difference? Other said why? And so why not
> replaces ’leave’ here and there by ’raise’+’formatted-message’?

Probably Ludo can explain better, but the main difference I see is that
leave (guix diagnostics) calls exit, so the client code now can handle
these errors and it isn't forced to exit.

The patch LGTM. Just one extra comment, this changes some format
strings, so we shouldn't forget to send the latest pot files to TP as
soon as we generate the branch for the release.

Happy hacking!
Miguel
-----BEGIN PGP SIGNATURE-----

iQGzBAEBCgAdFiEEiIeExBRZrMuD5+hMY0xuiXn6vsIFAl+clggACgkQY0xuiXn6
vsJBZAv+OdtyADLMw1hQfuA6ZLgxlcOhsmldH6wlOlF9PqDIP+6C1rmiqFE6NYvz
6rZkseIZUTvZVoDgJJrUwNGj7zIDSCfxLpy7tuolHxFd8uJLlObuYVjXfllFnNPs
dIxh7V2/WJQiks7V+0zy5a0F2eeXzrF2EmqfmrwkZv34WKircjYpP/DHmytiGpfY
StvcPwjKgIR2wMK+SY11ipKj2rTEtCduoasVuADgga8ivtoL3DL1RyuLckHgYllm
6LUFBWlqtECcmse8b1mFvx6oC3UfyXuqHR0MyVscBLLIvA9uWc4VobXkaHfDNcBh
qKDUV3kC5G4tE/tVFyBTO/zwi91QjemSC4mR6J2mRFB/x+R8ho1gM7tM5PDVJ1Ym
1PYDgSwjsO5LdeyrkBzoP0pD7hoXk1PP6pDGc/ds4imqrvrbjzGlYEqtQ3r0IU8P
/6ORhPte4AJb83aeq8BT3bpxsRWTPagR88AxOO+1/RKw/44tr6JkvzWeLG6rfNXR
0tnkPpRS
=D73t
-----END PGP SIGNATURE-----

M
M
Miguel Ángel Arruga Vivas wrote on 31 Oct 2020 00:03
Re: [bug#44321] [PATCH 4/6] guix build: Move transformation options to (guix transformations).
(name . Ludovic Courtès)(address . ludo@gnu.org)(address . 44321@debbugs.gnu.org)
87lffn48rc.fsf@gmail.com
Hi Ludo,

Ludovic Courtès <ludo@gnu.org> writes:

Toggle quote (2 lines)
> * guix/transformations.scm: New file.

The main comment regarding this patch is that file has to be added to
po/guix/POTFILES.in, or the translations will be lost.

I've seen that you've changed some code identifiers, here:
Toggle quote (3 lines)
> - (else (tarball-base-name (file-sans-extension file-name)))))
> + (_ (tarball-base-name (file-sans-extension file-name)))))

And there:
Toggle quote (3 lines)
> - (x
> + (_

And these changes seem sensible as the match parameter is unused.

Other than the first comment, the patch LGTM.

Happy hacking,
Miguel
M
M
Miguel Ángel Arruga Vivas wrote on 31 Oct 2020 00:27
Re: [bug#44321] [PATCH 1/6] guix build: 'package-with-source' no longer takes a 'store' parameter.
(name . Ludovic Courtès)(address . ludo@gnu.org)(address . 44321@debbugs.gnu.org)
87eelf47ne.fsf@gmail.com
Hi Ludo,

I've had to re-read some parts of the manual and the code of (guix
store) a bit to completely understand this one, so thank you for the
practical lesson too. :-)

To be sure that I understood it: the main difference is that now
package-with-source _stages_ (wink) the source download up to the gexp
compilation, isn't it? If that's the case, this LGTM and my quick
tests.

Happy hacking,
Miguel

Ludovic Courtès <ludo@gnu.org> writes:

Toggle quote (68 lines)
> * guix/scripts/build.scm (<downloaded-file>): New record type.
> (download-to-store*): New variable.
> (compile-downloaded-file): New procedure.
> (package-with-source): Remove 'store' parameter. Use 'downloaded-file'
> instead of 'download-to-store'.
> (transform-package-source): Adjust accordingly.
> ---
> guix/scripts/build.scm | 26 ++++++++++++++++++++++----
> 1 file changed, 22 insertions(+), 4 deletions(-)
>
> diff --git a/guix/scripts/build.scm b/guix/scripts/build.scm
> index f4a8af035b..831ac8f798 100644
> --- a/guix/scripts/build.scm
> +++ b/guix/scripts/build.scm
> @@ -45,6 +45,7 @@
> #:use-module (ice-9 match)
> #:use-module (ice-9 vlist)
> #:use-module (srfi srfi-1)
> + #:use-module (srfi srfi-9)
> #:use-module (srfi srfi-11)
> #:use-module (srfi srfi-26)
> #:use-module (srfi srfi-34)
> @@ -172,7 +173,25 @@ extensions."
> (else
> file-name)))
>
> -(define* (package-with-source store p uri #:optional version)
> +
> +;; Files to be downloaded.
> +(define-record-type <downloaded-file>
> + (downloaded-file uri recursive?)
> + downloaded-file?
> + (uri downloaded-file-uri)
> + (recursive? downloaded-file-recursive?))
> +
> +(define download-to-store*
> + (store-lift download-to-store))
> +
> +(define-gexp-compiler (compile-downloaded-file (file <downloaded-file>)
> + system target)
> + "Download FILE and return the result as a store item."
> + (match file
> + (($ <downloaded-file> uri recursive?)
> + (download-to-store* uri #:recursive? recursive?))))
> +
> +(define* (package-with-source p uri #:optional version)
> "Return a package based on P but with its source taken from URI. Extract
> the new package's version number from URI."
> (let ((base (tarball-base-name (basename uri))))
> @@ -183,8 +202,7 @@ the new package's version number from URI."
> (package-version p)))
>
> ;; Use #:recursive? #t to allow for directories.
> - (source (download-to-store store uri
> - #:recursive? #t))
> + (source (downloaded-file uri #t))
>
> ;; Override the replacement, otherwise '--with-source' would
> ;; have no effect.
> @@ -226,7 +244,7 @@ matching URIs given in SOURCES."
> ((? package? p)
> (match (assoc-ref sources (package-name p))
> ((version source)
> - (package-with-source store p source version))
> + (package-with-source p source version))
> (#f
> p)))
> (_
-----BEGIN PGP SIGNATURE-----

iQGzBAEBCgAdFiEEiIeExBRZrMuD5+hMY0xuiXn6vsIFAl+coUYACgkQY0xuiXn6
vsLCdAv9FlsN2xztpmXqNB4F2Qexs/BARucqZ0cCEE5lEn5f5xsqpPWB1LchF+Hs
g61Y6k5Q+gNXFbTK2dzhC+tjA/YIUaNhGdFKBuET5JfMSG3HpfqXt5lWd2cuPJiI
tinorCaq2Ue8TN/ZSeb6Y0Pq63sxl8SMKVMRPh5nex5Ook5jFFUmAnTK2lwGMwPf
E6Jhqd4pUpTNHLPzg+YJm2wGuf0GvAhuEcTfrJKOwMMDZrZ+iHHcwhWN23yAiuHQ
KYYdeVYTwPk7Tnqk56IuLIqXBE4vK/gV1eE32lA9XIs/OUlDP4PISlvyWeQ7Sysk
9xvTbrUqUKN7PNkzyPhCjwvFhK7Qsav4R63AxlXkxUPn9xhL9HpHWn3sIFuB42Ap
37Vf2gv/odoiJ0keJkgTC12btqvsByLhlUl8VVPqwNmhbcGRj9OzcDZDFotGeA9t
Kiv16Oq3e1wS7qBlxxyOwXw2Cn63QZESgwPrXharUYwwZXSSxDFOXeH0w7ZMAq/o
haN/9gHI
=dLmh
-----END PGP SIGNATURE-----

L
L
Ludovic Courtès wrote on 31 Oct 2020 11:03
Re: [bug#44321] [PATCH 3/6] guix build: 'options->transformation' no longer takes a 'store' parameter.
(name . Miguel Ángel Arruga Vivas)(address . rosen644835@gmail.com)(address . 44321@debbugs.gnu.org)
87r1peww3x.fsf@gnu.org
Hi Miguel,

Miguel Ángel Arruga Vivas <rosen644835@gmail.com> skribis:

Toggle quote (31 lines)
> Ludovic Courtès <ludo@gnu.org> writes:
>> ("options->transformation, with-source")
>> ("options->transformation, with-source, replacement")
>> ("options->transformation, with-source, with version")
>> ("options->transformation, with-source, PKG=URI"): Use 'lower-object' to
>> compute the store file name of the source.
> [...]
>> @@ -64,12 +66,9 @@
>> (let* ((p (dummy-package "guix.scm" (replacement coreutils)))
>> (s (search-path %load-path "guix.scm"))
>> (t (options->transformation `((with-source . ,s)))))
>> - (with-store store
>> - (let ((new (t store p)))
>> - (and (not (eq? new p))
>> - (string=? (package-source new)
>> - (add-to-store store "guix.scm" #t "sha256" s))
>> - (not (package-replacement new)))))))
>> + (let ((new (t p)))
>> + (and (not (eq? new p))
>> + (not (package-replacement new))))))
>>
>> (test-assert "options->transformation, with-source, with version"
>> ;; Our pseudo-package is called 'guix.scm' so the 'guix.scm-2.0' source
>
> It's the only one that doesn't follow the same pattern as others, where
> the change look quite similar: instead of (t store p) -> (t p) (source
> (run-...)), also specified in the message.
>
> If removing that comparison is intended, I think the commit message
> should be changed. Otherwise it LGTM.

Good catch! I guess I was hesitant here. I’ll re-introduce the test
using ‘run-with-store’ and all.

Thanks,
Ludo’.
L
L
Ludovic Courtès wrote on 31 Oct 2020 11:04
Re: [bug#44321] [PATCH 4/6] guix build: Move transformation options to (guix transformations).
(name . Miguel Ángel Arruga Vivas)(address . rosen644835@gmail.com)(address . 44321@debbugs.gnu.org)
87mu02ww22.fsf@gnu.org
Hi,

Miguel Ángel Arruga Vivas <rosen644835@gmail.com> skribis:

Toggle quote (7 lines)
> Ludovic Courtès <ludo@gnu.org> writes:
>
>> * guix/transformations.scm: New file.
>
> The main comment regarding this patch is that file has to be added to
> po/guix/POTFILES.in, or the translations will be lost.

Indeed, I’ll add it to that file.

Toggle quote (10 lines)
> I've seen that you've changed some code identifiers, here:
>> - (else (tarball-base-name (file-sans-extension file-name)))))
>> + (_ (tarball-base-name (file-sans-extension file-name)))))
>
> And there:
>> - (x
>> + (_
>
> And these changes seem sensible as the match parameter is unused.

Yeah.

Thanks!

Ludo’.
L
L
Ludovic Courtès wrote on 31 Oct 2020 11:06
Re: [bug#44321] [PATCH 5/6] transformations: Raise '&formatted-message' exceptions instead of 'leave'.
(name . Miguel Ángel Arruga Vivas)(address . rosen644835@gmail.com)
87imaqwvyx.fsf@gnu.org
Hi,

Miguel Ángel Arruga Vivas <rosen644835@gmail.com> skribis:

Toggle quote (16 lines)
> zimoun <zimon.toutoune@gmail.com> writes:
>
>> Hi,
>>
>> On Fri, 30 Oct 2020 at 00:09, Ludovic Courtès <ludo@gnu.org> wrote:
>>
>>> (transform-package-toolchain): Use 'raise' and 'formatted-message'
>>> instead of 'leave'.
>>
>> Naive question: what is the difference? Other said why? And so why not
>> replaces ’leave’ here and there by ’raise’+’formatted-message’?
>
> Probably Ludo can explain better, but the main difference I see is that
> leave (guix diagnostics) calls exit, so the client code now can handle
> these errors and it isn't forced to exit.

Exactly. In fact, ‘exit’ throws the 'quit exception, which one could
also catch, but it’s still nicer to throw &message or &formatted-message
within a module meant to be used as a library.

Toggle quote (4 lines)
> The patch LGTM. Just one extra comment, this changes some format
> strings, so we shouldn't forget to send the latest pot files to TP as
> soon as we generate the branch for the release.

Yes.

Thanks,
Ludo’.
L
L
Ludovic Courtès wrote on 31 Oct 2020 11:14
Re: [bug#44321] [PATCH 6/6] doc: Add "Defining Package Variants" section.
(name . zimoun)(address . zimon.toutoune@gmail.com)(address . 44321@debbugs.gnu.org)
87eelewvkw.fsf@gnu.org
Hi,

zimoun <zimon.toutoune@gmail.com> skribis:

Toggle quote (7 lines)
> On Fri, 30 Oct 2020 at 00:10, Ludovic Courtès <ludo@gnu.org> wrote:
>
>> -* Invoking guix repl:: Programming Guix in Guile.
>> +* Invoking guix repl:: Programming Guix in Guile
>
> This change is already in commit 729d4ba025bc8556d00041f9af5b6609eeec9d80.

OK, I’ll have to rebase and regenerate the menus maybe.

Toggle quote (20 lines)
>> +You can just as well define variants with a different set of
>> +dependencies than the original package. For example, the default
>> +@code{gdb} package depends on @code{guile}, but since that is an
>> +optional dependency, you can define a variant that removes that
>> +dependency like so:
>> +
>> +@lisp
>> +(use-modules (gnu packages gdb) ;for 'gdb'
>> + (srfi srfi-1)) ;for 'alist-delete'
>> +
>> +(define gdb-sans-guile
>> + (package
>> + (inherit gdb)
>> + (inputs (alist-delete "guile"
>> + (package-inputs gdb)))))
>> +@end lisp
>
> Does it make sense to add a sentence explaining that the “guile” is the
> name provided by the string in the ’inputs’ list of the package ’gdb’,

Yeah, I’ll add a sentence like:

+The @code{alist-delete} call above removes the tuple from the
+@code{inputs} field that has @code{"guile"} as its first element
+(@pxref{SRFI-1 Association Lists,,, guile, GNU Guile Reference
+Manual}).

Toggle quote (12 lines)
>> +@deffn {Scheme Procedure} options->transformation @var{opts}
>> +Return a procedure that, when passed an object to build (package,
>> +derivation, etc.), applies the transformations specified by @var{opts} and returns
>> +the resulting objects. @var{opts} must be a list of symbol/string pairs such as:
>> +
>> +@example
>> +((with-branch . "guile-gcrypt=master")
>> + (without-tests . "libgcrypt"))
>> +@end example
>
> Is it on purpose that here you use ’without-tests’ and then…

[...]

Toggle quote (2 lines)
> …you use ’with-debug-info’ as example?

Yeah, the two examples are independent of one another so I guess it’s
fine to have some diversity, no?

Toggle quote (8 lines)
>> +@lisp
>> +(define libressl-instead-of-openssl
>> + ;; Replace all the packages called "openssl" with LibreSSL.
>> + (package-input-rewriting/spec `(("openssl" . ,(const libressl)))))
>> +@end lisp
>
> It is already in the manual but why this ’const’?

Because ‘package-input-rewriting/spec’ takes a list of spec/procedure
pairs.

Thanks!

Ludo’.
L
L
Ludovic Courtès wrote on 31 Oct 2020 11:17
Re: [bug#44321] [PATCH 1/6] guix build: 'package-with-source' no longer takes a 'store' parameter.
(name . Miguel Ángel Arruga Vivas)(address . rosen644835@gmail.com)(address . 44321@debbugs.gnu.org)
87a6w2wvgc.fsf@gnu.org
Miguel Ángel Arruga Vivas <rosen644835@gmail.com> skribis:

Toggle quote (4 lines)
> I've had to re-read some parts of the manual and the code of (guix
> store) a bit to completely understand this one, so thank you for the
> practical lesson too. :-)

Heheh. :-)

Toggle quote (5 lines)
> To be sure that I understood it: the main difference is that now
> package-with-source _stages_ (wink) the source download up to the gexp
> compilation, isn't it? If that's the case, this LGTM and my quick
> tests.

Yes, exactly. Now ‘package-with-source’ inserts an “inert”
<downloaded-file> record as the source of the package. The file is
actually downloaded when that <downloaded-file> object is “lowered”,
which happens when the package itself is lowered to a derivation.

Thanks for the review!

Ludo’.
L
L
Ludovic Courtès wrote on 31 Oct 2020 23:18
Re: [bug#44321] [PATCH 5/6] transformations: Raise '&formatted-message' exceptions instead of 'leave'.
(name . Miguel Ángel Arruga Vivas)(address . rosen644835@gmail.com)
87ft5urqd4.fsf@gnu.org
Pushed as 95460da83b6ffd2bf3b96b3ab7cd302ab76be38a, thanks!

Ludo’.
Closed
Z
Z
zimoun wrote on 2 Nov 2020 13:25
(name . Ludovic Courtès)(address . ludo@gnu.org)
CAJ3okZ17Uzh0Azm6x7=tHM=ob2BWd9sP0bUWQ+w_LNbRq6oftA@mail.gmail.com
Hi,

Thanks for the explanation.

On Sat, 31 Oct 2020 at 11:06, Ludovic Courtès <ludo@gnu.org> wrote:

Toggle quote (11 lines)
> >> Naive question: what is the difference? Other said why? And so why not
> >> replaces ’leave’ here and there by ’raise’+’formatted-message’?
> >
> > Probably Ludo can explain better, but the main difference I see is that
> > leave (guix diagnostics) calls exit, so the client code now can handle
> > these errors and it isn't forced to exit.
>
> Exactly. In fact, ‘exit’ throws the 'quit exception, which one could
> also catch, but it’s still nicer to throw &message or &formatted-message
> within a module meant to be used as a library.

And so why not replace the 'leave' appearing here and there in the
code by 'raise'+'formatted-message'?


Cheers,
simon
L
L
Ludovic Courtès wrote on 2 Nov 2020 16:48
(name . zimoun)(address . zimon.toutoune@gmail.com)
87a6vzkbev.fsf@gnu.org
zimoun <zimon.toutoune@gmail.com> skribis:

Toggle quote (16 lines)
> On Sat, 31 Oct 2020 at 11:06, Ludovic Courtès <ludo@gnu.org> wrote:
>
>> >> Naive question: what is the difference? Other said why? And so why not
>> >> replaces ’leave’ here and there by ’raise’+’formatted-message’?
>> >
>> > Probably Ludo can explain better, but the main difference I see is that
>> > leave (guix diagnostics) calls exit, so the client code now can handle
>> > these errors and it isn't forced to exit.
>>
>> Exactly. In fact, ‘exit’ throws the 'quit exception, which one could
>> also catch, but it’s still nicer to throw &message or &formatted-message
>> within a module meant to be used as a library.
>
> And so why not replace the 'leave' appearing here and there in the
> code by 'raise'+'formatted-message'?

In (guix scripts …), using ‘leave’ is appropriate.

Ludo’.
?