guix: pack: Only wrap executable files.
* guix/scripts/pack.scm (wrapped-package)<build>: Build wrappers for executable files and symlink others. * tests/guix-pack-relocatable.sh: Test relocatable example of mixed executable and non-executable files.
This commit is contained in:
parent
a73896425e
commit
4184998c70
2 changed files with 56 additions and 9 deletions
|
@ -749,12 +749,13 @@ last resort for relocation."
|
||||||
(guix elf)))
|
(guix elf)))
|
||||||
#~(begin
|
#~(begin
|
||||||
(use-modules (guix build utils)
|
(use-modules (guix build utils)
|
||||||
((guix build union) #:select (relative-file-name))
|
((guix build union) #:select (symlink-relative))
|
||||||
(guix elf)
|
(guix elf)
|
||||||
(guix build gremlin)
|
(guix build gremlin)
|
||||||
(ice-9 binary-ports)
|
(ice-9 binary-ports)
|
||||||
(ice-9 ftw)
|
(ice-9 ftw)
|
||||||
(ice-9 match)
|
(ice-9 match)
|
||||||
|
(ice-9 receive)
|
||||||
(srfi srfi-1)
|
(srfi srfi-1)
|
||||||
(rnrs bytevectors))
|
(rnrs bytevectors))
|
||||||
|
|
||||||
|
@ -874,16 +875,27 @@ last resort for relocation."
|
||||||
(mkdir target)
|
(mkdir target)
|
||||||
(for-each (lambda (file)
|
(for-each (lambda (file)
|
||||||
(unless (member file '("." ".." "bin" "sbin" "libexec"))
|
(unless (member file '("." ".." "bin" "sbin" "libexec"))
|
||||||
(let ((file* (string-append input "/" file)))
|
(symlink-relative (string-append input "/" file)
|
||||||
(symlink (relative-file-name target file*)
|
(string-append target "/" file))))
|
||||||
(string-append target "/" file)))))
|
|
||||||
(scandir input))
|
(scandir input))
|
||||||
|
|
||||||
(for-each build-wrapper
|
(receive (executables others)
|
||||||
|
(partition executable-file?
|
||||||
;; Note: Trailing slash in case these are symlinks.
|
;; Note: Trailing slash in case these are symlinks.
|
||||||
(append (find-files (string-append input "/bin/"))
|
(append (find-files (string-append input "/bin/"))
|
||||||
(find-files (string-append input "/sbin/"))
|
(find-files (string-append input "/sbin/"))
|
||||||
(find-files (string-append input "/libexec/")))))))
|
(find-files (string-append input "/libexec/"))))
|
||||||
|
;; Wrap only executables, since the wrapper will eventually need
|
||||||
|
;; to execve them. E.g. git's "libexec" directory contains many
|
||||||
|
;; shell scripts that are source'd from elsewhere, which fails if
|
||||||
|
;; they are wrapped.
|
||||||
|
(for-each build-wrapper executables)
|
||||||
|
;; Link any other non-executable files
|
||||||
|
(for-each (lambda (old)
|
||||||
|
(let ((new (string-append target (strip-store-prefix old))))
|
||||||
|
(mkdir-p (dirname new))
|
||||||
|
(symlink-relative old new)))
|
||||||
|
others)))))
|
||||||
|
|
||||||
(computed-file (string-append
|
(computed-file (string-append
|
||||||
(cond ((package? package)
|
(cond ((package? package)
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
# GNU Guix --- Functional package management for GNU
|
# GNU Guix --- Functional package management for GNU
|
||||||
# Copyright © 2018, 2019, 2020 Ludovic Courtès <ludo@gnu.org>
|
# Copyright © 2018, 2019, 2020 Ludovic Courtès <ludo@gnu.org>
|
||||||
|
# Copyright © 2020 Eric Bavier <bavier@posteo.net>
|
||||||
#
|
#
|
||||||
# This file is part of GNU Guix.
|
# This file is part of GNU Guix.
|
||||||
#
|
#
|
||||||
|
@ -98,6 +99,7 @@ case "`uname -m`" in
|
||||||
run_without_store GUIX_EXECUTION_ENGINE="fakechroot" \
|
run_without_store GUIX_EXECUTION_ENGINE="fakechroot" \
|
||||||
"$test_directory/Bin/sed" --version > "$test_directory/output"
|
"$test_directory/Bin/sed" --version > "$test_directory/output"
|
||||||
grep 'GNU sed' "$test_directory/output"
|
grep 'GNU sed' "$test_directory/output"
|
||||||
|
unset GUIX_EXECUTION_ENGINE
|
||||||
|
|
||||||
chmod -Rf +w "$test_directory"; rm -rf "$test_directory"/*
|
chmod -Rf +w "$test_directory"; rm -rf "$test_directory"/*
|
||||||
|
|
||||||
|
@ -133,8 +135,41 @@ esac
|
||||||
tarball="`guix pack -R -S /share=share groff:doc`"
|
tarball="`guix pack -R -S /share=share groff:doc`"
|
||||||
(cd "$test_directory"; tar xf "$tarball")
|
(cd "$test_directory"; tar xf "$tarball")
|
||||||
test -d "$test_directory/share/doc/groff/html"
|
test -d "$test_directory/share/doc/groff/html"
|
||||||
|
chmod -Rf +w "$test_directory"; rm -rf "$test_directory"/*
|
||||||
|
|
||||||
# Ensure '-R' applies to propagated inputs. Failing to do that, it would fail
|
# Ensure '-R' applies to propagated inputs. Failing to do that, it would fail
|
||||||
# with a profile collision error in this case because 'python-scipy'
|
# with a profile collision error in this case because 'python-scipy'
|
||||||
# propagates 'python-numpy'. See <https://bugs.gnu.org/42510>.
|
# propagates 'python-numpy'. See <https://bugs.gnu.org/42510>.
|
||||||
guix pack -RR python-numpy python-scipy --no-grafts -n
|
guix pack -RR python-numpy python-scipy --no-grafts -n
|
||||||
|
|
||||||
|
# Check that packages that mix executable and support files (e.g. git) in the
|
||||||
|
# "binary" directories still work after wrapped.
|
||||||
|
cat >"$test_directory/manifest.scm" <<'EOF'
|
||||||
|
(use-modules (guix) (guix profiles) (guix search-paths)
|
||||||
|
(gnu packages bootstrap))
|
||||||
|
(manifest
|
||||||
|
(list (manifest-entry
|
||||||
|
(name "test") (version "0")
|
||||||
|
(item (file-union "test"
|
||||||
|
`(("bin/hello"
|
||||||
|
,(program-file
|
||||||
|
"hello"
|
||||||
|
#~(begin
|
||||||
|
(add-to-load-path (getenv "HELLO_EXEC_PATH"))
|
||||||
|
(display (load-from-path "msg"))(newline))
|
||||||
|
#:guile %bootstrap-guile))
|
||||||
|
("libexec/hello/msg"
|
||||||
|
,(plain-file "msg" "42")))))
|
||||||
|
(search-paths
|
||||||
|
(list (search-path-specification
|
||||||
|
(variable "HELLO_EXEC_PATH")
|
||||||
|
(files '("libexec/hello"))
|
||||||
|
(separator #f)))))))
|
||||||
|
EOF
|
||||||
|
tarball="`guix pack -RR -S /opt= -m $test_directory/manifest.scm`"
|
||||||
|
(cd "$test_directory"; tar xvf "$tarball")
|
||||||
|
( export GUIX_PROFILE=$test_directory/opt
|
||||||
|
. $GUIX_PROFILE/etc/profile
|
||||||
|
run_without_store "$test_directory/opt/bin/hello" > "$test_directory/output" )
|
||||||
|
cat "$test_directory/output"
|
||||||
|
test "`cat $test_directory/output`" = "42"
|
||||||
|
|
Reference in a new issue