Package: guix-patches;
Reported by: Homo <gay <at> disroot.org>
Date: Sun, 8 Dec 2024 08:29:03 UTC
Severity: normal
Tags: patch
Done: Sharlatan Hellseher <sharlatanus <at> gmail.com>
Bug is archived. No further changes may be made.
Message #5 received at submit <at> debbugs.gnu.org (full text, mbox):
From: Homo <gay <at> disroot.org> To: guix-patches <at> gnu.org Cc: Homo <gay <at> disroot.org> Subject: [PATCH] gnu: Add inferno Date: Sun, 8 Dec 2024 02:24:09 +0200
Based on earlier work rejected for licensing reasons, code has been relicensed from LPL to MIT and all fonts are removed from distribution, instead fonts from plan9port are used. --- gnu/local.mk | 1 + gnu/packages/inferno.scm | 336 +++++++++++++++++++ gnu/packages/patches/inferno-fix-crash.patch | 14 + 3 files changed, 351 insertions(+) create mode 100644 gnu/packages/inferno.scm create mode 100644 gnu/packages/patches/inferno-fix-crash.patch diff --git a/gnu/local.mk b/gnu/local.mk index a7bd32453b..42dcf82ea3 100644 --- a/gnu/local.mk +++ b/gnu/local.mk @@ -375,6 +375,7 @@ GNU_SYSTEM_MODULES = \ %D%/packages/image-processing.scm \ %D%/packages/image-viewers.scm \ %D%/packages/imagemagick.scm \ + %D%/packages/inferno.scm \ %D%/packages/inklingreader.scm \ %D%/packages/inkscape.scm \ %D%/packages/installers.scm \ diff --git a/gnu/packages/inferno.scm b/gnu/packages/inferno.scm new file mode 100644 index 0000000000..b4a60ad34c --- /dev/null +++ b/gnu/packages/inferno.scm @@ -0,0 +1,336 @@ +;;; GNU Guix --- Functional package management for GNU +;;; Copyright © 2018 Diego Nicola Barbato <dnbarbato <at> posteo.de> +;;; Copyright © 2024 Homo <gay <at> disroot.org> +;;; +;;; 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 <http://www.gnu.org/licenses/>. + +(define-module (gnu packages inferno) + #:use-module (guix build-system gnu) + #:use-module (guix git-download) + #:use-module (guix packages) + #:use-module ((guix licenses) + #:prefix license:) + #:use-module (gnu packages plan9) + #:use-module (gnu packages xorg) + #:use-module (ice-9 match)) + +(define-public inferno + (let ((commit "67e70befb2ad0058fd7894be34c492ddb6d09988") + (revision "0")) + (package + (name "inferno") + (version (git-version "4" revision commit)) + (source + (origin + (method git-fetch) + (uri (git-reference + (url "https://github.com/inferno-os/inferno-os") + (commit commit) + ;; Inferno uses customized Freetype library with #include "lib9.h" + ;; TODO: use packaged Freetype library. + (recursive? #t))) + (file-name (git-file-name name version)) + (sha256 + (base32 "0g3fzb991hbwa7r3vsnybw7m1v13nins5ajmygnvz4vmx5rzl405")) + (patches (search-patches "inferno-fix-crash.patch")) + ;; Remove bundled non-free and potentially non-free fonts. + (modules '((guix build utils))) + (snippet '(begin + (delete-file-recursively "fonts") #t)))) + (build-system gnu-build-system) + (inputs `(("libx11" ,libx11) + ("libxext" ,libxext) + ("plan9port" ,plan9port) + ("xorgproto" ,xorgproto))) + (arguments + `( ;Force a 32-bit build targeting a similar architecture, i.e.: + ;; armhf for armhf/aarch64, i686 for i686/x86_64. + #:system ,@(match (%current-system) + ((or "armhf-linux" "aarch64-linux") + `("armhf-linux")) + (_ `("i686-linux"))) + #:phases (let* ((bash (assoc-ref %build-inputs "bash")) + (objtype ,@(match (%current-system) + ((or "armhf-linux" "aarch64-linux") + `("arm")) + (_ `("386")))) + (out (assoc-ref %outputs "out")) + (root (string-append out "/share/inferno")) + (root/bindir (string-append root "/Linux/" objtype + "/bin")) + (root/fontdir (string-append root "/fonts")) + (simulate-fonts (lambda (size targets) + (string-concatenate (map (lambda (file) + (string-append + "ramfile /fonts/" + file + ".font; " + "bind /fonts/fixed/unicode." + size + ".font /fonts/" + file + ".font; ")) + targets)))) + (bindir (string-append out "/bin")) + (emu-script (string-append bindir "/emu")) + (infwm-script (string-append bindir "/infwm"))) + `(,(assoc 'set-paths %standard-phases) (unpack unquote + (lambda* (#:key + source + #:allow-other-keys) + ;; Extract directly to 'root' since the source + ;; tree doubles as Inferno's root directory + ;; and its path is baked into the emu binary. + (mkdir-p + root) + (copy-recursively + source + root) + (chdir + root) + #t)) + (patch-src-files unquote + (lambda _ + ;; Substitute ocurrences of /bin/sh. + (for-each (lambda (file) + (substitute* file + (("/bin/sh") + (string-append bash + "/bin/sh")))) + '("makemk.sh" + "mkfiles/mkhost-Linux" + "emu/Linux/mk-wrt" + "utils/mk/Posix.c")) + ;; Do not pass '-m32' unconditionally + ;; when building mk. + (substitute* "makemk.sh" + (("-m32") + "")) + ;; Use the correct name for gcc. + (substitute* "mkfiles/mkfile-Linux-386" + (("cc -") + ;; Don't match yacc. + "gcc -")) + (substitute* "mkfiles/mkfile-Linux-arm" + (("arm-gcc") + "gcc")) + ;; Conflicting occurence of fsub. + (for-each (lambda (file) + (substitute* file + (("fsub") + "_fsub"))) + '("utils/libmach/vcodas.c" + "utils/libmach/vdb.c")) + ;; Fix build. + (for-each (lambda (file) + (substitute* file + (("^CFLAGS=") + "CFLAGS=-D_GNU_SOURCE -fcommon"))) + '("mkfiles/mkfile-Linux-386" + "mkfiles/mkfile-Linux-arm" + "mkfiles/mkfile-Linux-power" + "mkfiles/mkfile-Linux-spim")) + ;; Make build reproducible by + ;; ensuring timestamps embedded into + ;; binaries are set to 0. + (substitute* "emu/Linux/mkfile" + (("^KERNDATE=.*$") + "KERNDATE=0\n")) + #t)) + (configure unquote + (lambda _ + (substitute* "mkconfig" + (("ROOT=/usr/inferno") + (string-append "ROOT=" root)) + (("SYSHOST=Plan9") + "SYSHOST=Linux") + (("OBJTYPE=\\$objtype") + (string-append "OBJTYPE=" objtype))) #t)) + ;; Build mk. + ;; TODO: Use mk from plan9port or 9base instead. + (makemk unquote + (lambda _ + (invoke "./makemk.sh"))) + (build unquote + (lambda _ + ;; Add mk's location to PATH. + (setenv "PATH" + (string-append root/bindir ":" + (getenv "PATH"))) + ;; Build emu and .dis files using mk. + (invoke "mk" "-s" "nuke" "mkdirs" "install"))) + (install unquote + (lambda* (#:key inputs #:allow-other-keys) + (mkdir-p bindir) + (mkdir-p root/fontdir) + ;; Install emu script. + (with-output-to-file emu-script + (lambda () + (display (string-append "#!" + bash + "/bin/sh\n" + "exec " + root/bindir + "/emu " + "/dis/sh.dis -c \"" + ;; Use plan9port's fonts. + "bind '#U*" + (search-input-directory inputs + "/plan9/font") + "' /fonts; " + ;; Pretend fonts were not removed. + ;; TODO: de-hardcode. + ;; TODO: use fonts available in the host system. + ;; TODO: minitel fonts. + "memfs -b /fonts; " + (string-concatenate (map (lambda + (dir) + (string-append + "mkdir /fonts/" + dir + "; " + "bind /fonts/fixed /fonts/" + dir + "; ")) + '("charon" + "lucida" + "lucidasans" + "lucm" + "pelm"))) + (simulate-fonts "6x9" + '("charon/cw.tiny" + "charon/plain.tiny" + "lucida/unicode.6" + "lucidasans/latin1.6" + "lucidasans/typelatin1.6" + "lucidasans/unicode.6")) + (simulate-fonts "7x13" + '("charon/cw.small" + "charon/plain.small" + "lucida/unicode.7" + "lucidasans/latin1.7" + "lucidasans/typelatin1.7" + "lucidasans/unicode.7")) + (simulate-fonts "8x13" + '("charon/cw.normal" + "charon/plain.normal" + "lucida/unicode.8" + "lucidasans/euro.8" + "lucidasans/latin1.8" + "lucidasans/typelatin1.8" + "lucidasans/unicode.8" + "pelm/unicode.8")) + (simulate-fonts "9x15" + '("charon/cw.large" + "charon/plain.large" + "lucida/unicode.10" + "lucidasans/latin1.10" + "lucidasans/typelatin1.10" + "lucidasans/unicode.10" + "lucm/unicode.9" + "pelm/ascii.12" + "pelm/latin1.9" + "pelm/unicode.9")) + (simulate-fonts "10x20" + '("charon/cw.vlarge" + "charon/plain.vlarge" + "lucida/moo.16" + "lucida/unicode.13" + "lucidasans/latin1.13" + "lucidasans/typelatin1.13" + "lucidasans/unicode.13" + "pelm/ascii.16")) + (simulate-fonts "6x13O" + '("charon/italic.tiny" + "charon/italic.small" + "lucidasans/italiclatin1.6" + "lucidasans/italiclatin1.7")) + (simulate-fonts "7x13O" + '("charon/italic.normal" + "lucidasans/italiclatin1.8")) + (simulate-fonts "8x13O" + '("charon/italic.large" + "charon/italic.vlarge" + "lucidasans/italiclatin1.10" + "lucidasans/italiclatin1.13")) + (simulate-fonts "6x13B" + '("charon/bold.tiny" + "lucidasans/boldlatin1.6")) + (simulate-fonts "7x13B" + '("charon/bold.small" + "lucidasans/boldlatin1.7")) + (simulate-fonts "8x13B" + '("charon/bold.normal" + "lucidasans/boldlatin1.8")) + (simulate-fonts "9x15B" + '("charon/bold.large" + "lucidasans/boldlatin1.10")) + (simulate-fonts "9x18B" + '("charon/bold.vlarge" + "lucidasans/boldlatin1.13")) + ;; Bind the host's /tmp to Inferno's + ;; /tmp to make it writable. + "bind -bc '#U*/tmp' /tmp; " + ;; Bind the host's /home to Inferno's + ;; /usr. + "bind '#U*/home' /usr; " + "$*\"\n")))) + (chmod emu-script #o755) + ;; Install infwm script. + (with-output-to-file infwm-script + (lambda () + (display (string-append "#!" + bash + "/bin/sh\n" + "exec " + bindir + "/emu $* wm/wm wm/logon -u $USER\n")))) + (chmod infwm-script #o755) + ;; Install a symlink to the Limbo compiler. + (symlink (string-append root/bindir "/limbo") + (string-append bindir "/limbo")) + #t)))))) + (home-page "https://www.inferno-os.org") + (synopsis + "Compact operating system for building cross-platform distributed systems") + (description + ;; Except for the last sentence this is taken verbatim from the + ;; intro(1) man page (man/1/0intro in the source tree). + "Inferno is a virtualised operating system that can run natively across +a wide range of processor architectures or hosted on a wide range of +operating systems. The principal components of the system are: +@itemize +@item The Inferno kernel which can run both native and hosted on a +range of platforms and which presents the same interface to programs +in both cases. +@item The Dis virtual machine. +@item Styx - the tiny broad-spectrum file service protocol. +@item Limbo - a new simple, modular, concurrent programming language. +@item Tk and Prefab - graphical user interface (GUI) primitives +without a lot of goo. +@item The portable cross-development suites that allow any native +Inferno platform to be cross-compiled on any hosted system. +@end itemize +This package provides hosted Inferno. +") + (supported-systems '("i686-linux" "x86_64-linux" "armhf-linux" + "aarch64-linux")) + (license (list license:expat ;MIT license + license:freetype + ;; According to NOTICE the combined work is effectively + ;; GPLv2+. + license:gpl2+ + license:lgpl2.0+))))) diff --git a/gnu/packages/patches/inferno-fix-crash.patch b/gnu/packages/patches/inferno-fix-crash.patch new file mode 100644 index 0000000000..acf7b718b8 --- /dev/null +++ b/gnu/packages/patches/inferno-fix-crash.patch @@ -0,0 +1,14 @@ +diff --git a/emu/Linux/os.c b/emu/Linux/os.c +index 08b039d6..0d8a0cf3 100644 +--- a/emu/Linux/os.c ++++ b/emu/Linux/os.c +@@ -18,6 +18,9 @@ + + #include <raise.h> + ++/* For dynamic linking init/fini code that needs malloc */ ++void (*coherence)(void) = nofence; ++ + /* glibc 2.3.3-NTPL messes up getpid() by trying to cache the result, so we'll do it ourselves */ + #include <sys/syscall.h> + #define getpid() syscall(SYS_getpid) -- 2.46.0
GNU bug tracking system
Copyright (C) 1999 Darren O. Benham,
1997,2003 nCipher Corporation Ltd,
1994-97 Ian Jackson.