summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gnu/packages/hurd.scm248
1 files changed, 235 insertions, 13 deletions
diff --git a/gnu/packages/hurd.scm b/gnu/packages/hurd.scm
index 51848faacd..e6935dea9b 100644
--- a/gnu/packages/hurd.scm
+++ b/gnu/packages/hurd.scm
@@ -34,6 +34,7 @@
#:use-module (guix build-system trivial)
#:use-module (gnu packages autotools)
#:use-module (gnu packages compression)
+ #:use-module (gnu packages cross-base)
#:use-module (gnu packages flex)
#:use-module (gnu packages gawk)
#:use-module (gnu packages gnupg)
@@ -47,7 +48,8 @@
#:use-module (gnu packages texinfo)
#:use-module (gnu packages onc-rpc)
#:use-module (gnu packages xorg) ;libpciaccess-0.17
- #:use-module (guix git-download))
+ #:use-module (guix git-download)
+ #:use-module (ice-9 match))
(define (hurd-source-url version)
(string-append "mirror://gnu/hurd/hurd-"
@@ -148,9 +150,7 @@ communication.")
(list autoconf
automake
(if (%current-target-system)
- (let* ((cross-base (resolve-interface '(gnu packages cross-base)))
- (cross-mig (module-ref cross-base 'cross-mig)))
- (cross-mig (%current-target-system)))
+ (cross-mig (%current-target-system))
mig)))
(arguments
`(#:phases
@@ -282,10 +282,8 @@ Hurd-minimal package which are needed for both glibc and GCC.")
(list autoconf
automake
(if (%current-target-system)
- (let* ((cross-base (resolve-interface '(gnu packages cross-base)))
- (cross-mig (module-ref cross-base 'cross-mig)))
- (cross-mig (%current-target-system)))
- mig)
+ (cross-mig (%current-target-system))
+ mig)
perl
texinfo-4))
(supported-systems %hurd-systems)
@@ -537,11 +535,9 @@ exec ${system}/rc \"$@\"
`(("autoconf" ,autoconf)
("automake" ,automake)
("libgcrypt" ,libgcrypt) ;for 'libgcrypt-config'
- ("mig" ,(if (%current-target-system)
- (let* ((cross-base (resolve-interface '(gnu packages cross-base)))
- (cross-mig (module-ref cross-base 'cross-mig)))
- (cross-mig (%current-target-system)))
- mig))
+ ("mig" , (if (%current-target-system)
+ (cross-mig (%current-target-system))
+ mig))
("pkg-config" ,pkg-config)
("perl" ,perl)
("texinfo" ,texinfo-4)
@@ -637,3 +633,229 @@ in userland processes thanks to the DDE layer.")
;; Some drivers are dually licensed with the options being GPLv2 or one
;; of MPL/Expat/BSD-3 (dependent on the driver).
(license gpl2))))
+
+(define-public rumpkernel
+ (let ((commit "81043d42fabda9baed7ac9ca36e3f3f5ed11ba81")
+ (revision "3"))
+ (package
+ (name "rumpkernel")
+ (version (git-version "0-20211031" revision commit))
+ ;; This uses the Debian Salsa rumpkernel package git as upstream as that
+ ;; is where development happens. Once things have stabilized, upstream
+ ;; may change to the NetBSD git from where Debian takes their snapshots.
+ (source (origin
+ (method git-fetch)
+ (uri (git-reference
+ (url "https://salsa.debian.org/hurd-team/rumpkernel.git")
+ (commit commit)))
+ (sha256
+ (base32
+ "0fv0k52qqcg3nq9012hibgsamvsd7mnvn2ikdasmzjhsp8qh5q3r"))
+ (file-name (git-file-name name commit))))
+ (build-system gnu-build-system)
+ (arguments
+ (list
+ #:tests? #f
+ #:modules '((srfi srfi-26)
+ (ice-9 rdelim)
+ (guix build utils)
+ (guix build gnu-build-system))
+ ;; As we are using the Debian package as upstream, we follow their
+ ;; build:
+ ;; * apply patches in debian/patches taken from the
+ ;; debian/patches/series file
+ ;; * for the configure, make, and install stages, follow
+ ;; the code in debian/rules
+ ;; The Debian patchset includes a cross build feature that we
+ ;; use with two differences
+ ;; * Debian uses a multiarch toolchain
+ ;; * we use cross-mig
+ #:phases
+ #~(modify-phases %standard-phases
+ (add-after 'unpack 'apply-patches
+ (lambda* (#:key target #:allow-other-keys)
+ (let* ((patch-directory "debian/patches/")
+ (series (string-append patch-directory "series"))
+ (text (with-input-from-file series read-string))
+ (lines (string-split (string-trim-right text) #\newline))
+ (patches (filter (negate (cute string-prefix? "#" <>))
+ lines))
+ (patch-files (map
+ (cute string-append patch-directory <>)
+ patches)))
+ (for-each
+ (cute invoke "patch" "--force" "-p1" "-i" <>)
+ patch-files)
+ ;; Somewhere in the build.sh/make process MIG is not being
+ ;; exported, apparently.
+ (let* ((prefix (if (not target) "" (string-append target "-")))
+ (mig (string-append prefix "mig")))
+ (substitute* "pci-userspace/src-gnu/Makefile.inc"
+ (("MIG=mig")
+ (string-append "MIG=" mig)))))))
+ (add-before 'configure 'setenv
+ (lambda* (#:key build target #:allow-other-keys)
+ (define (noisy-setenv name value)
+ (setenv name value)
+ (format (current-error-port) "set ~a=~s\n" name value))
+ (noisy-setenv "HOST_CC" "gcc")
+ (let* ((prefix (if (not target) "" (string-append target "-"))))
+ (noisy-setenv "TARGET_AR" (string-append prefix "ar"))
+ (noisy-setenv "TARGET_CC" (string-append prefix "gcc"))
+ (noisy-setenv "TARGET_CXX" (string-append prefix "g++"))
+ (noisy-setenv "TARGET_LD" (string-append prefix "ld"))
+ (noisy-setenv "TARGET_MIG" (string-append prefix "mig"))
+ (noisy-setenv "TARGET_NM" (string-append prefix "nm"))
+ (noisy-setenv "MIG" (string-append prefix "mig")))
+ (setenv "PAWD" "pwd")
+ (for-each
+ (cute noisy-setenv <> "")
+ '("_GCC_CRTENDS"
+ "_GCC_CRTEND"
+ "_GCC_CRTBEGINS"
+ "_GCC_CRTBEGIN"
+ "_GCC_CRTI"
+ "_GCC_CRTN"))))
+ (replace 'configure
+ (lambda args
+ (let ((configure (assoc-ref %standard-phases 'configure)))
+ (with-directory-excursion "buildrump.sh/src/lib/librumpuser"
+ (apply configure args)))))
+ ;; The build has three toplevel entry points
+ ;; * buildrump.sh/src/build.sh: create a NetBSD-compatible
+ ;; toolchain and supports cross-compiling
+ ;; * buildrump.sh/src/lib/librumpuser: the librump* libraries
+ ;; * pci-userspace/src-gnu: the librumpdev_pci* libraries
+ (replace 'build
+ (lambda* (#:key parallel-build? #:allow-other-keys)
+ (let* ((jobs (if parallel-build? (parallel-job-count) 1))
+ (host-cpu #$(match (or (%current-target-system)
+ (%current-system))
+ ((? target-x86-32?)
+ "i386")
+ ((? target-x86-64?)
+ "amd64")))
+ (toprump (string-append
+ (getcwd)
+ "/buildrump.sh/src/sys/rump"))
+ (rump-make (string-append
+ (getcwd)
+ "/buildrump.sh/src/obj/tooldir/bin/nbmake-"
+ host-cpu)))
+ (mkdir "obj")
+ (with-directory-excursion "buildrump.sh/src"
+ (invoke
+ "sh" "build.sh"
+ "-V" "TOOLS_BUILDRUMP=yes"
+ "-V" "MKBINUTILS=no"
+ "-V" "MKGDB=no"
+ "-V" "MKGROFF=no"
+ "-V" (string-append "TOPRUMP=" toprump)
+ "-V" "BUILDRUMP_CPPFLAGS=-Wno-error=stringop-overread"
+ "-V" "RUMPUSER_EXTERNAL_DPLIBS=pthread"
+ "-V" (string-append
+ "CPPFLAGS="
+ " -I../../obj/destdir." host-cpu "/usr/include"
+ " -D_FILE_OFFSET_BITS=64"
+ " -DRUMP_REGISTER_T=int"
+ " -DRUMPUSER_CONFIG=yes"
+ " -DNO_PCI_MSI_MSIX=yes"
+ " -DNUSB_DMA=1")
+ "-V" (string-append
+ "CWARNFLAGS="
+ " -Wno-error=maybe-uninitialized"
+ " -Wno-error=address-of-packed-member"
+ " -Wno-error=unused-variable"
+ " -Wno-error=stack-protector"
+ " -Wno-error=array-parameter"
+ " -Wno-error=array-bounds"
+ " -Wno-error=stringop-overflow")
+ "-V" "LIBCRTBEGIN="
+ "-V" "LIBCRTEND="
+ "-V" "LIBCRT0="
+ "-V" "LIBCRTI="
+ "-V" "_GCC_CRTENDS="
+ "-V" "_GCC_CRTEND="
+ "-V" "_GCC_CRTBEGINS="
+ "-V" "_GCC_CRTBEGIN="
+ "-V" "_GCC_CRTI="
+ "-V" "_GCC_CRTN="
+ "-U"
+ "-u"
+ "-T" "./obj/tooldir"
+ "-m" host-cpu
+ "-j" (number->string jobs)
+ "tools"
+ "rump"))
+ (with-directory-excursion "buildrump.sh/src/lib/librumpuser"
+ (setenv "RUMPRUN" "true")
+ (invoke rump-make "dependall"))
+ (with-directory-excursion "pci-userspace/src-gnu"
+ (invoke rump-make "dependall")))))
+ (replace 'install
+ (lambda _
+ (define (install-file file target)
+ (let ((dest (string-append target (basename file))))
+ (format (current-output-port) "`~a' -> `~a'~%" file dest)
+ (mkdir-p (dirname dest))
+ ;; Some libraries are duplicated/copied around in the
+ ;; build system, do not fail trying to install one
+ ;; a second time.
+ (if (file-exists? dest)
+ (format (current-error-port)
+ "warning: skipping: ~a\n" file)
+ (let ((stat (lstat file)))
+ (case (stat:type stat)
+ ((symlink)
+ (let ((target (readlink file)))
+ (symlink target dest)))
+ (else
+ (copy-file file dest)))))))
+ (let ((header (string-append #$output "/include/rump"))
+ (lib (string-append #$output "/lib/")))
+ (mkdir-p header)
+ (copy-recursively "buildrump.sh/src/sys/rump/include/rump"
+ header)
+ (mkdir-p lib)
+ (for-each
+ (cute install-file <> lib)
+ (append (find-files "buildrump.sh/src" "librump.*[.](a|so.*)")
+ (find-files "obj" "librump.*[.](a|so.*)")))))))))
+ (inputs
+ (list gnumach-headers libpciaccess-0.17))
+ (native-inputs
+ (list autoconf
+ automake
+ libgcrypt
+ (if (%current-target-system)
+ (cross-mig (%current-target-system))
+ mig)
+ zlib))
+ (supported-systems %hurd-systems)
+ (home-page "https://wiki.netbsd.org/rumpkernel")
+ (synopsis "NetBSD as rumpkernel for the GNU/Hurd")
+ (description
+ "This package provides NetBSD as rumpkernel for the GNU/Hurd, so that
+the Hurd may be installed on iron. Using this rumpkernel package, the hurd
+package's rumpdisk can be built which provides the pci.arbiter and rumpdisk
+servers.")
+ (license
+ ;; The NetBSD rumpkernel code is a big hodgepodge of softwares many of
+ ;; which have their own different licensing terms, see also
+ ;; https://salsa.debian.org/hurd-team/rumpkernel/-/blob/master/debian/copyright
+ (list asl2.0
+ boost1.0
+ bsd-2
+ bsd-3
+ bsd-4
+ cddl1.0
+ expat
+ gpl1
+ gpl2+
+ gpl3+
+ isc
+ lgpl2.0+
+ public-domain
+ (@ (guix licenses) zlib)
+ (non-copyleft "file://src/lib/libc/hash/hashhl.c"
+ "See debian/copyright in the distribution."))))))