summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--gnu/packages/virtualization.scm214
1 files changed, 214 insertions, 0 deletions
diff --git a/gnu/packages/virtualization.scm b/gnu/packages/virtualization.scm
index c4c69c31be..f883e8d353 100644
--- a/gnu/packages/virtualization.scm
+++ b/gnu/packages/virtualization.scm
@@ -30,17 +30,22 @@
 (define-module (gnu packages virtualization)
   #:use-module (gnu packages)
   #:use-module (gnu packages admin)
+  #:use-module (gnu packages assembly)
   #:use-module (gnu packages attr)
   #:use-module (gnu packages autotools)
   #:use-module (gnu packages bison)
   #: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 disk)
   #:use-module (gnu packages dns)
   #:use-module (gnu packages docbook)
   #:use-module (gnu packages documentation)
+  #:use-module (gnu packages figlet)
+  #:use-module (gnu packages firmware)
   #:use-module (gnu packages flex)
   #:use-module (gnu packages fontutils)
   #:use-module (gnu packages gettext)
@@ -72,6 +77,7 @@
   #:use-module (gnu packages textutils)
   #:use-module (gnu packages tls)
   #:use-module (gnu packages web)
+  #:use-module (gnu packages wget)
   #:use-module (gnu packages xdisorg)
   #:use-module (gnu packages xml)
   #: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,
 DOS or Microsoft Windows.")
     (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"))))