11require_relative "./toolchain/wit_bindgen"
22
33module RubyWasm
4- class Toolchain < :: Rake :: TaskLib
4+ class Toolchain
55 attr_reader :name
66
77 def initialize
@@ -45,8 +45,9 @@ def self.check_executable(command)
4545
4646 %i[ cc ranlib ld ar ] . each do |name |
4747 define_method ( name ) do
48- @tools [ name ] ||= find_tool ( name )
49- @tools [ name ]
48+ @tools_cache ||= { }
49+ @tools_cache [ name ] ||= find_tool ( name )
50+ @tools_cache [ name ]
5051 end
5152 end
5253 end
@@ -92,8 +93,7 @@ def initialize(
9293 end
9394
9495 def find_tool ( name )
95- unless File . exist? @tools [ name ]
96- check_envvar ( "WASI_SDK_PATH" )
96+ if !File . exist? ( @tools [ name ] ) && !ENV [ "WASI_SDK_PATH" ] . nil?
9797 raise "missing tool '#{ name } ' at #{ @tools [ name ] } "
9898 end
9999 @tools [ name ]
@@ -103,18 +103,6 @@ def wasm_opt
103103 @wasm_opt_path
104104 end
105105
106- def define_task
107- @task ||= fetch_task
108- end
109-
110- def install_task
111- @task
112- end
113-
114- def binaryen_install_task
115- @binaryen_install_task
116- end
117-
118106 def download_url ( version_major , version_minor )
119107 version = "#{ version_major } .#{ version_minor } "
120108 assets = [
@@ -150,43 +138,37 @@ def binaryen_download_url(version)
150138 "https://github.com/WebAssembly/binaryen/releases/download/version_#{ @binaryen_version } /#{ asset } "
151139 end
152140
153- def fetch_task
154- required = [ ]
155- if @need_fetch_wasi_sdk
156- wasi_sdk_tarball =
157- File . join ( File . dirname ( @wasi_sdk_path ) , "wasi-sdk.tar.gz" )
158- file wasi_sdk_tarball do
159- mkdir_p File . dirname ( wasi_sdk_tarball )
160- sh "curl -L -o #{ wasi_sdk_tarball } #{ self . download_url ( @version_major , @version_minor ) } "
161- end
162- wasi_sdk =
163- file_create @wasi_sdk_path => wasi_sdk_tarball do
164- mkdir_p @wasi_sdk_path
165- sh "tar -C #{ @wasi_sdk_path } --strip-component 1 -xzf #{ wasi_sdk_tarball } "
166- end
167- required << wasi_sdk
141+ def install_wasi_sdk
142+ return unless @need_fetch_wasi_sdk
143+ wasi_sdk_tarball =
144+ File . join ( File . dirname ( @wasi_sdk_path ) , "wasi-sdk.tar.gz" )
145+ unless File . exist? wasi_sdk_tarball
146+ FileUtils . mkdir_p File . dirname ( wasi_sdk_tarball )
147+ system "curl -L -o #{ wasi_sdk_tarball } #{ self . download_url ( @version_major , @version_minor ) } "
148+ end
149+ unless File . exist? @wasi_sdk_path
150+ FileUtils . mkdir_p @wasi_sdk_path
151+ system "tar -C #{ @wasi_sdk_path } --strip-component 1 -xzf #{ wasi_sdk_tarball } "
168152 end
153+ end
169154
170- if @need_fetch_binaryen
171- binaryen_tarball =
172- File . expand_path ( "../binaryen.tar.gz" , @binaryen_path )
173- file binaryen_tarball do
174- mkdir_p File . dirname ( binaryen_tarball )
175- sh "curl -L -o #{ binaryen_tarball } #{ self . binaryen_download_url ( @binaryen_version ) } "
176- end
155+ def install_binaryen
156+ return unless @need_fetch_binaryen
157+ binaryen_tarball = File . expand_path ( "../binaryen.tar.gz" , @binaryen_path )
158+ unless File . exist? binaryen_tarball
159+ FileUtils . mkdir_p File . dirname ( binaryen_tarball )
160+ system "curl -L -o #{ binaryen_tarball } #{ self . binaryen_download_url ( @binaryen_version ) } "
161+ end
177162
178- binaryen =
179- file_create @binaryen_path => binaryen_tarball do
180- mkdir_p @binaryen_path
181- sh "tar -C #{ @binaryen_path } --strip-component 1 -xzf #{ binaryen_tarball } "
182- end
183- @binaryen_install_task ||= task "binaryen:install" => [ binaryen ]
184- required << binaryen
185- else
186- # no-op when already available
187- @binaryen_install_task ||= task "binaryen:install"
163+ unless File . exist? @binaryen_path
164+ FileUtils . mkdir_p @binaryen_path
165+ system "tar -C #{ @binaryen_path } --strip-component 1 -xzf #{ binaryen_tarball } "
188166 end
189- multitask "wasi-sdk:install" => required
167+ end
168+
169+ def install
170+ install_wasi_sdk
171+ install_binaryen
190172 end
191173 end
192174
@@ -196,12 +178,7 @@ def initialize
196178 @name = "emscripten"
197179 end
198180
199- def define_task
200- @task ||= task "emscripten:install"
201- end
202-
203- def install_task
204- @task
181+ def install
205182 end
206183
207184 def find_tool ( name )
0 commit comments