diff mbox series

[bug#61243] Add WASM-4 fantasy console and prerequisites

Message ID CAJ=RwfYDch=_K2d3q=WYjUYPO_qozsFYj30MWCxi9VCxoUhDhQ@mail.gmail.com
State New
Headers show
Series [bug#61243] Add WASM-4 fantasy console and prerequisites | expand

Commit Message

Thompson, David Feb. 2, 2023, 11:31 p.m. UTC
Hello all,

This set of 4 patches adds WASM-4 (https://wasm4.org/), a fantasy
console that runs game "cartridges" compiled to WebAssembly.  It's a
fun way to learn about WebAssembly using a relatively simple system.
I've seen a WASM-4 game that was assembled using Racket, which I
thought was pretty neat.  It would be even cooler if someone did
something like that with Guile!

Packaging this thing was not exactly straightforward due to dependency
bundling via git submodules, but I was able to unbundle everything.

- Dave

Comments

Christine Lemmer-Webber Feb. 3, 2023, 12:48 p.m. UTC | #1
"Thompson, David" <dthompson2@worcester.edu> writes:

> Hello all,
>
> This set of 4 patches adds WASM-4 (https://wasm4.org/), a fantasy
> console that runs game "cartridges" compiled to WebAssembly.  It's a
> fun way to learn about WebAssembly using a relatively simple system.
> I've seen a WASM-4 game that was assembled using Racket, which I
> thought was pretty neat.  It would be even cooler if someone did
> something like that with Guile!

Wouldn't it be cool indeed?  I wonder if we can see progress on this in
Guile-land?  Maybe someone should take up the torch for the Guile and
WASM story.

> Packaging this thing was not exactly straightforward due to dependency
> bundling via git submodules, but I was able to unbundle everything.

Impressive!  This doesn't look like it was easy to figure out.

I reviewed all four patches.  Despite some custom stuff on most of
these, they all look well commented and sensible.  I say push it!

 - Christine
Thompson, David Feb. 3, 2023, 1:11 p.m. UTC | #2
Hi Christine,

On Fri, Feb 3, 2023 at 7:53 AM Christine Lemmer-Webber
<cwebber@dustycloud.org> wrote:
>
> "Thompson, David" <dthompson2@worcester.edu> writes:
>
> > Hello all,
> >
> > This set of 4 patches adds WASM-4 (https://wasm4.org/), a fantasy
> > console that runs game "cartridges" compiled to WebAssembly.  It's a
> > fun way to learn about WebAssembly using a relatively simple system.
> > I've seen a WASM-4 game that was assembled using Racket, which I
> > thought was pretty neat.  It would be even cooler if someone did
> > something like that with Guile!
>
> Wouldn't it be cool indeed?  I wonder if we can see progress on this in
> Guile-land?  Maybe someone should take up the torch for the Guile and
> WASM story.

That sure would be cool!

Small correction: The thing I saw that used Racket to create
WebAssembly output doesn't actually run on WASM-4, it just kinda
looked like it did. Oops!  It's still very cool!
https://github.com/euhmeuh/wasm-adventure

> > Packaging this thing was not exactly straightforward due to dependency
> > bundling via git submodules, but I was able to unbundle everything.
>
> Impressive!  This doesn't look like it was easy to figure out.
>
> I reviewed all four patches.  Despite some custom stuff on most of
> these, they all look well commented and sensible.  I say push it!

Thanks for the review!  I found a typo in the description field of
cubeb that I've fixed, and I added some additional comments explaining
the minifb build customizations.  I pushed the patches with those
changes!

- Dave
dan Feb. 4, 2023, 9:43 a.m. UTC | #3
just saw this news: 
https://spritely.institute/news/guile-on-web-assembly-project-underway.html
diff mbox series

Patch

From e227587b4e50313fdbda4acf7992b7a4ded23260 Mon Sep 17 00:00:00 2001
From: David Thompson <dthompson2@worcester.edu>
Date: Thu, 2 Feb 2023 14:04:48 -0500
Subject: [PATCH 1/4] gnu: Add wasm3.

* gnu/packages/web.scm (wasm3): New variable.
---
 gnu/packages/web.scm | 48 ++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 48 insertions(+)

diff --git a/gnu/packages/web.scm b/gnu/packages/web.scm
index a29f53108c..c527ff80df 100644
--- a/gnu/packages/web.scm
+++ b/gnu/packages/web.scm
@@ -61,6 +61,7 @@ 
 ;;; Copyright © 2022 jgart <jgart@dismail.de>
 ;;; Copyright © 2023 Paul A. Patience <paul@apatience.com>
 ;;; Copyright © 2022 Bruno Victal <mirai@makinata.eu>
+;;; Copyright © 2023 David Thompson <dthompson2@worcester.edu>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -1557,6 +1558,53 @@  (define-public wabt
 other systems that want to manipulate WebAssembly files.")
     (license license:asl2.0)))
 
+(define-public wasm3
+  (package
+    (name "wasm3")
+    (version "0.5.0")
+    (source
+     (origin
+       (method git-fetch)
+       (uri (git-reference
+             (url "https://github.com/wasm3/wasm3")
+             (commit (string-append "v" version))))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32 "07zzmk776j8ydyxhrnnjiscbhhmz182a62r6aix6kfk5kq2cwia2"))))
+    (build-system cmake-build-system)
+    (arguments
+     ;; The default WASI option "uvwasi" causes CMake to initiate a 'git
+     ;; clone' which cannot happen within the build container.
+     '(#:configure-flags '("-DBUILD_WASI=simple")
+       ;; No check target.  There are tests but they require a network
+       ;; connection to download the WebAssembly core test suite.
+       #:tests? #f
+       ;; There is no install target.  Instead, we have to manually copy the
+       ;; wasm3 build artifacts to the output directory.
+       #:phases
+       (modify-phases %standard-phases
+         (replace 'install
+           (lambda* (#:key outputs #:allow-other-keys)
+             (let* ((out (assoc-ref outputs "out"))
+                    (bindir (string-append out "/bin"))
+                    (includedir (string-append out "/include"))
+                    (libdir (string-append out "/lib")))
+               (mkdir-p bindir)
+               (mkdir-p includedir)
+               (mkdir-p libdir)
+               (copy-file "wasm3" (string-append bindir "/wasm3"))
+               (for-each (lambda (header)
+                           (copy-file header
+                                      (string-append includedir "/"
+                                                     (basename header))))
+                         (find-files "../source/source" "\\.h$"))
+               (copy-file "source/libm3.a"
+                          (string-append libdir "/libm3.a"))))))))
+    (home-page "https://github.com/wasm3/wasm3")
+    (synopsis "WebAssembly interpreter")
+    (description "WASM3 is a fast WebAssembly interpreter.")
+    (license license:expat)))
+
 (define-public websocketpp
   (package
     (name "websocketpp")
-- 
2.39.1