Skip to content

Commit ef7abfb

Browse files
build: Remove TOOLCHAINS constant and move Binaryen to its own class
1 parent 2d5dcf2 commit ef7abfb

File tree

4 files changed

+68
-48
lines changed

4 files changed

+68
-48
lines changed

Rakefile

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -66,16 +66,6 @@ STANDALONE_PACKAGES = [
6666

6767
LIB_ROOT = File.dirname(__FILE__)
6868

69-
TOOLCHAINS = {}
70-
BUILDS
71-
.map { |_, target, _| target }
72-
.uniq
73-
.each do |target|
74-
build_dir = File.join(LIB_ROOT, "build")
75-
toolchain = RubyWasm::Toolchain.get(target, build_dir)
76-
TOOLCHAINS[toolchain.name] = toolchain
77-
end
78-
7969
class BuildTask < Struct.new(:name, :target, :build_command)
8070
def ruby_cache_key
8171
return @key if @key

lib/ruby_wasm/build/toolchain.rb

Lines changed: 51 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -60,10 +60,7 @@ def initialize(
6060
version_minor: 0,
6161
binaryen_version: 108
6262
)
63-
@wasm_opt_path = Toolchain.find_path("wasm-opt")
6463
@need_fetch_wasi_sdk = wasi_sdk_path.nil?
65-
@need_fetch_binaryen = @wasm_opt_path.nil?
66-
6764
if @need_fetch_wasi_sdk
6865
if build_dir.nil?
6966
raise "build_dir is required when WASI_SDK_PATH is not set"
@@ -73,14 +70,7 @@ def initialize(
7370
@version_minor = version_minor
7471
end
7572

76-
if @need_fetch_binaryen
77-
if build_dir.nil?
78-
raise "build_dir is required when wasm-opt not installed in PATH"
79-
end
80-
@binaryen_path = File.join(build_dir, "toolchain", "binaryen")
81-
@binaryen_version = binaryen_version
82-
@wasm_opt_path = File.join(@binaryen_path, "bin", "wasm-opt")
83-
end
73+
@binaryen = Binaryen.new(build_dir: build_dir, binaryen_version: binaryen_version)
8474

8575
@tools = {
8676
cc: "#{wasi_sdk_path}/bin/clang",
@@ -101,7 +91,7 @@ def find_tool(name)
10191
end
10292

10393
def wasm_opt
104-
@wasm_opt_path
94+
@binaryen.wasm_opt
10595
end
10696

10797
def wasi_sdk_path
@@ -121,7 +111,53 @@ def download_url(version_major, version_minor)
121111
"https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-#{version_major}/#{asset}"
122112
end
123113

124-
def binaryen_download_url(version)
114+
def install_wasi_sdk
115+
return unless @need_fetch_wasi_sdk
116+
wasi_sdk_tarball =
117+
File.join(File.dirname(@wasi_sdk_path), "wasi-sdk.tar.gz")
118+
unless File.exist? wasi_sdk_tarball
119+
FileUtils.mkdir_p File.dirname(wasi_sdk_tarball)
120+
system "curl -L -o #{wasi_sdk_tarball} #{self.download_url(@version_major, @version_minor)}"
121+
end
122+
unless File.exist? @wasi_sdk_path
123+
FileUtils.mkdir_p @wasi_sdk_path
124+
system "tar -C #{@wasi_sdk_path} --strip-component 1 -xzf #{wasi_sdk_tarball}"
125+
end
126+
end
127+
128+
def install
129+
install_wasi_sdk
130+
@binaryen.install
131+
end
132+
end
133+
134+
class Binaryen
135+
def initialize(build_dir: nil, binaryen_version: 108)
136+
@wasm_opt_path = Toolchain.find_path("wasm-opt")
137+
@need_fetch_binaryen = @wasm_opt_path.nil?
138+
if @need_fetch_binaryen
139+
if build_dir.nil?
140+
raise "build_dir is required when wasm-opt not installed in PATH"
141+
end
142+
@binaryen_path = File.join(build_dir, "toolchain", "binaryen")
143+
@binaryen_version = binaryen_version
144+
@wasm_opt_path = File.join(@binaryen_path, "bin", "wasm-opt")
145+
end
146+
end
147+
148+
def wasm_opt
149+
@wasm_opt_path
150+
end
151+
152+
def binaryen_path
153+
@binaryen_path
154+
end
155+
156+
def binaryen_version
157+
@binaryen_version
158+
end
159+
160+
def download_url(version)
125161
assets = [
126162
[
127163
/x86_64-linux/,
@@ -143,26 +179,12 @@ def binaryen_download_url(version)
143179
"https://github.com/WebAssembly/binaryen/releases/download/version_#{@binaryen_version}/#{asset}"
144180
end
145181

146-
def install_wasi_sdk
147-
return unless @need_fetch_wasi_sdk
148-
wasi_sdk_tarball =
149-
File.join(File.dirname(@wasi_sdk_path), "wasi-sdk.tar.gz")
150-
unless File.exist? wasi_sdk_tarball
151-
FileUtils.mkdir_p File.dirname(wasi_sdk_tarball)
152-
system "curl -L -o #{wasi_sdk_tarball} #{self.download_url(@version_major, @version_minor)}"
153-
end
154-
unless File.exist? @wasi_sdk_path
155-
FileUtils.mkdir_p @wasi_sdk_path
156-
system "tar -C #{@wasi_sdk_path} --strip-component 1 -xzf #{wasi_sdk_tarball}"
157-
end
158-
end
159-
160-
def install_binaryen
182+
def install
161183
return unless @need_fetch_binaryen
162184
binaryen_tarball = File.expand_path("../binaryen.tar.gz", @binaryen_path)
163185
unless File.exist? binaryen_tarball
164186
FileUtils.mkdir_p File.dirname(binaryen_tarball)
165-
system "curl -L -o #{binaryen_tarball} #{self.binaryen_download_url(@binaryen_version)}"
187+
system "curl -L -o #{binaryen_tarball} #{self.download_url(@binaryen_version)}"
166188
end
167189

168190
unless File.exist? @binaryen_path
@@ -171,10 +193,6 @@ def install_binaryen
171193
end
172194
end
173195

174-
def install
175-
install_wasi_sdk
176-
install_binaryen
177-
end
178196
end
179197

180198
class Emscripten < Toolchain

rakelib/packaging.rake

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
wasi_vfs = RubyWasm::WasiVfsProduct.new(File.join(Dir.pwd, "build"))
2-
wasi_sdk = TOOLCHAINS["wasi-sdk"]
2+
binaryen = RubyWasm::Binaryen.new(build_dir: File.join(Dir.pwd, "build"))
33
def exe_rbwasm = File.expand_path(File.join(__dir__, "..", "exe", "rbwasm"))
44

55
tools = {
66
"WASI_VFS_CLI" => exe_rbwasm,
7-
"WASMOPT" => wasi_sdk.wasm_opt
7+
"WASMOPT" => binaryen.wasm_opt
88
}
99

1010
def npm_pkg_build_command(pkg)

sig/ruby_wasm/build.rbs

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -255,13 +255,11 @@ module RubyWasm
255255
class WASISDK < Toolchain
256256
@wasm_opt_path: String
257257
@need_fetch_wasi_sdk: bool
258-
@need_fetch_binaryen: bool
259258
@tools: Hash[Symbol, String]
260259
@wasi_sdk_path: String
261-
@binaryen_version: Integer
262260
@version_major: Integer
263261
@version_minor: Integer
264-
@binaryen_path: String
262+
@binaryen: Binaryen
265263

266264
def initialize: (?String? wasi_sdk_path, ?build_dir: String?, ?version_major: Integer, ?version_minor: Integer, ?binaryen_version: Integer) -> void
267265
def find_tool: (Symbol name) -> String
@@ -273,6 +271,20 @@ module RubyWasm
273271
def install_binaryen: -> void
274272
end
275273

274+
class Binaryen
275+
@need_fetch_binaryen: bool
276+
@binaryen_path: String
277+
@binaryen_version: Integer
278+
@wasm_opt_path: String
279+
280+
def initialize: (?build_dir: String?, ?binaryen_version: Integer) -> void
281+
def wasm_opt: -> String
282+
def binaryen_path: -> String
283+
def binaryen_version: -> Integer
284+
def download_url: (Integer? version) -> String
285+
def install: -> void
286+
end
287+
276288
class Emscripten < Toolchain
277289
@tools: Hash[Symbol, String]
278290

0 commit comments

Comments
 (0)