gnu: Add xen.

* gnu/packages/virtualization.scm (xen): New variable.
This commit is contained in:
Danny Milosavljevic 2019-01-21 10:13:38 +01:00
parent e3634bd0a3
commit 35e8900da0
No known key found for this signature in database
GPG Key ID: E71A35542C30BAA5
1 changed files with 214 additions and 0 deletions

View File

@ -30,17 +30,22 @@
(define-module (gnu packages virtualization) (define-module (gnu packages virtualization)
#:use-module (gnu packages) #:use-module (gnu packages)
#:use-module (gnu packages admin) #:use-module (gnu packages admin)
#:use-module (gnu packages assembly)
#:use-module (gnu packages attr) #:use-module (gnu packages attr)
#:use-module (gnu packages autotools) #:use-module (gnu packages autotools)
#:use-module (gnu packages bison) #:use-module (gnu packages bison)
#:use-module (gnu packages check) #:use-module (gnu packages check)
#:use-module (gnu packages cmake)
#:use-module (gnu packages compression) #:use-module (gnu packages compression)
#:use-module (gnu packages cross-base)
#:use-module (gnu packages curl) #:use-module (gnu packages curl)
#:use-module (gnu packages cyrus-sasl) #:use-module (gnu packages cyrus-sasl)
#:use-module (gnu packages disk) #:use-module (gnu packages disk)
#:use-module (gnu packages dns) #:use-module (gnu packages dns)
#:use-module (gnu packages docbook) #:use-module (gnu packages docbook)
#:use-module (gnu packages documentation) #:use-module (gnu packages documentation)
#:use-module (gnu packages figlet)
#:use-module (gnu packages firmware)
#:use-module (gnu packages flex) #:use-module (gnu packages flex)
#:use-module (gnu packages fontutils) #:use-module (gnu packages fontutils)
#:use-module (gnu packages gettext) #:use-module (gnu packages gettext)
@ -72,6 +77,7 @@
#:use-module (gnu packages textutils) #:use-module (gnu packages textutils)
#:use-module (gnu packages tls) #:use-module (gnu packages tls)
#:use-module (gnu packages web) #:use-module (gnu packages web)
#:use-module (gnu packages wget)
#:use-module (gnu packages xdisorg) #:use-module (gnu packages xdisorg)
#:use-module (gnu packages xml) #:use-module (gnu packages xml)
#:use-module (gnu packages xorg) #:use-module (gnu packages xorg)
@ -1103,3 +1109,211 @@ x86 CPUs, from early 386 to the most recent x86-64 Intel and AMD processors.
Bochs can run most Operating Systems inside the emulation including Linux, Bochs can run most Operating Systems inside the emulation including Linux,
DOS or Microsoft Windows.") DOS or Microsoft Windows.")
(license license:lgpl2.0+))) (license license:lgpl2.0+)))
;; TODO: "make world"
(define-public xen
(package
(name "xen")
(version "4.11.1")
(source (origin
(method git-fetch)
(uri (git-reference
(url "git://xenbits.xenproject.org/xen.git")
(commit (string-append "RELEASE-" version))))
(file-name (git-file-name name version))
(sha256
(base32
"1wv1hyfii14vi9lfjmnv07h2gpm3b7kvh2p55f4yy2b40simksgk"))))
(build-system gnu-build-system)
(arguments
`(#:configure-flags
(list "--enable-rpath"
"--disable-qemu-traditional" ; It tries to do "git clone"
"--disable-rombios" ; would try to "git clone" via etherboot.
;"--disable-seabios" ; It tries to do "git clone"
;; TODO: Re-enable stubdom (it's "more secure" to use it).
"--disable-stubdom" ; tries to "git clone" old patched newlib.
(string-append "--with-initddir="
(assoc-ref %outputs "out")
"/etc/init.d")
(string-append "--with-system-qemu="
(assoc-ref %build-inputs "qemu")
"/bin/qemu-system-i386")
(string-append "--with-system-seabios="
(assoc-ref %build-inputs "seabios")
"/share/firmware/bios.bin")
(string-append "--with-system-ovmf="
(assoc-ref %build-inputs "ovmf")
"/share/firmware/ovmf_ia32.bin"))
#:make-flags (list "-j" "1"
"XEN_BUILD_DATE=Thu Jan 1 01:00:01 CET 1970"
"XEN_BUILD_TIME=01:00:01"
"XEN_BUILD_HOST="
"ETHERBOOT_NICS="
"SMBIOS_REL_DATE=01/01/1970"
"VGABIOS_REL_DATE=01 Jan 1970"
; QEMU_TRADITIONAL_LOC
; QEMU_UPSTREAM_LOC
"SYSCONFIG_DIR=/tmp/etc/default"
(string-append "BASH_COMPLETION_DIR="
(assoc-ref %outputs "out")
"/etc/bash_completion.d")
(string-append "BOOT_DIR="
(assoc-ref %outputs "out")
"/boot")
(string-append "DEBUG_DIR="
(assoc-ref %outputs "out")
"/lib/debug")
(string-append "EFI_DIR="
(assoc-ref %outputs "out")
"/lib/efi") ; TODO lib64 ?
"MINIOS_UPSTREAM_URL="
;(string-append "DISTDIR="
; (assoc-ref %outputs "out"))
)
#:test-target "test"
#:phases
(modify-phases %standard-phases
(add-after 'unpack 'unpack-mini-os
(lambda* (#:key inputs #:allow-other-keys)
(copy-recursively (assoc-ref inputs "mini-os") "extras/mini-os")
#t))
(add-after 'unpack-mini-os 'patch
(lambda* (#:key inputs outputs #:allow-other-keys)
(substitute* "tools/firmware/Rules.mk"
(("override XEN_TARGET_ARCH = x86_32")
(string-append "override XEN_TARGET_ARCH = x86_32
override CC = " (assoc-ref inputs "cross-gcc") "/bin/i686-linux-gnu-gcc"))
(("^CFLAGS =$")
(string-append "CFLAGS=-I" (assoc-ref inputs "cross-libc")
"/include\n")))
(substitute* "config/x86_32.mk"
(("CFLAGS += -m32 -march=i686")
(string-append "CFLAGS += -march=i686 -I"
(assoc-ref inputs "cross-libc")
"/include")))
;; Tries to use "git clone".
(substitute* "tools/firmware/Makefile"
(("\\+= etherboot") "+="))
;; /var is not in /gnu/store , so don't try to create it.
(substitute* '("tools/Makefile"
"tools/xenstore/Makefile"
"tools/xenpaging/Makefile")
(("\\$\\(INSTALL_DIR\\) .*XEN_(DUMP|LOG|RUN|LIB|PAGING)_DIR.*")
"\n")
(("\\$\\(INSTALL_DIR\\) .*XEN_(RUN|LIB)_STORED.*")
"\n"))
;; Prevent xen from creating /etc .
(substitute* "tools/examples/Makefile"
((" install-readmes") "")
((" install-configs") ""))
;; Set rpath.
(substitute* "tools/pygrub/setup.py"
(("library_dirs =")
; TODO: extra_link_args = ['-Wl,-rpath=/opt/foo'],
(string-append "runtime_library_dirs = ['"
(assoc-ref outputs "out")
"/lib'],\nlibrary_dirs =")))
#t))
(add-before 'configure 'patch-xen-script-directory
(lambda* (#:key outputs #:allow-other-keys)
(substitute* '("configure"
"tools/configure"
"docs/configure")
(("XEN_SCRIPT_DIR=.*")
(string-append "XEN_SCRIPT_DIR="
(assoc-ref outputs "out")
"/etc/xen/scripts")))
#t))
(add-before 'configure 'set-environment-up
(lambda* (#:key make-flags #:allow-other-keys)
(define (cross? x)
(string-contains x "cross-i686-linux"))
(define (filter-environment! filter-predicate
environment-variable-names)
(for-each
(lambda (env-name)
(let* ((env-value (getenv env-name))
(search-path (search-path-as-string->list env-value))
(new-search-path (filter filter-predicate
search-path))
(new-env-value (list->search-path-as-string
new-search-path ":")))
(setenv env-name new-env-value)))
environment-variable-names))
(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_C_INCLUDE_PATH" "CROSS_CPLUS_INCLUDE_PATH"
"CROSS_LIBRARY_PATH"))
(filter-environment! (lambda (e) (not (cross? e)))
'("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,
;; but actually we don't want it to be there (yet).
(filter-environment! (lambda (e)
(not
(string-contains e
"mini-os-git-checkout")))
'("C_INCLUDE_PATH" "CPLUS_INCLUDE_PATH"
"LIBRARY_PATH"))
(setenv "EFI_VENDOR" "guix")
#t))
(replace 'build
(lambda* (#:key make-flags #:allow-other-keys)
(apply invoke "make" "world" make-flags))))))
(inputs
`(("acpica" ,acpica) ; TODO: patch iasl invocation.
("bridge-utils" ,bridge-utils) ; TODO: patch invocations.
("glib" ,glib)
("iproute" ,iproute) ; TODO: patch invocations.
("libaio" ,libaio)
("libx11" ,libx11)
("libyajl" ,libyajl)
("ncurses" ,ncurses)
("openssl" ,openssl)
("ovmf" ,ovmf)
("pixman" ,pixman)
("qemu" ,qemu-minimal)
("seabios" ,seabios)
("util-linux" ,util-linux) ; uuid
; TODO: ocaml-findlib, ocaml-nox.
("xz" ,xz) ; for liblzma
("zlib" ,zlib)))
(native-inputs
`(("dev86" ,dev86)
("bison" ,bison)
("cmake" ,cmake)
("figlet" ,figlet)
("flex" ,flex)
("gettext" ,gettext-minimal)
("libnl" ,libnl)
("mini-os"
,(origin
(method git-fetch)
(uri (git-reference
(url "http://xenbits.xen.org/git-http/mini-os.git")
(commit (string-append "xen-RELEASE-" version))))
(sha256
(base32
"1i8pcl19n60i2m9vlg79q3nknpj209c9ic5x10wxaicx45kc107f"))
(file-name "mini-os-git-checkout")))
("perl" ,perl)
; TODO: markdown
("pkg-config" ,pkg-config)
("python" ,python-2)
("wget" ,wget)
("cross-gcc" ,(cross-gcc "i686-linux-gnu"
#:xbinutils (cross-binutils "i686-linux-gnu")
#:libc (cross-libc "i686-linux-gnu")))
("cross-libc" ,(cross-libc "i686-linux-gnu")) ; header files
("cross-libc-static" ,(cross-libc "i686-linux-gnu") "static")))
(home-page "https://xenproject.org/")
(synopsis "Xen Virtual Machine Monitor")
(description "This package provides the Xen Virtual Machine Monitor
which is a hypervisor.")
;; TODO: Some files are licensed differently. List those.
(license license:gpl2)
(supported-systems '("i686-linux" "x86_64-linux" "armhf-linux"))))