Skip to content

Commit 5ac225d

Browse files
download wasi-sdk if WASI_SDK_PATH not defined
1 parent bfae984 commit 5ac225d

File tree

6 files changed

+81
-18
lines changed

6 files changed

+81
-18
lines changed

Rakefile

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -49,18 +49,17 @@ namespace :build do
4949
BUILDS.each do |params|
5050
name = "#{params[:src]}-#{params[:target]}-#{params[:profile]}"
5151
source = BUILD_SOURCES[params[:src]].merge(name: params[:src])
52-
toolchain = RubyWasm::Toolchain.get params[:target]
53-
user_exts = BUILD_PROFILES[params[:profile]][:user_exts].map do |ext|
54-
srcdir = File.join(LIB_ROOT, "ext", ext)
55-
RubyWasm::CrossRubyExtProduct.new(srcdir, toolchain)
56-
end
5752
options = params
5853
.merge(BUILD_PROFILES[params[:profile]])
59-
.merge(src: source, toolchain: toolchain)
54+
.merge(src: source)
6055
options.delete :profile
6156
options.delete :user_exts
6257
RubyWasm::BuildTask.new(name, **options) do |t|
63-
t.crossruby.user_exts = user_exts
58+
toolchain = t.toolchain
59+
t.crossruby.user_exts = BUILD_PROFILES[params[:profile]][:user_exts].map do |ext|
60+
srcdir = File.join(LIB_ROOT, "ext", ext)
61+
RubyWasm::CrossRubyExtProduct.new(srcdir, toolchain)
62+
end
6463
end
6564
end
6665
end

lib/ruby_wasm/build_system/product/crossruby.rb

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ def do_install_rb(crossruby)
7474
end
7575
end
7676

77-
class CrossRubyProduct < BuildProduct
77+
class CrossRubyProduct < AutoconfProduct
7878
attr_reader :source, :toolchain, :build, :configure
7979
attr_accessor :user_exts, :wasmoptflags
8080

@@ -96,6 +96,7 @@ def initialize(
9696
@dep_tasks = []
9797
@user_exts = user_exts
9898
@wasmoptflags = nil
99+
super(@params.target, @toolchain)
99100
end
100101

101102
def define_task
@@ -189,7 +190,7 @@ def baseruby_path
189190
end
190191

191192
def dep_tasks
192-
[@baseruby.install_task] + @dep_tasks
193+
[@baseruby.install_task, @toolchain.install_task] + @dep_tasks
193194
end
194195

195196
def configure_args(build_triple, toolchain)
@@ -206,7 +207,7 @@ def configure_args(build_triple, toolchain)
206207

207208
xldflags = []
208209

209-
args = ["--host", target, "--build", build_triple]
210+
args = self.system_triplet_args
210211
args << "--with-static-linked-ext"
211212
args << %Q(--with-ext="#{default_exts}")
212213
args << %Q(--with-libyaml-dir="#{@libyaml.install_root}")
@@ -218,11 +219,11 @@ def configure_args(build_triple, toolchain)
218219
xldflags << @wasi_vfs.lib_wasi_vfs_a if @wasi_vfs
219220
when "wasm32-unknown-emscripten"
220221
ldflags.concat(%w[-s MODULARIZE=1])
221-
args.concat(%w[CC=emcc LD=emcc AR=emar RANLIB=emranlib])
222222
else
223223
raise "unknown target: #{target}"
224224
end
225225

226+
args.concat(self.tools_args)
226227
(@user_exts || []).each { |lib| xldflags << "@#{lib.linklist(self)}" }
227228
xldflags << extinit_obj
228229

lib/ruby_wasm/build_system/product/libyaml.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ def name
3131

3232
def define_task
3333
@install_task =
34-
task(name) do
34+
task name => [@toolchain.define_task] do
3535
next if Dir.exist?(install_root)
3636

3737
mkdir_p File.dirname(product_build_dir)

lib/ruby_wasm/build_system/product/zlib.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ def name
3131

3232
def define_task
3333
@install_task =
34-
task(name) do
34+
task name => [@toolchain.define_task] do
3535
next if Dir.exist?(install_root)
3636

3737
mkdir_p File.dirname(product_build_dir)

lib/ruby_wasm/build_system/toolchain.rb

Lines changed: 66 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
module RubyWasm
2-
class Toolchain
2+
class Toolchain < ::Rake::TaskLib
3+
attr_reader :name
4+
35
def initialize
46
@tools = {}
57
end
@@ -12,10 +14,10 @@ def check_envvar(name)
1214
raise "missing environment variable: #{name}" if ENV[name].nil?
1315
end
1416

15-
def self.get(target)
17+
def self.get(target, build_dir = nil)
1618
case target
1719
when "wasm32-unknown-wasi"
18-
return RubyWasm::WASISDK.new
20+
return RubyWasm::WASISDK.new(build_dir: build_dir)
1921
when "wasm32-unknown-emscripten"
2022
return RubyWasm::Emscripten.new
2123
else
@@ -42,13 +44,31 @@ def self.check_executable(command)
4244
end
4345

4446
class WASISDK < Toolchain
45-
def initialize(wasi_sdk_path = ENV["WASI_SDK_PATH"])
47+
def initialize(
48+
wasi_sdk_path = ENV["WASI_SDK_PATH"],
49+
build_dir: nil,
50+
version_major: 14,
51+
version_minor: 0
52+
)
53+
if wasi_sdk_path.nil?
54+
if build_dir.nil?
55+
raise "build_dir is required when WASI_SDK_PATH is not set"
56+
end
57+
wasi_sdk_path = File.join(build_dir, "toolchain", "wasi-sdk")
58+
@need_fetch = true
59+
@version_major = version_major
60+
@version_minor = version_minor
61+
else
62+
@need_fetch = false
63+
end
4664
@tools = {
4765
cc: "#{wasi_sdk_path}/bin/clang",
4866
ld: "#{wasi_sdk_path}/bin/clang",
4967
ar: "#{wasi_sdk_path}/bin/llvm-ar",
5068
ranlib: "#{wasi_sdk_path}/bin/llvm-ranlib"
5169
}
70+
@wasi_sdk_path = wasi_sdk_path
71+
@name = "wasi-sdk"
5272
end
5373

5474
def find_tool(name)
@@ -58,11 +78,53 @@ def find_tool(name)
5878
end
5979
@tools[name]
6080
end
81+
82+
def define_task
83+
@task ||= fetch_task(@wasi_sdk_path)
84+
end
85+
86+
def install_task
87+
@task
88+
end
89+
90+
def download_url(version_major, version_minor)
91+
version = "#{version_major}.#{version_minor}"
92+
assets = [
93+
[/x86_64-linux/, "wasi-sdk-#{version}-linux.tar.gz"],
94+
[/(arm64|x86_64)-darwin/, "wasi-sdk-#{version}-macos.tar.gz"]
95+
]
96+
asset = assets.find { |os, _| os =~ RUBY_PLATFORM }&.at(1)
97+
if asset.nil?
98+
raise "unsupported platform for fetching WASI SDK: #{RUBY_PLATFORM}"
99+
end
100+
"https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-#{version_major}/#{asset}"
101+
end
102+
103+
def fetch_task(output_dir)
104+
unless @need_fetch
105+
return task "wasi-sdk:fetch" => [] do
106+
end
107+
end
108+
tarball = File.join(File.dirname(output_dir), "wasi-sdk.tar.gz")
109+
file tarball do
110+
mkdir_p output_dir
111+
sh "curl -L -o #{tarball} #{self.download_url(@version_major, @version_minor)}"
112+
end
113+
task "wasi-sdk:fetch" => tarball do
114+
sh "tar -C #{output_dir} --strip-component 1 -xzf #{tarball}"
115+
end
116+
end
61117
end
62118

63119
class Emscripten < Toolchain
64120
def initialize
65121
@tools = { cc: "emcc", ld: "emcc", ar: "emar", ranlib: "emranlib" }
122+
@name = "emscripten"
123+
end
124+
125+
def define_task
126+
end
127+
def install_task
66128
end
67129

68130
def find_tool(name)

lib/ruby_wasm/rake_task.rb

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,8 @@ def initialize(
3737
@target = target
3838
@build_dir = build_dir || File.join(Dir.pwd, "build")
3939
@rubies_dir = rubies_dir || File.join(Dir.pwd, "rubies")
40-
@toolchain = toolchain || RubyWasm::Toolchain.get(target)
40+
@toolchain =
41+
add_product (toolchain || RubyWasm::Toolchain.get(target, @build_dir))
4142

4243
@libyaml =
4344
add_product RubyWasm::LibYAMLProduct.new(@build_dir, @target, @toolchain)

0 commit comments

Comments
 (0)