unofficial mirror of guix-patches@gnu.org 
 help / color / mirror / code / Atom feed
From: Maxim Cournoyer <maxim.cournoyer@gmail.com>
To: 61255@debbugs.gnu.org
Cc: "Josselin Poiret" <dev@jpoiret.xyz>,
	"Tobias Geerinckx-Rice" <me@tobias.gr>,
	"Maxim Cournoyer" <maxim.cournoyer@gmail.com>,
	"Simon Tournier" <zimon.toutoune@gmail.com>,
	"Mathieu Othacehe" <othacehe@gnu.org>,
	"Ludovic Courtès" <ludo@gnu.org>,
	"Christopher Baines" <mail@cbaines.net>,
	"Ricardo Wurmus" <rekado@elephly.net>
Subject: [bug#61255] [PATCH 3/5] pack: Extract populate-profile-root from self-contained-tarball/builder.
Date: Fri,  3 Feb 2023 17:14:06 -0500	[thread overview]
Message-ID: <20230203221409.15886-4-maxim.cournoyer@gmail.com> (raw)
In-Reply-To: <20230203221409.15886-2-maxim.cournoyer@gmail.com>

This allows more code to be reused between the various archive writers.

* guix/scripts/pack.scm (set-utf8-locale): New top-level procedure, extracted
from...
(populate-profile-root): New procedure, extracted from...
(self-contained-tarball/builder): ... here.  Add #:target argument.  Call
populate-profile-root.
[LOCALSTATEDIR?]: Set db.sqlite file permissions.
(self-contained-tarball): Call self-contained-tarball/builder with the TARGET
argument, and set #:local-build? to #f for the gexp-derivation call.  Remove
now extraneous #:target and #:references-graphs arguments from the
gexp->derivation call.
(debian-archive): Call self-contained-tarball/builder with the #:target
argument.  Fix indentation.  Remove now extraneous #:target and
 #:references-graphs arguments from the gexp->derivation call.
---

 guix/scripts/pack.scm | 247 ++++++++++++++++++++++++------------------
 1 file changed, 142 insertions(+), 105 deletions(-)

diff --git a/guix/scripts/pack.scm b/guix/scripts/pack.scm
index 7e466a2be7..7a5fb9bd0d 100644
--- a/guix/scripts/pack.scm
+++ b/guix/scripts/pack.scm
@@ -200,104 +200,144 @@ (define (keyword-ref lst keyword)
     ((_ value . _) value)
     (#f #f)))
 
-\f
-;;;
-;;; Tarball format.
-;;;
-(define* (self-contained-tarball/builder profile
-                                         #:key (profile-name "guix-profile")
-                                         (compressor (first %compressors))
-                                         localstatedir?
-                                         (symlinks '())
-                                         (archiver tar)
-                                         (extra-options '()))
-  "Return the G-Expression of the builder used for self-contained-tarball."
+(define (set-utf8-locale profile)
+  "Configure the environment to use the \"en_US.utf8\" locale provided by the
+GLIBC-UT8-LOCALES package."
+  ;; Arrange to not depend on 'glibc-utf8-locales' when using '--bootstrap'.
+  (and (or (not (profile? profile))
+           (profile-locales? profile))
+       #~(begin
+           (setenv "GUIX_LOCPATH"
+                   #+(file-append glibc-utf8-locales "/lib/locale"))
+           (setlocale LC_ALL "en_US.utf8"))))
+
+(define* (populate-profile-root profile
+                                #:key (profile-name "guix-profile")
+                                target
+                                localstatedir?
+                                deduplicate?
+                                (symlinks '()))
+  "Populate the root profile directory with SYMLINKS and a Guix database, when
+LOCALSTATEDIR? is set.  When DEDUPLICATE? is true, deduplicate the store
+items, which relies on hard links."
   (define database
     (and localstatedir?
          (file-append (store-database (list profile))
                       "/db/db.sqlite")))
 
-  (define set-utf8-locale
-    ;; Arrange to not depend on 'glibc-utf8-locales' when using '--bootstrap'.
-    (and (or (not (profile? profile))
-             (profile-locales? profile))
-         #~(begin
-             (setenv "GUIX_LOCPATH"
-                     #+(file-append glibc-utf8-locales "/lib/locale"))
-             (setlocale LC_ALL "en_US.utf8"))))
-
   (define (import-module? module)
     ;; Since we don't use deduplication support in 'populate-store', don't
     ;; import (guix store deduplication) and its dependencies, which includes
-    ;; Guile-Gcrypt.  That way we can run tests with '--bootstrap'.
+    ;; Guile-Gcrypt, unless DEDUPLICATE? is #t.  This makes it possible to run
+    ;; tests with '--bootstrap'.
     (and (not-config? module)
-         (not (equal? '(guix store deduplication) module))))
-
-  (with-imported-modules (source-module-closure
-                          `((guix build pack)
-                            (guix build store-copy)
-                            (guix build utils)
-                            (guix build union)
-                            (gnu build install))
-                          #:select? import-module?)
+         (or deduplicate? (not (equal? '(guix store deduplication) module)))))
+
+  (computed-file "profile-directory"
+    (with-imported-modules (source-module-closure
+                            `((guix build pack)
+                              (guix build store-copy)
+                              (guix build utils)
+                              (guix build union)
+                              (gnu build install))
+                            #:select? import-module?)
+      #~(begin
+          (use-modules (guix build pack)
+                       (guix build store-copy)
+                       (guix build utils)
+                       ((guix build union) #:select (relative-file-name))
+                       (gnu build install)
+                       (srfi srfi-1)
+                       (srfi srfi-26)
+                       (ice-9 match))
+
+          (define symlink->directives
+            ;; Return "populate directives" to make the given symlink and its
+            ;; parent directories.
+            (match-lambda
+              ((source '-> target)
+               (let ((target (string-append #$profile "/" target))
+                     (parent (dirname source)))
+                 ;; Never add a 'directory' directive for "/" so as to
+                 ;; preserve its ownership when extracting the archive (see
+                 ;; below), and also because this would lead to adding the
+                 ;; same entries twice in the tarball.
+                 `(,@(if (string=? parent "/")
+                         '()
+                         `((directory ,parent)))
+                   ;; Use a relative file name for compatibility with
+                   ;; relocatable packs.
+                   (,source -> ,(relative-file-name parent target)))))))
+
+          (define directives
+            ;; Fully-qualified symlinks.
+            (append-map symlink->directives '#$symlinks))
+
+          ;; Make sure non-ASCII file names are properly handled.
+          #+(set-utf8-locale profile)
+
+          ;; Note: there is not much to gain here with deduplication and there
+          ;; is the overhead of the '.links' directory, so turn it off by
+          ;; default.  Furthermore GNU tar < 1.30 sometimes fails to extract
+          ;; tarballs with hard links:
+          ;; <http://lists.gnu.org/archive/html/bug-tar/2017-11/msg00009.html>.
+          (populate-store (list "profile") #$output
+                          #:deduplicate? #$deduplicate?)
+
+          (when #+localstatedir?
+            (install-database-and-gc-roots #$output #+database #$profile
+                                           #:profile-name #$profile-name))
+
+          ;; Create SYMLINKS.
+          (for-each (cut evaluate-populate-directive <> #$output)
+                    directives)))
+    #:local-build? #f
+    #:options (list #:references-graphs `(("profile" ,profile))
+                    #:target target)))
+
+\f
+;;;
+;;; Tarball format.
+;;;
+(define* (self-contained-tarball/builder profile
+                                         #:key (profile-name "guix-profile")
+                                         target
+                                         localstatedir?
+                                         deduplicate?
+                                         symlinks
+                                         compressor
+                                         archiver)
+  "Return a GEXP that can build a self-contained tarball."
+
+  (define root (populate-profile-root profile
+                                      #:profile-name profile-name
+                                      #:target target
+                                      #:localstatedir? localstatedir?
+                                      #:deduplicate? deduplicate?
+                                      #:symlinks symlinks))
+
+  (with-imported-modules (source-module-closure '((guix build pack)
+                                                  (guix build utils)))
     #~(begin
         (use-modules (guix build pack)
-                     (guix build store-copy)
-                     (guix build utils)
-                     ((guix build union) #:select (relative-file-name))
-                     (gnu build install)
-                     (srfi srfi-1)
-                     (srfi srfi-26)
-                     (ice-9 match))
-
-        (define %root "root")
-
-        (define symlink->directives
-          ;; Return "populate directives" to make the given symlink and its
-          ;; parent directories.
-          (match-lambda
-            ((source '-> target)
-             (let ((target (string-append #$profile "/" target))
-                   (parent (dirname source)))
-               ;; Never add a 'directory' directive for "/" so as to
-               ;; preserve its ownership when extracting the archive (see
-               ;; below), and also because this would lead to adding the
-               ;; same entries twice in the tarball.
-               `(,@(if (string=? parent "/")
-                       '()
-                       `((directory ,parent)))
-                 ;; Use a relative file name for compatibility with
-                 ;; relocatable packs.
-                 (,source -> ,(relative-file-name parent target)))))))
-
-        (define directives
-          ;; Fully-qualified symlinks.
-          (append-map symlink->directives '#$symlinks))
+                     (guix build utils))
 
         ;; Make sure non-ASCII file names are properly handled.
-        #+set-utf8-locale
+        #+(set-utf8-locale profile)
 
         (define tar #+(file-append archiver "/bin/tar"))
 
-        ;; Note: there is not much to gain here with deduplication and there
-        ;; is the overhead of the '.links' directory, so turn it off.
-        ;; Furthermore GNU tar < 1.30 sometimes fails to extract tarballs
-        ;; with hard links:
-        ;; <http://lists.gnu.org/archive/html/bug-tar/2017-11/msg00009.html>.
-        (populate-store (list "profile") %root #:deduplicate? #f)
+        (define %root (if #$localstatedir? "." #$root))
 
-        (when #+localstatedir?
-          (install-database-and-gc-roots %root #+database #$profile
-                                         #:profile-name #$profile-name))
+        (when #$localstatedir?
+          ;; Fix the permission of the Guix database file, which was made
+          ;; read-only when copied to the store in populate-profile-root.
+          (copy-recursively #$root %root)
+          (chmod (string-append %root "/var/guix/db/db.sqlite") #o644))
 
-        ;; Create SYMLINKS.
-        (for-each (cut evaluate-populate-directive <> %root)
-                  directives)
-
-        ;; Create the tarball.
         (with-directory-excursion %root
           ;; GNU Tar recurses directories by default.  Simply add the whole
-          ;; current directory, which contains all the generated files so far.
+          ;; current directory, which contains all the files to be archived.
           ;; This avoids creating duplicate files in the archives that would
           ;; be stored as hard links by GNU Tar.
           (apply invoke tar "-cvf" #$output "."
@@ -326,17 +366,16 @@ (define* (self-contained-tarball name profile
     (warning (G_ "entry point not supported in the '~a' format~%")
              'tarball))
 
-  (gexp->derivation
-   (string-append name ".tar"
-                  (compressor-extension compressor))
-   (self-contained-tarball/builder profile
-                                   #:profile-name profile-name
-                                   #:compressor compressor
-                                   #:localstatedir? localstatedir?
-                                   #:symlinks symlinks
-                                   #:archiver archiver)
-   #:target target
-   #:references-graphs `(("profile" ,profile))))
+  (gexp->derivation (string-append name ".tar"
+                                   (compressor-extension compressor))
+    (self-contained-tarball/builder profile
+                                    #:profile-name profile-name
+                                    #:target target
+                                    #:localstatedir? localstatedir?
+                                    #:deduplicate? deduplicate?
+                                    #:symlinks symlinks
+                                    #:compressor compressor
+                                    #:archiver archiver)))
 
 \f
 ;;;
@@ -682,18 +721,19 @@ (define %valid-compressors '("gzip" "xz" "none"))
              'deb))
 
   (define data-tarball
-    (computed-file (string-append "data.tar"
-                                  (compressor-extension compressor))
-                   (self-contained-tarball/builder
-                    profile
-                    #:profile-name profile-name
-                    #:compressor compressor
-                    #:localstatedir? localstatedir?
-                    #:symlinks symlinks
-                    #:archiver archiver)
-                   #:local-build? #f    ;allow offloading
-                   #:options (list #:references-graphs `(("profile" ,profile))
-                                   #:target target)))
+    (computed-file (string-append "data.tar" (compressor-extension
+                                              compressor))
+      (self-contained-tarball/builder profile
+                                      #:target target
+                                      #:profile-name profile-name
+                                      #:localstatedir? localstatedir?
+                                      #:deduplicate? deduplicate?
+                                      #:symlinks symlinks
+                                      #:compressor compressor
+                                      #:archiver archiver)
+      #:local-build? #f                 ;allow offloading
+      #:options (list #:references-graphs `(("profile" ,profile))
+                      #:target target)))
 
   (define build
     (with-extensions (list guile-gcrypt)
@@ -821,10 +861,7 @@ (define tar (string-append #+archiver "/bin/tar"))
                     "debian-binary"
                     control-tarball-file-name data-tarball-file-name)))))
 
-  (gexp->derivation (string-append name ".deb")
-    build
-    #:target target
-    #:references-graphs `(("profile" ,profile))))
+  (gexp->derivation (string-append name ".deb") build))
 
 \f
 ;;;
-- 
2.39.1





  parent reply	other threads:[~2023-02-03 22:16 UTC|newest]

Thread overview: 31+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-02-03 16:19 [bug#61255] [PATCH 0/5] Add support for the RPM format to "guix pack" Maxim Cournoyer
2023-02-03 22:14 ` [bug#61255] [PATCH 1/5] pack: Extract keyword-ref procedure from debian-archive Maxim Cournoyer
2023-02-03 22:14   ` [bug#61255] [PATCH 2/5] gexp: computed-file: Honor %guile-for-build Maxim Cournoyer
2023-02-04  1:11     ` Ludovic Courtès
2023-02-04  3:43       ` Maxim Cournoyer
2023-02-12 18:14         ` [bug#61255] [PATCH 0/5] Add support for the RPM format to "guix pack" Ludovic Courtès
2023-02-16 15:12           ` Maxim Cournoyer
2023-02-23 15:44             ` [bug#61255] (%guile-for-build) default in ‘computed-file’ Ludovic Courtès
2023-02-24  2:38               ` Maxim Cournoyer
2023-02-03 22:14   ` Maxim Cournoyer [this message]
2023-02-03 22:14   ` [bug#61255] [PATCH 4/5] tests: pack: Fix indentation Maxim Cournoyer
2023-02-12 18:20     ` [bug#61255] [PATCH 0/5] Add support for the RPM format to "guix pack" Ludovic Courtès
2023-02-16 15:22       ` Maxim Cournoyer
2023-02-23 15:47         ` Ludovic Courtès
2023-02-03 22:14   ` [bug#61255] [PATCH 5/5] pack: Add RPM format Maxim Cournoyer
2023-02-12 18:52     ` [bug#61255] [PATCH 0/5] Add support for the RPM format to "guix pack" Ludovic Courtès
2023-02-16 22:17       ` Maxim Cournoyer
2023-02-12 18:57   ` Ludovic Courtès
2023-02-16 15:25     ` Maxim Cournoyer
2023-02-17  1:49 ` [bug#61255] [PATCH v2 0/8] " Maxim Cournoyer
2023-02-17  1:49   ` [bug#61255] [PATCH v2 1/8] .dir-locals: Add let-keywords indentation rules Maxim Cournoyer
2023-02-17  1:49   ` [bug#61255] [PATCH v2 2/8] pack: Use let-keywords instead of keyword-ref Maxim Cournoyer
2023-02-17  1:49   ` [bug#61255] [PATCH v2 3/8] gexp: computed-file: Honor %guile-for-build Maxim Cournoyer
2023-02-17  1:49   ` [bug#61255] [PATCH v2 4/8] pack: Extract populate-profile-root from self-contained-tarball/builder Maxim Cournoyer
2023-02-17  1:49   ` [bug#61255] [PATCH v2 5/8] tests: pack: Fix indentation Maxim Cournoyer
2023-02-17  1:49   ` [bug#61255] [PATCH v2 6/8] pack: Add RPM format Maxim Cournoyer
2023-02-17  1:49   ` [bug#61255] [PATCH v2 7/8] etc: Add a news entry snippet Maxim Cournoyer
2023-02-17  1:49   ` [bug#61255] [PATCH v2 8/8] news: Add entry for the new 'rpm' guix pack format Maxim Cournoyer
2023-02-17  6:34     ` Julien Lepiller
2023-02-17 17:32       ` Maxim Cournoyer
2023-02-17 15:12     ` pelzflorian (Florian Pelz)

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://guix.gnu.org/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20230203221409.15886-4-maxim.cournoyer@gmail.com \
    --to=maxim.cournoyer@gmail.com \
    --cc=61255@debbugs.gnu.org \
    --cc=dev@jpoiret.xyz \
    --cc=ludo@gnu.org \
    --cc=mail@cbaines.net \
    --cc=me@tobias.gr \
    --cc=othacehe@gnu.org \
    --cc=rekado@elephly.net \
    --cc=zimon.toutoune@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/guix.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).