Module: Beni::Vendor
- Defined in:
- lib/beni/vendor.rb,
lib/beni/vendor/tarball.rb,
lib/beni/vendor/checksum.rb,
lib/beni/vendor/toolchain.rb,
lib/beni/vendor/downloader.rb
Overview
Vendor toolchain façade. Owns the release-vendored toolchain pins and the factory methods that build declarative Toolchain values anchored on a caller-supplied vendor_dir; Beni::Tasks calls the factories with each selected toolchain’s resolved (version, sha256) to wire file / task declarations. Network download lives in Vendor::Downloader, SHA256 verification in Vendor::Checksum, tarball extraction in Vendor::Tarball, and the per-toolchain pipeline composition in Vendor::Toolchain.
Honors BENI_VENDOR_BASE_URL to point downloads at a local fixture during tests.
Defined Under Namespace
Classes: Checksum, Downloader, Tarball, Toolchain
Constant Summary collapse
- BUILT_IN_PAIRS =
—- Built-in pairs —————————————————- The version and checksum pair this release vendors per toolchain. wasi-sdk ships one tarball per build platform, so its checksum is keyed by
WASI_SDK_PLATFORM(values from the GitHub release asset digests); mruby’s source archive is host-agnostic with a single checksum.wasi-sdk: must be >= 26 for native wasm32-wasip1 setjmp/longjmp support. 33’s
libc.asupplies__wasi_init_tp, which Rust’s wasm32-wasip1crt1-command.oreferences from 1.96 onward. Keep in lockstep with the channel inrust-toolchain.toml— in both this repo and kobako. { "mruby" => { version: "4.0.0", sha256: "e2ea271dbed14e9f2b33df773ae447b747dbc242ce2675022c0a57efea85a7b4" }, "wasi-sdk" => { version: "33.0", sha256: { "arm64-linux" => "4f98ee738c7abb45c81a94d1461fc53cc569d1cd01498951c8184d841a027844", "arm64-macos" => "85c997a2665ead91673b5bb88b7d0df3fc8900df3bfa244f720d478187bbdc78", "x86_64-linux" => "0ba8b5bfaeb2adf3f29bab5841d76cf5318ab8e1642ea195f88baba1abd47bce", "x86_64-macos" => "18f3f201ba9734e6a4455b0b6410690395a55e9ffa9f6f5066f66083a94b93b3" } } }.freeze
- DEPENDENCIES =
Transitive toolchain dependencies, folded into the selected set at task-definition time: referencing wasi-sdk implies mruby.
{ "wasi-sdk" => %w[mruby] }.freeze
- WASI_SDK_PLATFORM =
The build platform’s wasi-sdk token, resolved once at load.
wasi_sdk_platform- TOOLCHAIN_FACTORIES =
Known toolchain names mapped to their factory methods — the name domain the DSL validates against and
Beni::Tasksdispatches on. { "mruby" => :mruby, "wasi-sdk" => :wasi_sdk }.freeze
Class Method Summary collapse
-
.base_url_for(default) ⇒ Object
When BENI_VENDOR_BASE_URL is set, all tarballs are fetched from that base URL (test fixture).
-
.built_in_sha256(name, version) ⇒ Object
The built-in checksum for
nameatversion: the build platform’s entry when the toolchain’s checksums are platform-keyed,nilfor any version other than the vendored one — mruby’s TOFU pinning path. - .mruby(vendor_dir:, version: nil, sha256: nil) ⇒ Object
-
.stage_wasi_toolchain_file(vendor_dir:) ⇒ Object
Write the gem-shipped wasi toolchain file into the staged mruby source, where mruby’s conf.toolchain :wasi resolves it from.
- .wasi_sdk(vendor_dir:, version: nil, sha256: nil) ⇒ Object
-
.wasi_sdk_platform(platform = RUBY_PLATFORM) ⇒ Object
Map a host triple to the platform token wasi-sdk keys its per-platform tarballs by (wasi-sdk only; mruby’s tarball is host-agnostic).
Class Method Details
.base_url_for(default) ⇒ Object
When BENI_VENDOR_BASE_URL is set, all tarballs are fetched from that base URL (test fixture). The base URL must serve files named exactly tarball_name for each toolchain.
109 110 111 112 113 114 |
# File 'lib/beni/vendor.rb', line 109 def base_url_for(default) override = ENV.fetch("BENI_VENDOR_BASE_URL", nil) return default if override.nil? || override.empty? override.chomp("/") end |
.built_in_sha256(name, version) ⇒ Object
The built-in checksum for name at version: the build platform’s entry when the toolchain’s checksums are platform-keyed, nil for any version other than the vendored one — mruby’s TOFU pinning path.
119 120 121 122 123 124 125 |
# File 'lib/beni/vendor.rb', line 119 def built_in_sha256(name, version) pair = BUILT_IN_PAIRS.fetch(name) return nil unless version == pair.fetch(:version) checksum = pair.fetch(:sha256) checksum.is_a?(Hash) ? checksum.fetch(WASI_SDK_PLATFORM) : checksum end |
.mruby(vendor_dir:, version: nil, sha256: nil) ⇒ Object
93 94 95 96 97 98 99 100 101 102 103 104 |
# File 'lib/beni/vendor.rb', line 93 def mruby(vendor_dir:, version: nil, sha256: nil) version ||= BUILT_IN_PAIRS.fetch("mruby").fetch(:version) Toolchain.new( name: "mruby", version_label: version, base_url: "https://github.com/mruby/mruby/archive/refs/tags", tarball_name: "#{version}.tar.gz", top_level_dir: "mruby-#{version}", vendor_dir: vendor_dir, expected_sha256: sha256 || built_in_sha256("mruby", version) ) end |
.stage_wasi_toolchain_file(vendor_dir:) ⇒ Object
Write the gem-shipped wasi toolchain file into the staged mruby source, where mruby’s conf.toolchain :wasi resolves it from. Idempotent and always overwriting, so a re-extracted tree or an older beni’s copy converges on this release’s definition. Returns the staged path.
132 133 134 135 136 137 138 139 140 |
# File 'lib/beni/vendor.rb', line 132 def stage_wasi_toolchain_file(vendor_dir:) # `__dir__ || "."`: __dir__ is only nil under eval, which never # loads this file; the fallback satisfies steep's String? typing. source = File.("vendor/toolchains/wasi.rake", __dir__ || ".") target = File.join(vendor_dir, "mruby", "tasks", "toolchains", "wasi.rake") FileUtils.mkdir_p(File.dirname(target)) FileUtils.cp(source, target) target end |
.wasi_sdk(vendor_dir:, version: nil, sha256: nil) ⇒ Object
78 79 80 81 82 83 84 85 86 87 88 89 90 91 |
# File 'lib/beni/vendor.rb', line 78 def wasi_sdk(vendor_dir:, version: nil, sha256: nil) version ||= BUILT_IN_PAIRS.fetch("wasi-sdk").fetch(:version) # The release tag carries the major version only; tarballs carry the # full version plus the platform. Toolchain.new( name: "wasi-sdk", version_label: "#{version} (#{WASI_SDK_PLATFORM})", base_url: "https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-#{version.split(".").first}", tarball_name: "wasi-sdk-#{version}-#{WASI_SDK_PLATFORM}.tar.gz", top_level_dir: "wasi-sdk-#{version}-#{WASI_SDK_PLATFORM}", vendor_dir: vendor_dir, expected_sha256: sha256 || built_in_sha256("wasi-sdk", version) ) end |
.wasi_sdk_platform(platform = RUBY_PLATFORM) ⇒ Object
Map a host triple to the platform token wasi-sdk keys its per-platform tarballs by (wasi-sdk only; mruby’s tarball is host-agnostic). x86_64-linux is both the most common host and the safest fallback for unrecognised triples, so it is the else branch.
57 58 59 60 61 62 63 64 |
# File 'lib/beni/vendor.rb', line 57 def self.wasi_sdk_platform(platform = RUBY_PLATFORM) case platform when /arm64-darwin|aarch64-darwin/ then "arm64-macos" when /x86_64-darwin/ then "x86_64-macos" when /aarch64-linux|arm64-linux/ then "arm64-linux" else "x86_64-linux" end end |