1
Fork 0
mirror of https://https.git.savannah.gnu.org/git/guix.git/ synced 2025-07-12 01:50:46 +02:00
guix/gnu/packages/inferno.scm
Homo e4b54095cb
gnu: Add inferno.
Based on earlier work rejected for licensing reasons (#33080), 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
Reviewed-by: Ludovic Courtès <ludo@gnu.org>
Signed-off-by: Sharlatan Hellseher <sharlatanus@gmail.com>
2025-02-17 22:07:17 +00:00

322 lines
16 KiB
Scheme

;;; 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+)))))