From a1c8be9ff84e9b7324943289aeda97152d521199 Mon Sep 17 00:00:00 2001 From: Yuta Saito Date: Mon, 29 Dec 2025 13:21:25 +0900 Subject: [PATCH 1/2] Add Ruby 4.0 build --- Rakefile | 8 ++- lib/ruby_wasm/cli.rb | 10 ++++ package-lock.json | 12 ++++ .../ruby-4.0-wasm-wasi/.gitignore | 4 ++ .../npm-packages/ruby-4.0-wasm-wasi/Gemfile | 15 +++++ .../ruby-4.0-wasm-wasi/Gemfile.lock | 27 +++++++++ .../npm-packages/ruby-4.0-wasm-wasi/README.md | 7 +++ .../ruby-4.0-wasm-wasi/package.json | 55 +++++++++++++++++++ .../ruby-4.0-wasm-wasi/rollup.config.mjs | 21 +++++++ .../ruby-4.0-wasm-wasi/src/browser.script.js | 5 ++ 10 files changed, 163 insertions(+), 1 deletion(-) create mode 100644 packages/npm-packages/ruby-4.0-wasm-wasi/.gitignore create mode 100644 packages/npm-packages/ruby-4.0-wasm-wasi/Gemfile create mode 100644 packages/npm-packages/ruby-4.0-wasm-wasi/Gemfile.lock create mode 100644 packages/npm-packages/ruby-4.0-wasm-wasi/README.md create mode 100644 packages/npm-packages/ruby-4.0-wasm-wasi/package.json create mode 100644 packages/npm-packages/ruby-4.0-wasm-wasi/rollup.config.mjs create mode 100644 packages/npm-packages/ruby-4.0-wasm-wasi/src/browser.script.js diff --git a/Rakefile b/Rakefile index 4d7fe9bca..71b4f288e 100644 --- a/Rakefile +++ b/Rakefile @@ -9,7 +9,7 @@ require "ruby_wasm/rake_task" require "ruby_wasm/packager" require "ruby_wasm/cli" -BUILD_SOURCES = %w[3.4 3.3 3.2 head] +BUILD_SOURCES = %w[4.0 3.4 3.3 3.2 head] BUILD_PROFILES = %w[full minimal] BUILDS = @@ -38,6 +38,12 @@ NPM_PACKAGES = [ target: "wasm32-unknown-wasip2", enable_component_model: true }, + { + name: "ruby-4.0-wasm-wasi", + ruby_version: "4.0", + gemfile: "packages/npm-packages/ruby-4.0-wasm-wasi/Gemfile", + target: "wasm32-unknown-wasip1" + }, { name: "ruby-3.4-wasm-wasi", ruby_version: "3.4", diff --git a/lib/ruby_wasm/cli.rb b/lib/ruby_wasm/cli.rb index 3b079b689..c0b2b73a1 100644 --- a/lib/ruby_wasm/cli.rb +++ b/lib/ruby_wasm/cli.rb @@ -252,6 +252,16 @@ def self.build_config_aliases(root) all_default_exts: RubyWasm::Packager::ALL_DEFAULT_EXTS, wasi_sdk_version: "24.0" }, + { + name: "4.0", + src: { + type: "tarball", + url: "https://cache.ruby-lang.org/pub/ruby/4.0/ruby-4.0.0.tar.gz" + }, + all_default_exts: + "cgi/escape,continuation,coverage,date,digest/bubblebabble,digest,digest/md5,digest/rmd160,digest/sha1,digest/sha2,etc,fcntl,json,json/generator,json/parser,objspace,pathname,psych,rbconfig/sizeof,ripper,stringio,strscan,monitor,zlib,openssl", + wasi_sdk_version: "24.0" + }, { name: "3.4", src: { diff --git a/package-lock.json b/package-lock.json index d6c0c1731..14f377272 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1479,6 +1479,10 @@ "resolved": "packages/npm-packages/ruby-3.4-wasm-wasi", "link": true }, + "node_modules/@ruby/4.0-wasm-wasi": { + "resolved": "packages/npm-packages/ruby-4.0-wasm-wasi", + "link": true + }, "node_modules/@ruby/head-wasm-emscripten": { "resolved": "packages/npm-packages/ruby-head-wasm-emscripten", "link": true @@ -3598,6 +3602,14 @@ "@ruby/wasm-wasi": "^2.0.0" } }, + "packages/npm-packages/ruby-4.0-wasm-wasi": { + "name": "@ruby/4.0-wasm-wasi", + "version": "2.7.2", + "license": "MIT", + "dependencies": { + "@ruby/wasm-wasi": "^2.0.0" + } + }, "packages/npm-packages/ruby-head-wasm-emscripten": { "name": "@ruby/head-wasm-emscripten", "version": "2.7.2", diff --git a/packages/npm-packages/ruby-4.0-wasm-wasi/.gitignore b/packages/npm-packages/ruby-4.0-wasm-wasi/.gitignore new file mode 100644 index 000000000..cbb80a5cd --- /dev/null +++ b/packages/npm-packages/ruby-4.0-wasm-wasi/.gitignore @@ -0,0 +1,4 @@ +*.tgz +/tmp +/bundle +/vendor diff --git a/packages/npm-packages/ruby-4.0-wasm-wasi/Gemfile b/packages/npm-packages/ruby-4.0-wasm-wasi/Gemfile new file mode 100644 index 000000000..35a14732c --- /dev/null +++ b/packages/npm-packages/ruby-4.0-wasm-wasi/Gemfile @@ -0,0 +1,15 @@ +# frozen_string_literal: true + +source "https://rubygems.org" + +# We build ./vendor/cache/js-{version}.gem just before evaluating this Gemfile +# so that Bundler builds extensions even from the local gem. (gem extensions +# from "path:" gems are not built by Bundler.) +# Thus even we specify version of "js" gem here, it should always installed +# from the ./vendor/cache/js-{version}.gem, not from rubygems.org. To achieve this, +# we always use non-exist version during development. +require_relative "../../gems/js/lib/js/version.rb" +gem "js", JS::VERSION +gem "ruby_wasm", path: "../../../", group: [:build] +gem "power_assert" +gem "test-unit" diff --git a/packages/npm-packages/ruby-4.0-wasm-wasi/Gemfile.lock b/packages/npm-packages/ruby-4.0-wasm-wasi/Gemfile.lock new file mode 100644 index 000000000..a23102d1a --- /dev/null +++ b/packages/npm-packages/ruby-4.0-wasm-wasi/Gemfile.lock @@ -0,0 +1,27 @@ +PATH + remote: ../../.. + specs: + ruby_wasm (2.7.2.dev) + logger + +GEM + remote: https://rubygems.org/ + specs: + js (2.7.2.dev) + logger (1.7.0) + power_assert (2.0.3) + test-unit (3.6.2) + power_assert + +PLATFORMS + ruby + x86_64-linux + +DEPENDENCIES + js (= 2.7.2.dev) + power_assert + ruby_wasm! + test-unit + +BUNDLED WITH + 2.6.4 diff --git a/packages/npm-packages/ruby-4.0-wasm-wasi/README.md b/packages/npm-packages/ruby-4.0-wasm-wasi/README.md new file mode 100644 index 000000000..69e4c01e7 --- /dev/null +++ b/packages/npm-packages/ruby-4.0-wasm-wasi/README.md @@ -0,0 +1,7 @@ +# @ruby/4.0-wasm-wasi + +[![npm version](https://badge.fury.io/js/@ruby%2F4.0-wasm-wasi.svg)](https://www.npmjs.com/package/@ruby/4.0-wasm-wasi) + +This package provides WebAssembly binaries of CRuby built from the latest `4.0` source code targeting environments compatible with WASI Preview1. + +See [`@ruby/wasm-wasi`](https://github.com/ruby/ruby.wasm/blob/main/packages/npm-packages/ruby-wasm-wasi/README.md) for how to use this package. diff --git a/packages/npm-packages/ruby-4.0-wasm-wasi/package.json b/packages/npm-packages/ruby-4.0-wasm-wasi/package.json new file mode 100644 index 000000000..ee8d12405 --- /dev/null +++ b/packages/npm-packages/ruby-4.0-wasm-wasi/package.json @@ -0,0 +1,55 @@ +{ + "name": "@ruby/4.0-wasm-wasi", + "version": "2.7.2", + "description": "Ruby 4.0 built on WASI", + "main": "./dist/cjs/index.js", + "module": "./dist/esm/index.js", + "exports": { + ".": { + "browser": "./dist/esm/index.js", + "umd": "./dist/umd/index.js", + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.js" + }, + "./dist/*": { + "browser": "./dist/esm/*.js", + "umd": "./dist/umd/*.js", + "import": "./dist/esm/*.js", + "require": "./dist/cjs/*.js" + }, + "./dist/*.wasm": { + "browser": "./dist/*.wasm", + "umd": "./dist/*.wasm", + "import": "./dist/*.wasm", + "require": "./dist/*.wasm" + } + }, + "files": [ + "dist", + "README.md" + ], + "scripts": { + "test": "RUBY_NPM_PACKAGE_ROOT=../ruby-4.0-wasm-wasi npm -C ../ruby-wasm-wasi run test:run", + "build:deps": "cd ../ruby-wasm-wasi && npm run build", + "build:static:files": "../ruby-wasm-wasi/tools/pack-static-files.sh ./dist", + "build:static:compat": "../ruby-wasm-wasi/tools/pack-compat-shim.mjs --dist=./dist --pkg=ruby-4.0-wasm-wasi", + "build:static": "npm run build:static:files && npm run build:static:compat", + "build:rollup": "rollup -c rollup.config.mjs", + "build": "npm run build:deps && npm run build:static && npm run build:rollup && ../ruby-wasm-wasi/tools/post-build.sh ./dist" + }, + "repository": "https://github.com/ruby/ruby.wasm", + "homepage": "https://github.com/ruby/ruby.wasm/tree/main/packages/npm-packages/ruby-4.0-wasm-wasi", + "publishConfig": { + "access": "public" + }, + "keywords": [ + "wasm", + "webassembly", + "wasi", + "ruby" + ], + "license": "MIT", + "dependencies": { + "@ruby/wasm-wasi": "^2.0.0" + } +} diff --git a/packages/npm-packages/ruby-4.0-wasm-wasi/rollup.config.mjs b/packages/npm-packages/ruby-4.0-wasm-wasi/rollup.config.mjs new file mode 100644 index 000000000..302c2c672 --- /dev/null +++ b/packages/npm-packages/ruby-4.0-wasm-wasi/rollup.config.mjs @@ -0,0 +1,21 @@ +import json from "@rollup/plugin-json"; +import { nodeResolve } from "@rollup/plugin-node-resolve"; +import fs from "fs"; +import path from "path"; + +/** @type {import('rollup').RollupOptions[]} */ +export default [ + { + input: "src/browser.script.js", + output: [ + { + file: "dist/browser.script.iife.js", + format: "iife", + banner: "/* " + fs.readFileSync(path.resolve("../../../NOTICE"), "utf8") + "*/", + } + ], + plugins: [ + json(), nodeResolve() + ], + }, +]; diff --git a/packages/npm-packages/ruby-4.0-wasm-wasi/src/browser.script.js b/packages/npm-packages/ruby-4.0-wasm-wasi/src/browser.script.js new file mode 100644 index 000000000..859006ec7 --- /dev/null +++ b/packages/npm-packages/ruby-4.0-wasm-wasi/src/browser.script.js @@ -0,0 +1,5 @@ + +import { main } from "@ruby/wasm-wasi/dist/browser.script" +import * as pkg from "../package.json" + +main(pkg) From a4adbb25c6bd663b088b4a6ad9fe24b5d4f56dbd Mon Sep 17 00:00:00 2001 From: Yuta Saito Date: Mon, 29 Dec 2025 13:25:46 +0900 Subject: [PATCH 2/2] Bump Ruby version to 4.0 in docs --- README.md | 15 ++++++++++----- docs/cheat_sheet.md | 16 ++++++++-------- packages/npm-packages/ruby-wasm-wasi/README.md | 1 + 3 files changed, 19 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 1b4e18637..6a3659b7a 100644 --- a/README.md +++ b/README.md @@ -23,7 +23,7 @@ Create and save `index.html` page with the following contents: ```html - + + +