me
/
guix
Archived
1
0
Fork 0

pack: ‘-R’ (once) does not include fakechroot fallback.

Previously, ‘guix pack -R’ would build a wrapper containing both the
“userns” and “fakechroot” engines, instead of providing nothing but the
“userns” engine as the manual says.  This patch fixes it.

* guix/scripts/pack.scm (wrapped-package): Add #:fakechroot?
[build]: When FAKECHROOT? is false, ‘elf-loader-compile-flags’ always
returns '().

Change-Id: Ic75cc8c36bf0a3881f299b274d78bd9fc2d4e2bb
master
Ludovic Courtès 2024-04-12 11:48:26 +02:00 committed by Ludovic Courtès
parent 5f89f45e74
commit a15db2ee50
No known key found for this signature in database
GPG Key ID: 090B11993D9AEBB5
1 changed files with 40 additions and 38 deletions

View File

@ -1,5 +1,5 @@
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2015, 2017-2023 Ludovic Courtès <ludo@gnu.org>
;;; Copyright © 2015, 2017-2024 Ludovic Courtès <ludo@gnu.org>
;;; Copyright © 2017, 2018 Ricardo Wurmus <rekado@elephly.net>
;;; Copyright © 2018 Konrad Hinsen <konrad.hinsen@fastmail.net>
;;; Copyright © 2018 Chris Marusich <cmmarusich@gmail.com>
@ -1066,10 +1066,11 @@ please email '~a'~%")
#:optional
(output* "out")
(compiler (c-compiler))
#:key proot?)
#:key proot? (fakechroot? proot?))
"Return the OUTPUT of PACKAGE with its binaries wrapped such that they are
relocatable. When PROOT? is true, include PRoot in the result and use it as a
last resort for relocation."
last resort for relocation. When FAKECHROOT? is true, include
libfakechroot.so and related ld.so machinery as a fallback."
(define runner
(local-file (search-auxiliary-file "run-in-namespace.c")))
@ -1161,43 +1162,44 @@ last resort for relocation."
(define (elf-loader-compile-flags program)
;; Return the cpp flags defining macros for the ld.so/fakechroot
;; wrapper of PROGRAM.
#$(if fakechroot?
;; TODO: Handle scripts by wrapping their interpreter.
#~(if (elf-file? program)
(let* ((bv (call-with-input-file program
get-bytevector-all))
(elf (parse-elf bv))
(interp (elf-interpreter elf))
(gconv (and interp
(string-append (dirname interp)
"/gconv"))))
(if interp
(list (string-append "-DPROGRAM_INTERPRETER=\""
interp "\"")
(string-append "-DFAKECHROOT_LIBRARY=\""
#$(fakechroot-library) "\"")
;; TODO: Handle scripts by wrapping their interpreter.
(if (elf-file? program)
(let* ((bv (call-with-input-file program
get-bytevector-all))
(elf (parse-elf bv))
(interp (elf-interpreter elf))
(gconv (and interp
(string-append (dirname interp)
"/gconv"))))
(if interp
(list (string-append "-DPROGRAM_INTERPRETER=\""
interp "\"")
(string-append "-DFAKECHROOT_LIBRARY=\""
#$(fakechroot-library) "\"")
(string-append "-DLOADER_AUDIT_MODULE=\""
#$(audit-module) "\"")
(string-append "-DLOADER_AUDIT_MODULE=\""
#$(audit-module) "\"")
;; XXX: Normally (runpath #$(audit-module)) is
;; enough. However, to work around
;; <https://sourceware.org/bugzilla/show_bug.cgi?id=26634>
;; (glibc <= 2.32), pass the whole search path of
;; PROGRAM, which presumably is a superset of that
;; of the audit module.
(string-append "-DLOADER_AUDIT_RUNPATH={ "
(string-join
(map object->string
(runpath program))
", " 'suffix)
"NULL }")
(if gconv
(string-append "-DGCONV_DIRECTORY=\""
gconv "\"")
"-UGCONV_DIRECTORY"))
'()))
'()))
;; XXX: Normally (runpath #$(audit-module)) is
;; enough. However, to work around
;; <https://sourceware.org/bugzilla/show_bug.cgi?id=26634>
;; (glibc <= 2.32), pass the whole search path of
;; PROGRAM, which presumably is a superset of that
;; of the audit module.
(string-append "-DLOADER_AUDIT_RUNPATH={ "
(string-join
(map object->string
(runpath program))
", " 'suffix)
"NULL }")
(if gconv
(string-append "-DGCONV_DIRECTORY=\""
gconv "\"")
"-UGCONV_DIRECTORY"))
'()))
'())
#~'()))
(define (build-wrapper program)
;; Build a user-namespace wrapper for PROGRAM.