;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2015, 2018, 2020, 2022 Ludovic Courtès ;;; Copyright © 2022 Chris Marusich ;;; Copyright © 2022 Pierre Langlois ;;; ;;; This file is part of GNU Guix. ;;; ;;; GNU Guix is free software; you can redistribute it and/or modify it ;;; under the terms of the GNU General Public License as published by ;;; the Free Software Foundation; either version 3 of the License, or (at ;;; your option) any later version. ;;; ;;; GNU Guix is distributed in the hope that it will be useful, but ;;; WITHOUT ANY WARRANTY; without even the implied warranty of ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;;; GNU General Public License for more details. ;;; ;;; You should have received a copy of the GNU General Public License ;;; along with GNU Guix. If not, see . (define-module (test-gremlin) #:use-module (guix elf) #:use-module (guix tests) #:use-module ((guix utils) #:select (call-with-temporary-directory target-aarch64?)) #:use-module (guix build utils) #:use-module (guix build gremlin) #:use-module (gnu packages bootstrap) #:use-module (srfi srfi-1) #:use-module (srfi srfi-26) #:use-module (srfi srfi-34) #:use-module (srfi srfi-64) #:use-module (rnrs io ports) #:use-module (ice-9 popen) #:use-module (ice-9 rdelim) #:use-module (ice-9 regex) #:use-module (ice-9 match)) (define %guile-executable (match (false-if-exception (readlink "/proc/self/exe")) ((? string? program) (and (file-exists? program) (elf-file? program) program)) (_ #f))) (define read-elf (compose parse-elf get-bytevector-all)) (define c-compiler (or (which "gcc") (which "cc") (which "g++"))) (test-begin "gremlin") (unless %guile-executable (test-skip 1)) (test-assert "elf-dynamic-info-needed, executable" (let* ((elf (call-with-input-file %guile-executable read-elf)) (dyninfo (elf-dynamic-info elf))) (or (not dyninfo) ;static executable (lset<= string=? (list (string-append "libguile-" (effective-version)) "libc") (map (lambda (lib) (string-take lib (string-contains lib ".so"))) (elf-dynamic-info-needed dyninfo)))))) (unless (and %guile-executable (not (getenv "LD_LIBRARY_PATH")) (file-needed %guile-executable) ;statically linked? ;; When Guix has been built on a foreign distro, using a ;; toolchain and libraries from that foreign distro, it is not ;; unusual for the runpath to be empty. (pair? (file-runpath %guile-executable))) (test-skip 1)) (test-assert "file-needed/recursive" (let* ((needed (file-needed/recursive %guile-executable)) (pipe (dynamic-wind (lambda () ;; Tell ld.so to list loaded objects, like 'ldd' does. (setenv "LD_TRACE_LOADED_OBJECTS" "yup")) (lambda () (open-pipe* OPEN_READ %guile-executable)) (lambda () (unsetenv "LD_TRACE_LOADED_OBJECTS"))))) (define ldd-rx (make-regexp "^[[:blank:]]+([[:graph:]]+ => )?([[:graph:]]+) .*$")) (define (read-ldd-output port) ;; Read from PORT output in GNU ldd format. (let loop ((result '())) (match (read-line port) ((? eof-object?) (reverse result)) ((= (cut regexp-exec ldd-rx <>) m) (if m (loop (cons (match:substring m 2) result)) (loop result)))))) (define ground-truth (remove (lambda (entry) ;; See vdso(7) for the list of vDSO names across ;; architectures. (or (string-prefix? "linux-vdso.so" entry) (string-prefix? "linux-vdso32.so" entry) ;32-bit powerpc (string-prefix? "linux-vdso64.so" entry) ;64-bit powerpc (string-prefix? "linux-gate.so" entry) ;i386 ;; FIXME: ELF files on aarch64 do not always include a ;; NEEDED entry for the dynamic linker, and it is unclear ;; if that is OK. See: https://issues.guix.gnu.org/52943 (and (target-aarch64?) (string-contai2020-09-28tests: Simplify shell exit status negation;...* tests/guix-archive.sh, tests/guix-build-branch.sh, tests/guix-build.sh, tests/guix-daemon.sh, tests/guix-download.sh, tests/guix-environment.sh, tests/guix-gc.sh, tests/guix-git-authenticate.sh, tests/guix-graph.sh, tests/guix-hash.sh, tests/guix-lint.sh, tests/guix-pack-relocatable.sh, tests/guix-pack.sh, tests/guix-package-aliases.sh, tests/guix-package-net.sh, tests/guix-package.sh: Use the shell '!' keyword to negate command exit status in place of 'if ...; then false; else true; fi' Eric Bavier 2019-12-12guix archive: Add '--list'....* guix/scripts/archive.scm (show-help, %options): Add '--list'. (list-contents): New procedure. (guix-archive): Honor the '--list' option. * tests/guix-archive.sh: Test it. * doc/guix.texi (Invoking guix archive): Document it. Ludovic Courtès 2015-10-19guix archive: Add '--extract'....* guix/scripts/archive.scm (show-help, %options): Add --extract. (guix-archive): Honor it. * tests/guix-archive.sh: Test it. * doc/guix.texi (Invoking guix archive): Document it. Ludovic Courtès 2015-05-19Merge branch 'nix'....* daemon.am (AM_CXXFLAGS): Change -std=c++0x to -std=c++11. (libstore_a_CPPFLAGS): Add -DDEFAULT_CHROOT_DIRS. (parse_opt): Use 'settings.get' instead of 'settings.dirsInChroot'. (main): Likewise. * tests/guix-archive.sh: Don't grep for the "importing ..." message since it is no longer produced. The nix/ part is a squashed commit of the following: commit 3bfa70b7963e12be346900e64ae45fa019850675 Author: Eelco Dolstra <eelco.dolstra@logicblox.com> Date: Wed Dec 10 13:53:04 2014 +0100 Don't wait for PID -1 The pid field can be -1 if forking the substituter process failed. commit 5241aec531e9c9a4b2dd5e5b6ee3f07ff049d9a5 Author: Eelco Dolstra <eelco.dolstra@logicblox.com> Date: Mon Nov 24 16:48:04 2014 +0100 Build derivations in a more predictable order Derivations are now built in order of derivation name, so a package named "aardvark" is built before "baboon". Fixes #399. commit 9f355738e106f4ca49bba7276e8d520a2fc2955d Author: Eelco Dolstra <eelco.dolstra@logicblox.com> Date: Mon Nov 24 16:44:35 2014 +0100 Don't create unnecessary substitution goals for derivations commit 554eaf5e8c82ddd6a42e4301f6d3dd5419c04060 Author: Eelco Dolstra <eelco.dolstra@logicblox.com> Date: Wed Nov 19 18:02:39 2014 +0100 Disable vacuuming the DB after garbage collection Especially in WAL mode on a highly loaded machine, this is not a good