diff --git a/guix/scripts/shell.scm b/guix/scripts/shell.scm index a2836629ad..7a379122ae 100644 --- a/guix/scripts/shell.scm +++ b/guix/scripts/shell.scm @@ -143,16 +143,7 @@ interactive shell in that environment.\n")) (option '(#\F "emulate-fhs") #f #f (lambda (opt name arg result) - (let ((result - ;; For an FHS-container, add the (hidden) - ;; package glibc-for-fhs which uses the global - ;; cache at /etc/ld.so.cache. - (alist-cons - 'expression - '(ad-hoc-package - "(@@ (gnu packages base) glibc-for-fhs)") - result))) - (alist-cons 'emulate-fhs? #t result))))) + (alist-cons 'emulate-fhs? #t result)))) (filter-map (lambda (opt) (and (not (any (lambda (name) (member name to-remove)) @@ -173,8 +164,18 @@ interactive shell in that environment.\n")) ;; The '--' token is used to separate the command to run from the rest of ;; the operands. (let ((args command (break (cut string=? "--" <>) args))) - (let ((opts (parse-command-line args %options (list %default-options) - #:argument-handler handle-argument))) + (let* ((args-parsed (parse-command-line args %options (list %default-options) + #:argument-handler handle-argument)) + ;; For an FHS-container, add the (hidden) package glibc-for-fhs + ;; which uses the global cache at /etc/ld.so.cache. We handle + ;; adding this package here to ensure it will always appear in the + ;; container as it is the first package in OPTS. + (opts (if (assoc-ref args-parsed 'emulate-fhs?) + (alist-cons 'expression + '(ad-hoc-package + "(@@ (gnu packages base) glibc-for-fhs)") + args-parsed) + args-parsed))) (options-with-caching (auto-detect-manifest (match command diff --git a/tests/guix-environment-container.sh b/tests/guix-environment-container.sh index f233c3fcc0..fb2c19b193 100644 --- a/tests/guix-environment-container.sh +++ b/tests/guix-environment-container.sh @@ -1,5 +1,6 @@ # GNU Guix --- Functional package management for GNU # Copyright © 2015 David Thompson +# Copyright © 2022 John Kehayias # # This file is part of GNU Guix. # @@ -231,3 +232,12 @@ guix shell -C --emulate-fhs --bootstrap guile-bootstrap \ # Test that the ld cache was generated and can be successfully read. guix shell -CF --bootstrap guile-bootstrap \ -- guile -c '(execlp "ldconfig" "ldconfig" "-p")' + +# Test that the package glibc-for-fhs is in the container even if there is the +# regular glibc package from another source. See +# . +guix shell -CF --bootstrap guile-bootstrap glibc \ + -- guile -c '(exit (if (string-contains (readlink "/lib/libc.so") + "glibc-for-fhs") + 0 + 1))'