[bug#74734,v4] gnu: Add inferno.

Message ID 20250106180155.10796-1-gay@disroot.org
State New
Headers
Series [bug#74734,v4] gnu: Add inferno. |

Commit Message

Homo Jan. 6, 2025, 5:32 p.m. UTC
  Based on earlier work rejected for licensing reasons, code has been relicensed from LPL to Expat.

Just in case remove all fonts from distribution, instead fonts from plan9port are used.

* gnu/packages/inferno.scm: New file.
* gnu/packages/patches/inferno-fix-crash.patch: New file.
* gnu/local.mk (GNU_SYSTEM_MODULES, dist_patch_DATA): Register new files.

Change-Id: I9a05a8bb2397796f6af86fa3be3408982ca62648
---
Hi, reformatted according to suggestions,
also fixed shebangs in scripts running in Dis VM.

I had to make little refactoring to avoid
duplication of variables, more specifically
it's hard to consistently track objtype.

P.S. Added mention where .patch file comes from.

To use system fonts, either use plan9port's fontsrv:
$ mkdir -p $HOME/mnt/fonts
$ 9 fontsrv -m $HOME/mnt/fonts
then inside Inferno:
% bind $home/mnt/fonts /fonts

Alternatively if you are familiar with 9P authentication:
$ 9 fontsrv
$ 9 9pserve -c 'unix!/tmp/ns.$USER.$DISPLAY/font' 'tcp!127.0.0.1!8080'
then inside Inferno:
% mount tcp!127.0.0.1!8080 /fonts

Inferno doesn't undersdand "unix!", because there are no sockets
in Plan 9 and Inferno, this is a workaround from plan9port because
there are no network-transparent filesystem namespaces in POSIX systems,
and Linux namespaces are not suitable for this task at all.

 gnu/local.mk                                 |   2 +
 gnu/packages/inferno.scm                     | 322 +++++++++++++++++++
 gnu/packages/patches/inferno-fix-crash.patch |  17 +
 3 files changed, 341 insertions(+)
 create mode 100644 gnu/packages/inferno.scm
 create mode 100644 gnu/packages/patches/inferno-fix-crash.patch
  

Patch

diff --git a/gnu/local.mk b/gnu/local.mk
index f118fe4442..91204cdeb6 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -377,6 +377,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			\
@@ -1592,6 +1593,7 @@  dist_patch_DATA =						\
   %D%/packages/patches/igraph-fix-varargs-integer-size.patch	\
   %D%/packages/patches/ilmbase-fix-tests.patch			\
   %D%/packages/patches/indent-CVE-2024-0911.patch	\
+  %D%/packages/patches/inferno-fix-crash.patch		\
   %D%/packages/patches/instead-use-games-path.patch		\
   %D%/packages/patches/intltool-perl-compatibility.patch	\
   %D%/packages/patches/inetutils-hurd64.patch			\
diff --git a/gnu/packages/inferno.scm b/gnu/packages/inferno.scm
new file mode 100644
index 0000000000..67df73bf02
--- /dev/null
+++ b/gnu/packages/inferno.scm
@@ -0,0 +1,322 @@ 
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2018 Diego Nicola Barbato <dnbarbato@posteo.de>
+;;; Copyright © 2024 Homo <gay@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 gexp)
+  #:use-module (guix git-download)
+  #:use-module (guix packages)
+  #:use-module ((guix licenses)
+                #:prefix license:)
+  #:use-module (gnu packages)
+  #:use-module (gnu packages plan9)
+  #:use-module (gnu packages xorg)
+  #:use-module (ice-9 match))
+
+(define-public inferno
+  ;; There are no tags, also a lot of improvements and bugfixes happenned since 2015.
+  (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"))
+         (modules '((guix build utils)))
+         ;; Remove bundled non-free and potentially non-free fonts.
+         (snippet '(delete-file-recursively "fonts"))))
+      (build-system gnu-build-system)
+      (arguments
+       (list
+        ;; Force a 32-bit build targeting a similar architecture, i.e.:
+        ;; armhf for armhf/aarch64, i686 for i686/x86_64.
+        ;; TODO: mips and powerpc.
+        #:system (match (%current-system)
+                   ((or "armhf-linux" "aarch64-linux")
+                    "armhf-linux")
+                   (_ "i686-linux"))
+        ;; No tests.
+        #:tests? #f
+        #:phases
+        #~(modify-phases %standard-phases
+            (replace 'unpack
+              (lambda* (#:key source #:allow-other-keys)
+                (let* ((root (string-append #$output "/inferno")))
+                  ;; Copy 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))))
+            ;; Scripts running in virtual machine need /dis/sh.
+            (delete 'patch-generated-file-shebangs)
+            (delete 'patch-shebangs)
+            (replace 'patch-source-shebangs
+              (lambda* (#:key inputs #:allow-other-keys)
+                ;; Substitute ocurrences of /bin/sh.
+                (for-each (lambda (file)
+                            (substitute* file
+                              (("/bin/sh")
+                               (search-input-file inputs "/bin/bash"))))
+                          '("makemk.sh"
+                            "mkfiles/mkhost-Linux"
+                            "emu/Linux/mk-wrt"
+                            "utils/mk/Posix.c"))))
+            (add-after 'patch-source-shebangs 'patch-src-files
+              (lambda _
+                ;; 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"))))
+            (replace 'configure
+              (lambda* (#:key inputs #:allow-other-keys)
+                (let* ((objtype #$@(match (%current-system)
+                                     ((or "armhf-linux" "aarch64-linux")
+                                      `("arm"))
+                                     (_ `("386"))))
+                       (root (string-append #$output "/inferno"))
+                       (root/bindir (string-append root "/Linux/" objtype "/bin")))
+                  (substitute* "mkconfig"
+                    (("ROOT=/usr/inferno")
+                     (string-append "ROOT=" root))
+                    (("SYSHOST=Plan9")
+                     "SYSHOST=Linux")
+                    (("OBJTYPE=\\$objtype")
+                     (string-append "OBJTYPE=" objtype)))
+                  ;; Delete pre-built binaries.
+                  (delete-file-recursively root/bindir)
+                  (mkdir-p root/bindir)
+                  ;; Avoid duplicating objtype variable later.
+                  (symlink root/bindir (string-append #$output "/inferno/bin"))
+                  (setenv "PATH"
+                    (string-append
+                      ;; These utilities will be used later in build.
+                      root/bindir ":"
+                      (getenv "PATH") ":"
+                      ;; Bootstrap mk binary.
+                      (search-input-directory inputs "/plan9/bin"))))))
+            (replace 'build
+              (lambda _
+                ;; Build emu, utilities and Dis binaries using mk.
+                (invoke "mk" "-s" "nuke" "mkdirs" "install")))
+            (replace 'install
+              (lambda* (#:key inputs #:allow-other-keys)
+                (let* ((bindir (string-append #$output "/bin"))
+                       (emu-script (string-append bindir "/emu"))
+                       (infwm-script (string-append bindir "/infwm"))
+                       (root/bindir (string-append #$output "/inferno/bin"))
+                       (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))))
+                       (write-script
+                         (lambda (file cmds)
+                           (with-output-to-file file
+                             (lambda ()
+                               (display
+                                 (string-concatenate
+                                   (cons* "#!"
+                                          (search-input-file inputs "/bin/bash")
+                                          "\n"
+                                          cmds)))))
+                           (chmod file #o755))))
+                  (mkdir-p bindir)
+                  (mkdir-p "fonts")
+                  ;; Install emu script.
+                  (write-script emu-script (list
+                    "exec " root/bindir "/emu sh -c \""
+                    ;; Use plan9port's fonts.
+                    "bind '#U*"
+                    (search-input-directory inputs "/plan9/font")
+                    "' /fonts; "
+                    ;; Pretend fonts were not removed.
+                    ;; TODO: de-hardcode fonts from apps.
+                    ;; TODO: use fonts available in the host system,
+                    ;;       plan9port's fontsrv is a good way to start.
+                    ;; TODO: find fix for 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"))
+                  ;; Install infwm script.
+                  (write-script infwm-script (list
+                    "exec " bindir "/emu $* wm/wm wm/logon -u $USER\n"))
+                  ;; Install a symlink to the Limbo compiler.
+                  (symlink (string-append root/bindir "/limbo")
+                           (string-append bindir "/limbo")))))
+            ;; Inferno doesn't compress man pages.
+            (delete 'compress-documentation))))
+      (inputs (list libx11 libxext plan9port xorgproto))
+      (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..943812cce4
--- /dev/null
+++ b/gnu/packages/patches/inferno-fix-crash.patch
@@ -0,0 +1,17 @@ 
+Fixes crash.
+Patch from <https://github.com/inferno-os/inferno-os/pull/13>.
+
+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)