guix-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

01/02: pack: Clarify the /bin/sh requirement for Singularity.


From: guix-commits
Subject: 01/02: pack: Clarify the /bin/sh requirement for Singularity.
Date: Tue, 10 Dec 2019 14:56:25 -0500 (EST)

civodul pushed a commit to branch master
in repository guix.

commit dc995fcd5a62496721757f4ecb7f9b9d65399b5c
Author: Ludovic Court├Ęs <address@hidden>
Date:   Tue Dec 10 15:54:37 2019 +0100

    pack: Clarify the /bin/sh requirement for Singularity.
    
    * guix/scripts/pack.scm (squashfs-image)[symlinks*]: New variable.
    [build]: Use it instead of SYMLINKS.
    (guix-pack): Emit a warning and a hint when "bash" and "bash-minimal"
    are missing and PACK-FORMAT is 'squashfs.
    * doc/guix.texi (Invoking guix pack): Document the /bin/sh requirement
    for Singularity.
---
 doc/guix.texi         | 17 ++++++++++++++++-
 guix/scripts/pack.scm | 21 ++++++++++++++++++++-
 2 files changed, 36 insertions(+), 2 deletions(-)

diff --git a/doc/guix.texi b/doc/guix.texi
index 3f646cd..25efba1 100644
--- a/doc/guix.texi
+++ b/doc/guix.texi
@@ -5053,7 +5053,7 @@ Yet another option is to produce a SquashFS image with 
the following
 command:
 
 @example
-guix pack -f squashfs guile emacs geiser
+guix pack -f squashfs bash guile emacs geiser
 @end example
 
 @noindent
@@ -5088,6 +5088,21 @@ package names passed on the command line or in the 
manifest file.
 This produces a SquashFS image containing all the specified binaries and
 symlinks, as well as empty mount points for virtual file systems like
 procfs.
+
+@quotation Note
+Singularity @emph{requires} you to provide @file{/bin/sh} in the image.
+For that reason, @command{guix pack -f squashfs} always implies @code{-S
+/bin=bin}.  Thus, your @command{guix pack} invocation must always start
+with something like:
+
+@example
+guix pack -f squashfs bash @dots{}
+@end example
+
+If you forget the @code{bash} (or similar) package, @command{singularity
+run} and @command{singularity exec} will fail with an unhelpful ``no
+such file or directory'' message.
+@end quotation
 @end table
 
 @cindex relocatable binaries
diff --git a/guix/scripts/pack.scm b/guix/scripts/pack.scm
index 61d18e2..bbacc93 100644
--- a/guix/scripts/pack.scm
+++ b/guix/scripts/pack.scm
@@ -334,6 +334,16 @@ added to the pack."
   (define environment
     (singularity-environment-file profile))
 
+  (define symlinks*
+    ;; Singularity requires /bin (specifically /bin/sh), so ensure that
+    ;; symlink is created.
+    (if (find (match-lambda
+                (("/bin" . _) #t)
+                (_            #f))
+              symlinks)
+        symlinks
+        `(("/bin" -> "bin") ,@symlinks)))
+
   (define build
     (with-imported-modules (source-module-closure
                             '((guix build utils)
@@ -407,7 +417,7 @@ added to the pack."
                                         "s" "777" "0" "0"
                                         (relative-file-name (dirname source)
                                                             target)))))))
-                      '#$symlinks)
+                      '#$symlinks*)
 
                    "-p" "/.singularity.d d 555 0 0"
 
@@ -1049,9 +1059,18 @@ Create a bundle of PACKAGE.\n"))
                  (entry-point    (assoc-ref opts 'entry-point))
                  (profile-name   (assoc-ref opts 'profile-name))
                  (gc-root        (assoc-ref opts 'gc-root)))
+            (define (lookup-package package)
+              (manifest-lookup manifest (manifest-pattern (name package))))
+
             (when (null? (manifest-entries manifest))
               (warning (G_ "no packages specified; building an empty pack~%")))
 
+            (when (and (eq? pack-format 'squashfs)
+                       (not (any lookup-package '("bash" "bash-minimal"))))
+              (warning (G_ "Singularity requires you to provide a shell~%"))
+              (display-hint (G_ "Add @code{bash} or @code{bash-minimal} \
+to your package list.")))
+
             (run-with-store store
               (mlet* %store-monad ((profile (profile-derivation
                                              manifest



reply via email to

[Prev in Thread] Current Thread [Next in Thread]