;;; Copyright © 2017 Alex Vong <alexvong1995@gmail.com>
;;; Copyright © 2017 Andy Patterson <ajpatter@uwaterloo.ca>
;;; Copyright © 2017, 2018, 2019 Rutger Helling <rhelling@mykolab.com>
-;;; Copyright © 2017, 2018, 2019, 2020 Tobias Geerinckx-Rice <me@tobias.gr>
+;;; Copyright © 2017–2021 Tobias Geerinckx-Rice <me@tobias.gr>
;;; Copyright © 2018 Danny Milosavljevic <dannym@scratchpost.org>
;;; Copyright © 2018 Sou Bunnbu <iyzsong@member.fsf.org>
;;; Copyright © 2018 Julien Lepiller <julien@lepiller.eu>
;;; Copyright © 2020 Brice Waegeneire <brice@waegenei.re>
;;; Copyright © 2020 Mathieu Othacehe <m.othacehe@gmail.com>
;;; Copyright © 2020 Marius Bakke <mbakke@fastmail.com>
+;;; Copyright © 2020, 2021 Maxim Cournoyer <maxim.cournoyer@gmail.com>
+;;; Copyright © 2020 Brett Gilio <brettg@gnu.org>
+;;; Copyright © 2021 Leo Famulari <leo@famulari.name>
+;;; Copyright © 2021 Pierre Langlois <pierre.langlois@gmx.com>
;;;
;;; This file is part of GNU Guix.
;;;
#:use-module (gnu packages attr)
#:use-module (gnu packages autotools)
#:use-module (gnu packages backup)
+ #:use-module (gnu packages base)
#:use-module (gnu packages bison)
+ #:use-module (gnu packages build-tools)
#:use-module (gnu packages check)
#:use-module (gnu packages cmake)
#:use-module (gnu packages compression)
#:use-module (gnu packages cross-base)
#:use-module (gnu packages curl)
#:use-module (gnu packages cyrus-sasl)
+ #:use-module (gnu packages debian)
#:use-module (gnu packages disk)
#:use-module (gnu packages dns)
#:use-module (gnu packages docbook)
#:use-module (gnu packages gnome)
#:use-module (gnu packages gnupg)
#:use-module (gnu packages golang)
+ #:use-module (gnu packages graphviz)
#:use-module (gnu packages gtk)
+ #:use-module (gnu packages haskell)
+ #:use-module (gnu packages haskell-apps)
+ #:use-module (gnu packages haskell-check)
+ #:use-module (gnu packages haskell-crypto)
+ #:use-module (gnu packages haskell-web)
+ #:use-module (gnu packages haskell-xyz)
#:use-module (gnu packages image)
#:use-module (gnu packages libbsd)
#:use-module (gnu packages libusb)
#:use-module (gnu packages linux)
+ #:use-module (gnu packages m4)
#:use-module (gnu packages ncurses)
#:use-module (gnu packages nettle)
#:use-module (gnu packages networking)
+ #:use-module (gnu packages ninja)
#:use-module (gnu packages onc-rpc)
#:use-module (gnu packages package-management)
#:use-module (gnu packages perl)
+ #:use-module (gnu packages pcre)
#:use-module (gnu packages pkg-config)
#:use-module (gnu packages polkit)
#:use-module (gnu packages protobuf)
#:use-module (gnu packages python)
+ #:use-module (gnu packages python-build)
+ #:use-module (gnu packages python-check)
+ #:use-module (gnu packages python-crypto)
#:use-module (gnu packages python-web)
#:use-module (gnu packages python-xyz)
#:use-module (gnu packages pulseaudio)
#:use-module (gnu packages sdl)
#:use-module (gnu packages sphinx)
#:use-module (gnu packages spice)
+ #:use-module (gnu packages ssh)
#:use-module (gnu packages texinfo)
#:use-module (gnu packages textutils)
#:use-module (gnu packages tls)
#:use-module (guix packages)
#:use-module (guix utils)
#:use-module (srfi srfi-1)
+ #:use-module (srfi srfi-26)
#:use-module (ice-9 match))
(define (qemu-patch commit file-name sha256-bv)
(define-public qemu
(package
(name "qemu")
- (version "5.0.0")
- (source (origin
- (method url-fetch)
- (uri (string-append "https://download.qemu.org/qemu-"
- version ".tar.xz"))
- (sha256
- (base32
- "1dlcwyshdp94fwd30pddxf9bn2q8dfw5jsvry2gvdj551wmaj4rg"))))
+ (version "5.2.0")
+ (source
+ (origin
+ (method url-fetch)
+ (uri (string-append "https://download.qemu.org/qemu-"
+ version ".tar.xz"))
+ (sha256
+ (base32
+ "1g0pvx4qbirpcn9mni704y03n3lvkmw2c0rbcwvydyr8ns4xh66b"))
+ (patches (search-patches "qemu-CVE-2021-20203.patch"
+ "qemu-build-info-manual.patch"))
+ (modules '((guix build utils)))
+ (snippet
+ '(begin
+ ;; Fix a bug in the do_ioctl_ifconf() function of qemu to
+ ;; make ioctl(…, SIOCGIFCONF, …) work for emulated 64 bit
+ ;; architectures. The size of struct ifreq is handled
+ ;; incorrectly.
+ ;; https://lists.nongnu.org/archive/html/qemu-devel/2021-01/msg01545.html
+ (substitute* '("linux-user/syscall.c")
+ (("^([[:blank:]]*)const argtype ifreq_arg_type.*$" line indent)
+ (string-append line indent "const argtype ifreq_max_type[] = "
+ "{ MK_STRUCT(STRUCT_ifmap_ifreq) };\n"))
+ (("^([[:blank:]]*)target_ifreq_size[[:blank:]]=.*$" _ indent)
+ (string-append indent "target_ifreq_size = "
+ "thunk_type_size(ifreq_max_type, 0);")))
+ ;; Delete the bundled meson copy.
+ (delete-file-recursively "meson")))))
+ (outputs '("out" "static" "doc")) ;5.3 MiB of HTML docs
(build-system gnu-build-system)
(arguments
- `(;; Running tests in parallel can occasionally lead to failures, like:
- ;; boot_sector_test: assertion failed (signature == SIGNATURE): (0x00000000 == 0x0000dead)
- #:parallel-tests? #f
-
- ;; FIXME: Disable tests on i686 to work around
- ;; <https://bugs.gnu.org/40527>.
- #:tests? ,(or (%current-target-system)
+ ;; FIXME: Disable tests on i686 to work around
+ ;; <https://bugs.gnu.org/40527>.
+ `(#:tests? ,(or (%current-target-system)
(not (string=? "i686-linux" (%current-system))))
-
- #:configure-flags (list "--enable-usb-redir" "--enable-opengl"
- "--enable-docs"
- (string-append "--smbd="
- (assoc-ref %outputs "out")
- "/libexec/samba-wrapper")
- "--audio-drv-list=alsa,pa,sdl")
+ #:configure-flags
+ (let ((gcc (string-append (assoc-ref %build-inputs "gcc") "/bin/gcc"))
+ (out (assoc-ref %outputs "out")))
+ (list (string-append "--cc=" gcc)
+ ;; Some architectures insist on using HOST_CC.
+ (string-append "--host-cc=" gcc)
+ (string-append "--prefix=" out)
+ "--sysconfdir=/etc"
+ (string-append "--smbd=" out "/libexec/samba-wrapper")
+ "--disable-debug-info" ;for space considerations
+ ;; The binaries need to be linked against -lrt.
+ (string-append "--extra-ldflags=-lrt")))
;; Make build and test output verbose to facilitate investigation upon failure.
#:make-flags '("V=1")
#:modules ((srfi srfi-1)
+ (srfi srfi-26)
+ (ice-9 ftw)
(ice-9 match)
,@%gnu-build-system-modules)
#:phases
inputs)))
(set-path-environment-variable "C_INCLUDE_PATH"
'("include")
- input-directories)
- #t)))
- (add-after 'patch-source-shebangs 'patch-/bin/sh-references
+ input-directories))))
+ (add-after 'unpack 'extend-test-time-outs
+ (lambda _
+ ;; These tests can time out on heavily-loaded and/or slow storage.
+ (substitute* (cons* "tests/qemu-iotests/common.qemu"
+ (find-files "tests/qemu-iotests" "^[0-9]+$"))
+ (("QEMU_COMM_TIMEOUT=[0-9]+" match)
+ (string-append match "9")))))
+ (add-after 'unpack 'disable-unusable-tests
+ (lambda _
+ (substitute* "tests/meson.build"
+ ;; Comment out the test-qga test, which needs /sys and
+ ;; fails within the build environment.
+ (("tests.*test-qga.*$" all)
+ (string-append "# " all))
+ ;; Comment out the test-char test, which needs networking and
+ ;; fails within the build environment.
+ (("check-unit-.* tests/test-char" all)
+ (string-append "# " all)))))
+ (add-after 'patch-source-shebangs 'patch-embedded-shebangs
(lambda _
;; Ensure the executables created by these source files reference
;; /bin/sh from the store so they work inside the build container.
(substitute* '("block/cloop.c" "migration/exec.c"
"net/tap.c" "tests/qtest/libqtest.c")
(("/bin/sh") (which "sh")))
- #t))
+ (substitute* "Makefile"
+ (("SHELL = /usr/bin/env bash -o pipefail")
+ "SHELL = bash -o pipefail"))
+ (substitute* "tests/qemu-iotests/check"
+ (("#!/usr/bin/env python3")
+ (string-append "#!" (which "python3"))))))
+ (add-before 'configure 'fix-optionrom-makefile
+ (lambda _
+ ;; Work around the inability of the rules defined in this
+ ;; Makefile to locate the firmware files (e.g.: No rule to make
+ ;; target 'multiboot.bin') by extending the VPATH.
+ (substitute* "pc-bios/optionrom/Makefile"
+ (("^VPATH = \\$\\(SRC_DIR\\)")
+ "VPATH = $(SRC_DIR):$(TOPSRC_DIR)/pc-bios"))))
+ ;; XXX ./configure is being re-run at beginning of build phase...
(replace 'configure
- (lambda* (#:key inputs outputs (configure-flags '())
- #:allow-other-keys)
+ (lambda* (#:key inputs outputs configure-flags #:allow-other-keys)
;; The `configure' script doesn't understand some of the
;; GNU options. Thus, add a new phase that's compatible.
(let ((out (assoc-ref outputs "out")))
(setenv "SHELL" (which "bash"))
-
- ;; While we're at it, patch for tests.
- (substitute* "tests/qemu-iotests/check"
- (("#!/usr/bin/env python3")
- (string-append "#!" (which "python3"))))
-
;; Ensure config.status gets the correct shebang off the bat.
;; The build system gets confused if we change it later and
- ;; attempts to re-run the whole configury, and fails.
+ ;; attempts to re-run the whole configuration, and fails.
(substitute* "configure"
(("#!/bin/sh")
(string-append "#!" (which "sh"))))
-
- ;; The binaries need to be linked against -lrt.
- (setenv "LDFLAGS" "-lrt")
- (apply invoke
- `("./configure"
- ,(string-append "--cc=" (which "gcc"))
- ;; Some architectures insist on using HOST_CC
- ,(string-append "--host-cc=" (which "gcc"))
- "--disable-debug-info" ; save build space
- "--enable-virtfs" ; just to be sure
- ,(string-append "--prefix=" out)
- ,(string-append "--sysconfdir=/etc")
- ,@configure-flags)))))
- (add-after 'install 'install-info
+ (mkdir-p "b/qemu")
+ (chdir "b/qemu")
+ (apply invoke "../../configure" configure-flags))))
+ ;; Configure, build and install QEMU user-emulation static binaries.
+ (add-after 'configure 'configure-user-static
(lambda* (#:key inputs outputs #:allow-other-keys)
- ;; Install the Info manual, unless Texinfo is missing.
- (when (assoc-ref inputs "texinfo")
- (let* ((out (assoc-ref outputs "out"))
- (dir (string-append out "/share/info")))
- (invoke "make" "info")
- (for-each (lambda (info)
- (install-file info dir))
- (find-files "." "\\.info"))))
- #t))
+ (let* ((gcc (string-append (assoc-ref inputs "gcc") "/bin/gcc"))
+ (static (assoc-ref outputs "static"))
+ ;; This is the common set of configure flags; it is
+ ;; duplicated here to isolate this phase from manipulations
+ ;; to the #:configure-flags build argument, as done in
+ ;; derived packages such as qemu-minimal.
+ (configure-flags (list (string-append "--cc=" gcc)
+ (string-append "--host-cc=" gcc)
+ "--sysconfdir=/etc"
+ "--disable-debug-info")))
+ (mkdir-p "../user-static")
+ (with-directory-excursion "../user-static"
+ (apply invoke "../../configure"
+ "--static"
+ "--disable-docs" ;already built
+ "--disable-system"
+ "--enable-linux-user"
+ (string-append "--prefix=" static)
+ configure-flags)))))
+ (add-after 'build 'build-user-static
+ (lambda args
+ (with-directory-excursion "../user-static"
+ (apply (assoc-ref %standard-phases 'build) args))))
+ (add-after 'install 'install-user-static
+ (lambda* (#:key outputs #:allow-other-keys)
+ (let* ((static (assoc-ref outputs "static"))
+ (bin (string-append static "/bin")))
+ (with-directory-excursion "../user-static"
+ (for-each (cut install-file <> bin)
+ (append-map (cut find-files <> "^qemu-" #:stat stat)
+ (scandir "."
+ (cut string-suffix?
+ "-linux-user" <>))))))))
;; Create a wrapper for Samba. This allows QEMU to use Samba without
;; pulling it in as an input. Note that you need to explicitly install
;; Samba in your Guix profile for Samba support.
- (add-after 'install-info 'create-samba-wrapper
+ (add-after 'install 'create-samba-wrapper
(lambda* (#:key inputs outputs #:allow-other-keys)
- (let* ((out (assoc-ref %outputs "out"))
+ (let* ((out (assoc-ref outputs "out"))
(libexec (string-append out "/libexec")))
(call-with-output-file "samba-wrapper"
(lambda (port)
(format port "#!/bin/sh
exec smbd $@")))
(chmod "samba-wrapper" #o755)
- (install-file "samba-wrapper" libexec))
- #t))
- (add-before 'check 'disable-unusable-tests
+ (install-file "samba-wrapper" libexec))))
+ (add-after 'install 'move-html-doc
(lambda* (#:key inputs outputs #:allow-other-keys)
- (substitute* "tests/Makefile.include"
- ;; Comment out the test-qga test, which needs /sys and
- ;; fails within the build environment.
- (("check-unit-.* tests/test-qga" all)
- (string-append "# " all)))
- (substitute* "tests/Makefile.include"
- ;; Comment out the test-char test, which needs networking and
- ;; fails within the build environment.
- (("check-unit-.* tests/test-char" all)
- (string-append "# " all)))
- #t)))))
- (inputs ; TODO: Add optional inputs.
+ (let* ((out (assoc-ref outputs "out"))
+ (doc (assoc-ref outputs "doc"))
+ (qemu-doc (string-append doc "/share/doc/qemu-" ,version)))
+ (mkdir-p qemu-doc)
+ (rename-file (string-append out "/share/doc/qemu")
+ (string-append qemu-doc "/html"))))))))
+ (inputs ; TODO: Add optional inputs.
`(("alsa-lib" ,alsa-lib)
("attr" ,attr)
("glib" ,glib)
("gtk+" ,gtk+)
("libaio" ,libaio)
("libattr" ,attr)
- ("libcacard" ,libcacard) ; smartcard support
- ("libcap-ng" ,libcap-ng) ; virtfs support requires libcap-ng & libattr
+ ("libcacard" ,libcacard) ; smartcard support
+ ("libcap-ng" ,libcap-ng) ; virtfs support requires libcap-ng & libattr
("libdrm" ,libdrm)
("libepoxy" ,libepoxy)
("libjpeg" ,libjpeg-turbo)
("libpng" ,libpng)
("libseccomp" ,libseccomp)
- ("libusb" ,libusb) ;USB pass-through support
+ ("libusb" ,libusb) ;USB pass-through support
("mesa" ,mesa)
("ncurses" ,ncurses)
;; ("pciutils" ,pciutils)
("perl" ,perl)
("flex" ,flex)
("bison" ,bison)
+ ;; Using meson 0.57.1 enables reproducible QEMU builds.
+ ("meson" ,meson-next)
+ ("ninja" ,ninja)
("pkg-config" ,pkg-config)
("python-wrapper" ,python-wrapper)
("python-sphinx" ,python-sphinx)
- ("texinfo" ,texinfo)))
+ ("texinfo" ,texinfo)
+ ;; The following static libraries are required to build
+ ;; the static output of QEMU.
+ ("glib-static" ,glib-static)
+ ("pcre:static" ,pcre "static")
+ ("zlib:static" ,zlib "static")))
(home-page "https://www.qemu.org")
(synopsis "Machine emulator and virtualizer")
(description
(define-public qemu-minimal
;; QEMU without GUI support, only supporting the host's architecture
- (package (inherit qemu)
+ (package
+ (inherit qemu)
(name "qemu-minimal")
(synopsis
"Machine emulator and virtualizer (without GUI) for the host architecture")
(arguments
(substitute-keyword-arguments (package-arguments qemu)
- ((#:configure-flags _ '(list))
+ ((#:configure-flags configure-flags '(list))
;; Restrict to the host's architecture.
- (match (car (string-split (or (%current-target-system)
- (%current-system))
- #\-))
- ("i686"
- '(list "--target-list=i386-softmmu"))
- ("x86_64"
- '(list "--target-list=i386-softmmu,x86_64-softmmu"))
- ("mips64"
- '(list (string-append "--target-list=mips-softmmu,mipsel-softmmu,"
- "mips64-softmmu,mips64el-softmmu")))
- ("mips"
- '(list "--target-list=mips-softmmu,mipsel-softmmu"))
- ("aarch64"
- '(list "--target-list=arm-softmmu,aarch64-softmmu"))
- ("arm"
- '(list "--target-list=arm-softmmu"))
- ("alpha"
- '(list "--target-list=alpha-softmmu"))
- ("powerpc64"
- '(list "--target-list=ppc-softmmu,ppc64-softmmu"))
- ("powerpc"
- '(list "--target-list=ppc-softmmu"))
- ("s390"
- '(list "--target-list=s390x-softmmu"))
- ("riscv"
- '(list "--target-list=riscv32-softmmu,riscv64-softmmu"))
- (else ; An empty list actually builds all the targets.
- ''())))))
+ (let* ((system (or (%current-target-system)
+ (%current-system)))
+ (target-list-arg
+ (match system
+ ((? (cut string-prefix? "i686" <>))
+ "--target-list=i386-softmmu")
+ ((? (cut string-prefix? "x86_64" <>))
+ "--target-list=i386-softmmu,x86_64-softmmu")
+ ((? (cut string-prefix? "mips64" <>))
+ (string-append "--target-list=mips-softmmu,mipsel-softmmu,"
+ "mips64-softmmu,mips64el-softmmu"))
+ ((? (cut string-prefix? "mips" <>))
+ "--target-list=mips-softmmu,mipsel-softmmu")
+ ((? (cut string-prefix? "aarch64" <>))
+ "--target-list=arm-softmmu,aarch64-softmmu")
+ ((? (cut string-prefix? "arm" <>))
+ "--target-list=arm-softmmu")
+ ((? (cut string-prefix? "alpha" <>))
+ "--target-list=alpha-softmmu")
+ ((? (cut string-prefix? "powerpc64" <>))
+ "--target-list=ppc-softmmu,ppc64-softmmu")
+ ((? (cut string-prefix? "powerpc" <>))
+ "--target-list=ppc-softmmu")
+ ((? (cut string-prefix? "s390" <>))
+ "--target-list=s390x-softmmu")
+ ((? (cut string-prefix? "riscv" <>))
+ "--target-list=riscv32-softmmu,riscv64-softmmu")
+ (else ; An empty list actually builds all the targets.
+ '()))))
+ `(cons ,target-list-arg ,configure-flags)))))
;; Remove dependencies on optional libraries, notably GUI libraries.
(native-inputs (fold alist-delete (package-native-inputs qemu)
- '("gettext")))
+ '("gettext")))
(inputs (fold alist-delete (package-inputs qemu)
'("libusb" "mesa" "sdl2" "spice" "virglrenderer" "gtk+"
"usbredir" "libdrm" "libepoxy" "pulseaudio" "vde2"
"libcacard")))))
+(define (system->qemu-target system)
+ (cond
+ ((string-prefix? "i686" system)
+ "qemu-system-i386")
+ ((string-prefix? "arm" system)
+ "qemu-system-arm")
+ (else
+ (string-append "qemu-system-" (match (string-split system #\-)
+ ((arch kernel) arch)
+ (_ system))))))
+
+(define-public ganeti
+ (package
+ (name "ganeti")
+ ;; Note: we use a pre-release for Python 3 compatibility as well as many
+ ;; other fixes.
+ (version "3.0.0beta1-24-g024cc9fa2")
+ (source (origin
+ (method git-fetch)
+ (uri (git-reference
+ (url "https://github.com/ganeti/ganeti")
+ (commit (string-append "v" version))))
+ (sha256
+ (base32 "1ll34qd2mifni3bhg7cnir3xfnkafig8ch33qndqwrsby0y5ssia"))
+ (file-name (git-file-name name version))
+ (patches (search-patches "ganeti-shepherd-support.patch"
+ "ganeti-shepherd-master-failover.patch"
+ "ganeti-deterministic-manual.patch"
+ "ganeti-drbd-compat.patch"
+ "ganeti-os-disk-size.patch"
+ "ganeti-haskell-pythondir.patch"
+ "ganeti-disable-version-symlinks.patch"
+ "ganeti-preserve-PYTHONPATH.patch"))))
+ (build-system gnu-build-system)
+ (arguments
+ `(#:imported-modules (,@%gnu-build-system-modules
+ (guix build haskell-build-system)
+ (guix build python-build-system))
+ #:modules (,@%gnu-build-system-modules
+ ((guix build haskell-build-system) #:prefix haskell:)
+ ((guix build python-build-system) #:select (python-version))
+ (ice-9 rdelim))
+
+ ;; The default test target includes a lot of checks that are only really
+ ;; relevant for developers such as NEWS file checking, line lengths, etc.
+ ;; We are only interested in the "py-tests" and "hs-tests" targets: this
+ ;; is the closest we've got even though it includes a little more.
+ #:test-target "check-TESTS"
+
+ #:configure-flags
+ (list "--localstatedir=/var"
+ "--sharedstatedir=/var"
+ "--sysconfdir=/etc"
+ "--enable-haskell-tests"
+
+ ;; By default, the build system installs everything to versioned
+ ;; directories such as $libdir/3.0 and relies on a $libdir/default
+ ;; symlink pointed from /etc/ganeti/{lib,share} to actually function.
+ ;; This is done to accommodate installing multiple versions in
+ ;; parallel, but is of little use to us as Guix users can just
+ ;; roll back and forth. Thus, disable it for simplicity.
+ "--disable-version-links"
+
+ ;; Ganeti can optionally take control over SSH host keys and
+ ;; distribute them to nodes as they are added, and also rotate keys
+ ;; with 'gnt-cluster renew-crypto --new-ssh-keys'. Thus it needs to
+ ;; know how to restart the SSH daemon.
+ "--with-sshd-restart-command='herd restart ssh-daemon'"
+
+ ;; Look for OS definitions in this directory by default. It can
+ ;; be changed in the cluster configuration.
+ "--with-os-search-path=/run/current-system/profile/share/ganeti/os"
+
+ ;; The default QEMU executable to use. We don't use the package
+ ;; here because this entry is stored in the cluster configuration.
+ (string-append "--with-kvm-path=/run/current-system/profile/bin/"
+ ,(system->qemu-target (%current-system))))
+ #:phases
+ (modify-phases %standard-phases
+ (add-after 'unpack 'create-vcs-version
+ (lambda _
+ ;; If we are building from a git checkout, we need to create a
+ ;; 'vcs-version' file manually because the build system does
+ ;; not have access to the git repository information.
+ (unless (file-exists? "vcs-version")
+ (call-with-output-file "vcs-version"
+ (lambda (port)
+ (format port "v~a~%" ,version))))
+ #t))
+ (add-after 'unpack 'patch-absolute-file-names
+ (lambda _
+ (substitute* '("lib/utils/process.py"
+ "lib/utils/text.py"
+ "src/Ganeti/Constants.hs"
+ "src/Ganeti/HTools/CLI.hs"
+ "test/py/ganeti.config_unittest.py"
+ "test/py/ganeti.hooks_unittest.py"
+ "test/py/ganeti.utils.process_unittest.py"
+ "test/py/ganeti.utils.text_unittest.py"
+ "test/py/ganeti.utils.wrapper_unittest.py")
+ (("/bin/sh") (which "sh"))
+ (("/bin/bash") (which "bash"))
+ (("/usr/bin/env") (which "env"))
+ (("/bin/true") (which "true")))
+
+ ;; This script is called by the node daemon at startup to perform
+ ;; sanity checks on the cluster IP addresses, and it is also used
+ ;; in a master-failover scenario. Add absolute references to
+ ;; avoid propagating these executables.
+ (substitute* "tools/master-ip-setup"
+ (("arping") (which "arping"))
+ (("ndisc6") (which "ndisc6"))
+ (("fping") (which "fping"))
+ (("grep") (which "grep"))
+ (("ip addr") (string-append (which "ip") " addr")))
+ #t))
+ (add-after 'unpack 'override-builtin-PATH
+ (lambda _
+ ;; Ganeti runs OS install scripts and similar with a built-in
+ ;; hard coded PATH. Patch so it works on Guix System.
+ (substitute* "src/Ganeti/Constants.hs"
+ (("/sbin:/bin:/usr/sbin:/usr/bin")
+ "/run/setuid-programs:/run/current-system/profile/sbin:\
+/run/current-system/profile/bin"))
+ #t))
+ (add-after 'bootstrap 'patch-sphinx-version-detection
+ (lambda _
+ ;; The build system runs 'sphinx-build --version' to verify that
+ ;; the Sphinx is recent enough, but does not expect the
+ ;; .sphinx-build-real executable name created by the Sphinx wrapper.
+ (substitute* "configure"
+ (("\\$SPHINX --version 2>&1")
+ "$SPHINX --version 2>&1 | sed 's/.sphinx-build-real/sphinx-build/g'"))
+ #t))
+
+ ;; The build system invokes Cabal and GHC, which do not work with
+ ;; GHC_PACKAGE_PATH: <https://github.com/haskell/cabal/issues/3728>.
+ ;; Tweak the build system to do roughly what haskell-build-system does.
+ (add-before 'configure 'configure-haskell
+ (assoc-ref haskell:%standard-phases 'setup-compiler))
+ (add-after 'configure 'do-not-use-GHC_PACKAGE_PATH
+ (lambda _
+ (unsetenv "GHC_PACKAGE_PATH")
+ (substitute* "Makefile"
+ (("\\$\\(CABAL\\)")
+ "$(CABAL) --package-db=../package.conf.d")
+ (("\\$\\(GHC\\)")
+ "$(GHC) -package-db=../package.conf.d"))
+ #t))
+ (add-after 'configure 'make-ghc-use-shared-libraries
+ (lambda _
+ (substitute* "Makefile"
+ (("HFLAGS =") "HFLAGS = -dynamic -fPIC"))
+ #t))
+ (add-after 'configure 'fix-installation-directories
+ (lambda _
+ (substitute* "Makefile"
+ ;; Do not attempt to create /var during install.
+ (("\\$\\(DESTDIR\\)\\$\\{localstatedir\\}")
+ "$(DESTDIR)${prefix}${localstatedir}")
+ ;; Similarly, do not attempt to install the sample ifup scripts
+ ;; to /etc/ganeti.
+ (("\\$\\(DESTDIR\\)\\$\\(ifupdir\\)")
+ "$(DESTDIR)${prefix}$(ifupdir)"))
+ #t))
+ (add-before 'build 'adjust-tests
+ (lambda _
+ ;; Disable tests that can not run. Do it early to prevent
+ ;; touching the Makefile later and triggering a needless rebuild.
+ (substitute* "Makefile"
+ ;; These tests expect the presence of a 'root' user (via
+ ;; ganeti/runtime.py), which fails in the build environment.
+ (("test/py/ganeti\\.asyncnotifier_unittest\\.py") "")
+ (("test/py/ganeti\\.backend_unittest\\.py") "")
+ (("test/py/ganeti\\.daemon_unittest\\.py") "")
+ (("test/py/ganeti\\.tools\\.ensure_dirs_unittest\\.py") "")
+ (("test/py/ganeti\\.utils\\.io_unittest-runasroot\\.py") "")
+ ;; Disable the bash_completion test, as it requires the full
+ ;; bash instead of bash-minimal.
+ (("test/py/bash_completion\\.bash")
+ "")
+ ;; This test requires networking.
+ (("test/py/import-export_unittest\\.bash")
+ ""))
+
+ ;; Many of the Makefile targets reset PYTHONPATH before running
+ ;; the Python interpreter, which does not work very well for us.
+ (substitute* "Makefile"
+ (("PYTHONPATH=")
+ (string-append "PYTHONPATH=" (getenv "PYTHONPATH") ":")))
+ #t))
+ (add-after 'build 'build-bash-completions
+ (lambda _
+ (let ((orig-pythonpath (getenv "PYTHONPATH")))
+ (setenv "PYTHONPATH" (string-append ".:" orig-pythonpath))
+ (invoke "./autotools/build-bash-completion")
+ (setenv "PYTHONPATH" orig-pythonpath)
+ #t)))
+ (add-before 'check 'pre-check
+ (lambda* (#:key inputs #:allow-other-keys)
+ ;; Set TZDIR so that time zones are found.
+ (setenv "TZDIR" (string-append (assoc-ref inputs "tzdata")
+ "/share/zoneinfo"))
+
+ ;; This test checks whether PYTHONPATH is untouched, and extends
+ ;; it to include test directories if so. Add an else branch for
+ ;; our modified PYTHONPATH, in order to prevent a confusing test
+ ;; failure where expired certificates are not cleaned because
+ ;; check-cert-expired is silently crashing.
+ (substitute* "test/py/ganeti-cleaner_unittest.bash"
+ (("then export PYTHONPATH=(.*)" all testpath)
+ (string-append all "else export PYTHONPATH="
+ (getenv "PYTHONPATH") ":" testpath "\n")))
+
+ (substitute* "test/py/ganeti.utils.process_unittest.py"
+ ;; This test attempts to run an executable with
+ ;; RunCmd(..., reset_env=True), which fails because the default
+ ;; PATH from Constants.hs does not exist in the build container.
+ ((".*def testResetEnv.*" all)
+ (string-append " @unittest.skipIf(True, "
+ "\"cannot reset env in the build container\")\n"
+ all))
+
+ ;; XXX: Somehow this test fails in the build container, but
+ ;; works in 'guix environment -C', even without /bin/sh?
+ ((".*def testPidFile.*" all)
+ (string-append " @unittest.skipIf(True, "
+ "\"testPidFile fails in the build container\")\n"
+ all)))
+
+ ;; XXX: Why are these links not added automatically.
+ (with-directory-excursion "test/hs"
+ (for-each (lambda (file)
+ (symlink "../../src/htools" file))
+ '("hspace" "hscan" "hinfo" "hbal" "hroller"
+ "hcheck" "hail" "hsqueeze")))
+ #t))
+ (add-after 'install 'install-bash-completions
+ (lambda* (#:key outputs #:allow-other-keys)
+ (let* ((out (assoc-ref outputs "out"))
+ (compdir (string-append out "/etc/bash_completion.d")))
+ (mkdir-p compdir)
+ (copy-file "doc/examples/bash_completion"
+ (string-append compdir "/ganeti"))
+ ;; The one file contains completions for many different
+ ;; executables. Create symlinks for found completions.
+ (with-directory-excursion compdir
+ (for-each
+ (lambda (prog) (symlink "ganeti" prog))
+ (call-with-input-file "ganeti"
+ (lambda (port)
+ (let loop ((line (read-line port))
+ (progs '()))
+ (if (eof-object? line)
+ progs
+ (if (string-prefix? "complete" line)
+ (loop (read-line port)
+ ;; Extract "prog" from lines of the form:
+ ;; "complete -F _prog -o filenames prog".
+ ;; Note that 'burnin' is listed with the
+ ;; absolute file name, which is why we
+ ;; run everything through 'basename'.
+ (cons (basename (car (reverse (string-split
+ line #\ ))))
+ progs))
+ (loop (read-line port) progs))))))))
+ #t)))
+ ;; Wrap all executables with PYTHONPATH. We can't borrow the phase
+ ;; from python-build-system because we also need to wrap the scripts
+ ;; in $out/lib/ganeti such as "node-daemon-setup".
+ (add-after 'install 'wrap
+ (lambda* (#:key inputs outputs #:allow-other-keys)
+ (let* ((out (assoc-ref outputs "out"))
+ (sbin (string-append out "/sbin"))
+ (lib (string-append out "/lib"))
+ (python (assoc-ref inputs "python"))
+ (major+minor (python-version python))
+ (PYTHONPATH (string-append lib "/python" major+minor
+ "/site-packages:"
+ (getenv "PYTHONPATH"))))
+ (define (shell-script? file)
+ (call-with-ascii-input-file file
+ (lambda (port)
+ (let ((shebang (false-if-exception (read-line port))))
+ (and shebang
+ (string-prefix? "#!" shebang)
+ (or (string-contains shebang "/bin/bash")
+ (string-contains shebang "/bin/sh")))))))
+
+ (define (wrap? file)
+ ;; Do not wrap shell scripts because some are meant to be
+ ;; sourced, which breaks if they are wrapped. We do wrap
+ ;; the Haskell executables because some call out to Python
+ ;; directly.
+ (and (executable-file? file)
+ (not (symbolic-link? file))
+ (not (shell-script? file))))
+
+ (for-each (lambda (file)
+ (wrap-program file
+ `("PYTHONPATH" ":" prefix (,PYTHONPATH))))
+ (filter wrap?
+ (append (find-files (string-append lib "/ganeti"))
+ (find-files sbin))))
+ #t))))))
+ (native-inputs
+ `(("haskell" ,ghc)
+ ("cabal" ,cabal-install)
+ ("m4" ,m4)
+
+ ;; These inputs are necessary to bootstrap the package, because we
+ ;; have patched the build system.
+ ("autoconf" ,autoconf)
+ ("automake" ,automake)
+
+ ;; For the documentation.
+ ("python-docutils" ,python-docutils)
+ ("sphinx" ,python-sphinx)
+ ("pandoc" ,pandoc)
+ ("dot" ,graphviz)
+
+ ;; Test dependencies.
+ ("fakeroot" ,fakeroot)
+ ("ghc-temporary" ,ghc-temporary)
+ ("ghc-test-framework" ,ghc-test-framework)
+ ("ghc-test-framework-hunit" ,ghc-test-framework-hunit)
+ ("ghc-test-framework-quickcheck2" ,ghc-test-framework-quickcheck2)
+ ("python-mock" ,python-mock)
+ ("python-pyyaml" ,python-pyyaml)
+ ("openssh" ,openssh)
+ ("procps" ,procps)
+ ("shelltestrunner" ,shelltestrunner)
+ ("tzdata" ,tzdata-for-tests)))
+ (inputs
+ `(("arping" ,iputils) ;must be the iputils version
+ ("curl" ,curl)
+ ("fping" ,fping)
+ ("iproute2" ,iproute)
+ ("ndisc6" ,ndisc6)
+ ("socat" ,socat)
+ ("qemu" ,qemu-minimal) ;for qemu-img
+ ("ghc-attoparsec" ,ghc-attoparsec)
+ ("ghc-base64-bytestring" ,ghc-base64-bytestring)
+ ("ghc-cryptonite" ,ghc-cryptonite)
+ ("ghc-curl" ,ghc-curl)
+ ("ghc-hinotify" ,ghc-hinotify)
+ ("ghc-hslogger" ,ghc-hslogger)
+ ("ghc-json" ,ghc-json)
+ ("ghc-lens" ,ghc-lens)
+ ("ghc-lifted-base" ,ghc-lifted-base)
+ ("ghc-network" ,ghc-network)
+ ("ghc-old-time" ,ghc-old-time)
+ ("ghc-psqueue" ,ghc-psqueue)
+ ("ghc-regex-pcre" ,ghc-regex-pcre)
+ ("ghc-utf8-string" ,ghc-utf8-string)
+ ("ghc-zlib" ,ghc-zlib)
+
+ ;; For the optional metadata daemon.
+ ("ghc-snap-core" ,ghc-snap-core)
+ ("ghc-snap-server" ,ghc-snap-server)
+
+ ("python" ,python)
+ ("python-pyopenssl" ,python-pyopenssl)
+ ("python-simplejson" ,python-simplejson)
+ ("python-pyparsing" ,python-pyparsing)
+ ("python-pyinotify" ,python-pyinotify)
+ ("python-pycurl" ,python-pycurl)
+ ("python-bitarray" ,python-bitarray)
+ ("python-paramiko" ,python-paramiko)
+ ("python-psutil" ,python-psutil)))
+ (home-page "https://www.ganeti.org/")
+ (synopsis "Cluster-based virtual machine management system")
+ (description
+ "Ganeti is a virtual machine management tool built on top of existing
+virtualization technologies such as Xen or KVM. Ganeti controls:
+
+@itemize @bullet
+@item Disk creation management;
+@item Operating system installation for instances (in co-operation with
+OS-specific install scripts); and
+@item Startup, shutdown, and failover between physical systems.
+@end itemize
+
+Ganeti is designed to facilitate cluster management of virtual servers and
+to provide fast and simple recovery after physical failures, using
+commodity hardware.")
+ (license license:bsd-2)))
+
+(define-public ganeti-instance-guix
+ (package
+ (name "ganeti-instance-guix")
+ (version "0.6")
+ (home-page "https://github.com/mbakke/ganeti-instance-guix")
+ (source (origin
+ (method git-fetch)
+ (uri (git-reference (url home-page) (commit version)))
+ (file-name (git-file-name name version))
+ (sha256
+ (base32
+ "0aa08irpcpns6mhjgsplc5f0p8ab1qcr9ah1gj5z66kxgqyflzrp"))))
+ (build-system gnu-build-system)
+ (arguments
+ '(#:configure-flags '("--sysconfdir=/etc" "--localstatedir=/var")))
+ (native-inputs
+ `(("autoconf" ,autoconf)
+ ("automake" ,automake)))
+ (inputs
+ `(("util-linux" ,util-linux)
+ ("qemu-img" ,qemu-minimal)))
+ (synopsis "Guix OS integration for Ganeti")
+ (description
+ "This package provides a guest OS definition for Ganeti that uses
+Guix to build virtual machines.")
+ (license license:gpl3+)))
+
+(define-public ganeti-instance-debootstrap
+ (package
+ (name "ganeti-instance-debootstrap")
+ ;; We need two commits on top of the latest release for compatibility
+ ;; with newer sfdisk, as well as gnt-network integration.
+ (version "0.16-2-ge145396")
+ (home-page "https://github.com/ganeti/instance-debootstrap")
+ (source (origin
+ (method git-fetch)
+ (uri (git-reference (url home-page) (commit version)))
+ (file-name (git-file-name name version))
+ (sha256
+ (base32
+ "0f2isw9d8lawzj21rrq1q9xhq8xfa65rqbhqmrn59z201x9q1336"))))
+ (build-system gnu-build-system)
+ (arguments
+ '(#:configure-flags '("--sysconfdir=/etc" "--localstatedir=/var")
+ #:phases (modify-phases %standard-phases
+ (add-after 'unpack 'add-absolute-references
+ (lambda _
+ (substitute* "common.sh.in"
+ (("/sbin/blkid") (which "blkid"))
+ (("kpartx -")
+ (string-append (which "kpartx") " -")))
+ (substitute* "import"
+ (("restore -r")
+ (string-append (which "restore") " -r")))
+ (substitute* "export"
+ (("dump -0")
+ (string-append (which "dump") " -0")))
+ (substitute* "create"
+ (("debootstrap") (which "debootstrap"))
+ (("`which run-parts`") (which "run-parts"))
+ ;; Here we actually need to hard code /bin/passwd
+ ;; because it's called via chroot, which fails if
+ ;; "/bin" is not in PATH.
+ (("passwd") "/bin/passwd"))
+ #t))
+ (add-after 'unpack 'set-dpkg-arch
+ (lambda* (#:key system #:allow-other-keys)
+ ;; The create script passes --arch to debootstrap,
+ ;; and defaults to `dpkg --print-architecture` when
+ ;; ARCH is not set in variant.conf. Hard code the
+ ;; build-time architecture to avoid the dpkg dependency.
+ (let ((dpkg-arch
+ (cond ((string-prefix? "x86_64" system)
+ "amd64")
+ ((string-prefix? "i686" system)
+ "i386")
+ ((string-prefix? "aarch64" system)
+ "arm64")
+ (else (car (string-split system #\-))))))
+ (substitute* "create"
+ (("`dpkg --print-architecture`")
+ dpkg-arch))
+ #t)))
+ (add-after 'configure 'adjust-Makefile
+ (lambda _
+ ;; Do not attempt to create /etc/ganeti/instance-debootstrap
+ ;; and /etc/default/ganeti-instance-debootstrap during install.
+ ;; They are created by the Ganeti service.
+ (substitute* "Makefile"
+ (("\\$\\(variantsdir\\)")
+ "$(prefix)/etc/ganeti/instance-debootstrap/variants")
+ (("\\$\\(defaultsdir\\)")
+ "$(prefix)/etc/default/ganeti-instance-debootstrap"))
+ #t))
+ (add-after 'install 'make-variants.list-symlink
+ (lambda* (#:key outputs #:allow-other-keys)
+ ;; The Ganeti OS API mandates a variants.list file that
+ ;; describes all supported "variants" of this OS.
+ ;; Guix generates this file, so make the original file
+ ;; a symlink to it.
+ (with-directory-excursion (string-append
+ (assoc-ref outputs "out")
+ "/share/ganeti/os/debootstrap")
+ (delete-file "variants.list")
+ (symlink "/etc/ganeti/instance-debootstrap/variants/variants.list"
+ "variants.list"))
+ #t)))))
+ (native-inputs
+ `(("autoconf" ,autoconf)
+ ("automake" ,automake)))
+ (inputs
+ `(("debianutils" ,debianutils)
+ ("debootstrap" ,debootstrap)
+ ("dump" ,dump)
+ ("kpartx" ,multipath-tools)
+ ("util-linux" ,util-linux)))
+ (synopsis "Debian OS integration for Ganeti")
+ (description
+ "This package provides a guest OS definition for Ganeti. It installs
+Debian or a derivative using @command{debootstrap}.")
+ (license license:gpl2+)))
+
(define-public libosinfo
(package
(name "libosinfo")
(native-inputs
`(("glib" ,glib "bin") ; glib-mkenums, etc.
("gobject-introspection" ,gobject-introspection)
- ("gtk-doc" ,gtk-doc)
+ ("gtk-doc" ,gtk-doc/stable)
("vala" ,vala)
("intltool" ,intltool)
("pkg-config" ,pkg-config)
(define-public lxc
(package
(name "lxc")
- (version "3.1.0")
+ (version "4.0.6")
(source (origin
(method url-fetch)
(uri (string-append
version ".tar.gz"))
(sha256
(base32
- "1igxqgx8q9cp15mcp1y8j564bl85ijw04jcmgb1s5bmfbg1751sd"))))
+ "0qz4l7mlhq7hx53q606qgvkyzyr01glsw290v8ppzvxn1fydlrci"))))
(build-system gnu-build-system)
(native-inputs
`(("pkg-config" ,pkg-config)))
(define-public libvirt
(package
(name "libvirt")
- (version "5.8.0")
+ (version "7.1.0")
(source
(origin
(method url-fetch)
(uri (string-append "https://libvirt.org/sources/libvirt-"
version ".tar.xz"))
(sha256
- (base32 "0m8cqaqflvys5kaqpvb0qr4k365j09jc5xk6x70yvg8qkcl2hcz2"))
+ (base32 "0v50ckf56h6jd9bmqwp0lh2cmb7qqjmcb6y3mz2i2r15h06ih3w7"))
(patches
- (search-patches "libvirt-create-machine-cgroup.patch"))))
- (build-system gnu-build-system)
+ (search-patches "libvirt-do-not-create-var-dirs.patch"))))
+ (build-system meson-build-system)
(arguments
- `(#:configure-flags
- (list "--with-qemu"
- "--with-qemu-user=nobody"
- "--with-qemu-group=kvm"
- "--with-polkit"
- (string-append "--docdir=" (assoc-ref %outputs "out") "/share/doc/"
- ,name "-" ,version)
- "--sysconfdir=/etc"
- "--localstatedir=/var")
+ `(#:meson ,meson-0.55 ;; libvirt requires meson 0.54 or higher.
+ #:configure-flags
+ (list "-Ddriver_qemu=enabled"
+ "-Dqemu_user=nobody"
+ "-Dqemu_group=kvm"
+ "-Dpolkit=enabled")
#:phases
(modify-phases %standard-phases
- (add-before 'configure 'fix-BOURNE_SHELL-definition
- ;; BOURNE_SHELL is hard-#defined to ‘/bin/sh’, causing test failures.
+ (add-after 'unpack 'fix-sysconfdir-and-localstatedir
(lambda _
- (substitute* "config.h.in"
- (("/bin/sh") (which "sh")))
- #t))
- (add-before 'configure 'patch-libtirpc-file-names
- (lambda* (#:key inputs #:allow-other-keys)
- ;; libvirt uses an m4 macro instead of pkg-config to determine where
- ;; the RPC headers are located. Tell it to look in the right place.
- (substitute* "configure"
- (("/usr/include/tirpc") ;defined in m4/virt-xdr.m4
- (string-append (assoc-ref inputs "libtirpc")
- "/include/tirpc")))
+ (substitute* "meson.build"
+ ;; We set the prefix to be the package output, but we need
+ ;; localstatedir to be /var. Sadly the build system doesn't
+ ;; seem to allow that easily.
+ (("localstatedir = prefix / get_option\\('localstatedir'\\)")
+ "localstatedir = get_option('localstatedir')")
+ ;; On the other hand, we keep sysconfdir using the prefix so
+ ;; that we install configuration files in the package output.
+ ;; However, we need to make sure the C code refers to /etc via
+ ;; SYSCONFDIR, and not the read-only configuration in the
+ ;; package output.
+ (("set_quoted\\('SYSCONFDIR', sysconfdir\\)")
+ "set_quoted('SYSCONFDIR', '/etc')"))
#t))
(add-before 'configure 'disable-broken-tests
(lambda _
- (let ((tests (list "commandtest" ; hangs idly
- "qemuxml2argvtest" ; fails
- "qemuhotplugtest" ; fails
- "virnetsockettest" ; tries to network
- "virshtest"))) ; fails
- (substitute* "tests/Makefile.in"
- (((format #f "(~a)\\$\\(EXEEXT\\)" (string-join tests "|")))
- ""))
- #t)))
- (replace 'install
- ;; Since the sysconfdir and localstatedir should be /etc and /var
- ;; at runtime, we must prevent writing to them at installation
- ;; time.
- (lambda* (#:key make-flags #:allow-other-keys)
- (apply invoke "make" "install"
- "sysconfdir=/tmp/etc"
- "localstatedir=/tmp/var"
- make-flags))))))
+ (substitute* "tests/meson.build"
+ (("\\{ 'name': 'commandtest'.*") "") ; hangs idly
+ (("\\{ 'name': 'qemuxml2argvtest'.*") "") ; fails
+ (("\\{ 'name': 'virnetsockettest'.*") "")) ; tries to network
+ #t)))))
(inputs
`(("libxml2" ,libxml2)
("eudev" ,eudev)
("perl" ,perl)
("pkg-config" ,pkg-config)
("polkit" ,polkit)
- ("python" ,python-wrapper)))
+ ("python" ,python-wrapper)
+ ("python-docutils" ,python-docutils) ;for rst2html
+ ("rpcsvc-proto" ,rpcsvc-proto))) ;for 'rpcgen'
(home-page "https://libvirt.org")
(synopsis "Simple API for virtualization")
(description "Libvirt is a C toolkit to interact with the virtualization
("vte" ,vte)
("python-libvirt" ,python-libvirt)
("python-requests" ,python-requests)
- ("python-ipaddress" ,python-ipaddress)
("python-pycairo" ,python-pycairo)
("python-pygobject" ,python-pygobject)
("python-libxml2" ,python-libxml2)
(define-public criu
(package
(name "criu")
- (version "3.14")
+ (version "3.15")
(source (origin
(method url-fetch)
(uri (string-append "https://download.openvz.org/criu/criu-"
version ".tar.bz2"))
(sha256
(base32
- "1jrr3v99g18gc0hriz0avq6ccdvyya0j6wwz888sdsc4icc30gzn"))))
+ "09d0j24x0cyc7wkgi7cnxqgfjk7kbdlm79zxpj8d356sa3rw2z24"))))
(build-system gnu-build-system)
(arguments
`(#:test-target "test"
("libcap" ,libcap)
("libnet" ,libnet)
("libnl" ,libnl)
- ("libbsd" ,libbsd)))
+ ("libbsd" ,libbsd)
+ ("nftables" ,nftables)))
(native-inputs
`(("pkg-config" ,pkg-config)
("perl" ,perl)
"-xvf" source))))
(replace 'build
(lambda* (#:key import-path #:allow-other-keys)
- (chdir (string-append "src/" import-path))
- ;; XXX: requires 'go-md2man'.
- ;; (invoke "make" "man")
- (invoke "make")))
+ (with-directory-excursion (string-append "src/" import-path)
+ ;; XXX: requires 'go-md2man'.
+ ;; (invoke "make" "man")
+ (invoke "make"))))
;; (replace 'check
;; (lambda _
;; (invoke "make" "localunittest")))
(replace 'install
- (lambda* (#:key outputs #:allow-other-keys)
- (let ((out (assoc-ref outputs "out")))
- (invoke "make" "install" "install-bash"
- (string-append "PREFIX=" out))))))))
+ (lambda* (#:key import-path outputs #:allow-other-keys)
+ (with-directory-excursion (string-append "src/" import-path)
+ (let ((out (assoc-ref outputs "out")))
+ (invoke "make" "install" "install-bash"
+ (string-append "PREFIX=" out)))))))))
(native-inputs
`(("pkg-config" ,pkg-config)))
(inputs
"-xvf" source))))
(replace 'build
(lambda* (#:key import-path #:allow-other-keys)
- (chdir (string-append "src/" import-path))
- ;; TODO: build manpages with 'go-md2man'.
- (invoke "make" "SHELL=bash")))
+ (with-directory-excursion (string-append "src/" import-path)
+ ;; TODO: build manpages with 'go-md2man'.
+ (invoke "make" "SHELL=bash"))))
(replace 'install
- (lambda* (#:key outputs #:allow-other-keys)
+ (lambda* (#:key import-path outputs #:allow-other-keys)
(let* ((out (assoc-ref outputs "out"))
(bindir (string-append out "/bin")))
- (install-file "umoci" bindir)
+ (install-file (string-append "src/" import-path "/umoci")
+ bindir)
#t))))))
(home-page "https://umo.ci/")
(synopsis "Tool for modifying Open Container images")
(define-public skopeo
(package
(name "skopeo")
- (version "0.1.40")
+ (version "1.2.2")
(source (origin
(method git-fetch)
(uri (git-reference
- (url "https://github.com/projectatomic/skopeo")
+ (url "https://github.com/containers/skopeo")
(commit (string-append "v" version))))
(file-name (git-file-name name version))
(sha256
(base32
- "1bagirzdzjhicn5dr691092ac3q6lhz3xngjzgqiqkxnvpz7p6cn"))))
+ "03sznybn3rqjyplc6w4b7mfa6gas8db15p5vnmfm1xqw72ldylgc"))))
(build-system go-build-system)
(native-inputs
- `(("pkg-config" ,pkg-config)))
+ `(("pkg-config" ,pkg-config)
+ ("go-github-com-go-md2man" ,go-github-com-go-md2man)))
(inputs
`(("btrfs-progs" ,btrfs-progs)
("eudev" ,eudev)
("glib" ,glib)
("gpgme" ,gpgme)))
(arguments
- '(#:import-path "github.com/projectatomic/skopeo"
+ '(#:import-path "github.com/containers/skopeo"
#:install-source? #f
- #:tests? #f ; The tests require Docker
+ #:tests? #f ; The tests require Docker
#:phases
(modify-phases %standard-phases
(replace 'build
(lambda* (#:key import-path #:allow-other-keys)
- (chdir (string-append "src/" import-path))
- ;; TODO: build manpages with 'go-md2man'.
- (invoke "make" "binary-local")))
+ (with-directory-excursion (string-append "src/" import-path)
+ (invoke "make" "bin/skopeo"))))
+ (add-after 'build 'build-docs
+ (lambda* (#:key import-path #:allow-other-keys)
+ (with-directory-excursion (string-append "src/" import-path)
+ (invoke "make" "docs"))))
(replace 'install
- (lambda* (#:key outputs #:allow-other-keys)
- (let ((out (assoc-ref outputs "out")))
- (invoke "make" "install-binary" "install-completions"
- (string-append "PREFIX=" out))))))))
- (home-page "https://github.com/projectatomic/skopeo")
+ (lambda* (#:key import-path outputs #:allow-other-keys)
+ (with-directory-excursion (string-append "src/" import-path)
+ (let ((out (assoc-ref outputs "out")))
+ (install-file "default-policy.json"
+ (string-append out "/etc/containers"))
+ (invoke "make" "install-binary" "install-completions" "install-docs"
+ (string-append "PREFIX=" out)))))))))
+ (home-page "https://github.com/containers/skopeo")
(synopsis "Interact with container images and container image registries")
(description
"@command{skopeo} is a command line utility providing various operations
(inputs
`(("libcap" ,libcap)))
(native-inputs
- `(("python-2" ,python-2)
+ `(("python" ,python-wrapper)
("util-linux" ,util-linux)))
(home-page "https://github.com/containers/bubblewrap")
(synopsis "Unprivileged sandboxing tool")
(define-public xen
(package
(name "xen")
- (version "4.13.0")
+ (version "4.14.1")
(source (origin
(method git-fetch)
(uri (git-reference
(file-name (git-file-name name version))
(sha256
(base32
- "0py50n995gv909i0d1lfdcj9wcp5g1d5z6m2291jqqlfyany138g"))))
+ "1r90rvypw76ya9clqw5p02gm1k8hxz73f7gr95ca778nnzvb7xjw"))))
(build-system gnu-build-system)
(arguments
`(#:configure-flags
new-search-path ":")))
(setenv env-name new-env-value)))
environment-variable-names))
- (setenv "CROSS_CPATH" (getenv "CPATH"))
+ (setenv "CROSS_C_INCLUDE_PATH" (getenv "C_INCLUDE_PATH"))
+ (setenv "CROSS_CPLUS_INCLUDE_PATH" (getenv "CPLUS_INCLUDE_PATH"))
(setenv "CROSS_LIBRARY_PATH" (getenv "LIBRARY_PATH"))
(filter-environment! cross?
- '("CROSS_CPATH"
+ '("CROSS_C_INCLUDE_PATH" "CROSS_CPLUS_INCLUDE_PATH"
"CROSS_LIBRARY_PATH"))
(filter-environment! (lambda (e) (not (cross? e)))
- '("CPATH"
+ '("C_INCLUDE_PATH" "CPLUS_INCLUDE_PATH"
"LIBRARY_PATH"))
;; Guix tries to be helpful and automatically adds
;; mini-os-git-checkout/include to the include path,
(not
(string-contains e
"mini-os-git-checkout")))
- '("CPATH"
+ '("C_INCLUDE_PATH" "CPLUS_INCLUDE_PATH"
"LIBRARY_PATH"))
(setenv "EFI_VENDOR" "guix")
#t))
(define-public osinfo-db
(package
(name "osinfo-db")
- (version "20200529")
+ (version "20201218")
(source (origin
(method url-fetch)
(uri (string-append "https://releases.pagure.org/libosinfo/osinfo-db-"
version ".tar.xz"))
(sha256
(base32
- "0mbrf9j5wmjhc6jixvhp4jqyxixh1717lqrmzmipdg99xnzba81n"))))
+ "0ydbindwgw7kg861rqii5036gq0dbbbmv35dzrmmv937ddfsxwh0"))))
(build-system trivial-build-system)
(arguments
`(#:modules ((guix build utils))
libosinfo library. It provides information about guest operating systems for
use with virtualization provisioning tools")
(license license:lgpl2.0+)))
+
+(define-public python-transient
+ (package
+ (name "python-transient")
+ (version "0.12")
+ (source
+ (origin
+ (method url-fetch)
+ (uri (pypi-uri "transient" version))
+ (sha256
+ (base32
+ "148yiqrmcscsi6787y0f27i1y9cf0gcw3mqfv5frhpmsmv62mv5z"))))
+ (build-system python-build-system)
+ (arguments
+ `(#:tests? #f ; Requires behave
+ #:phases (modify-phases %standard-phases
+ (add-after 'unpack 'fix-dependencies
+ (lambda _
+ (substitute* "setup.py"
+ (("==")
+ ">="))
+ #t)))))
+ (propagated-inputs
+ `(("python-beautifultable" ,python-beautifultable)
+ ("python-click" ,python-click)
+ ("python-importlib-resources"
+ ,python-importlib-resources)
+ ("python-lark-parser" ,python-lark-parser)
+ ("python-marshmallow" ,python-marshmallow)
+ ("python-progressbar2" ,python-progressbar2)
+ ("python-requests" ,python-requests)
+ ("python-toml" ,python-toml)))
+ (native-inputs
+ `(("python-black" ,python-black)
+ ("python-mypy" ,python-mypy)
+ ("python-pyhamcrest" ,python-pyhamcrest)
+ ("python-twine" ,python-twine)))
+ (home-page
+ "https://github.com/ALSchwalm/transient")
+ (synopsis
+ "QEMU Wrapper written in Python")
+ (description
+ "@code{transient} is a wrapper for QEMU allowing the creation of virtual
+machines with shared folder, ssh, and disk creation support.")
+ (license license:expat)))