Skip to content

Commit 0fcea61

Browse files
committed
build(crossruby): pass host dump_ast when supported
Detect whether the Ruby source supports --with-dump-ast and pass the host-built dump_ast alongside --with-baseruby for cross builds. This fixes ruby-head-wasm-wasi builds on current Ruby head while avoiding configure failures on older Ruby versions.
1 parent 1345e17 commit 0fcea61

3 files changed

Lines changed: 107 additions & 0 deletions

File tree

lib/ruby_wasm/build/product/crossruby.rb

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -322,6 +322,10 @@ def baseruby_path
322322
File.join(@baseruby.install_dir, "bin/ruby")
323323
end
324324

325+
def dump_ast_path
326+
File.join(@baseruby.product_build_dir, "dump_ast")
327+
end
328+
325329
def configure_args(build_triple, toolchain)
326330
target = @params.target.triple
327331
default_exts = @params.default_exts
@@ -336,6 +340,7 @@ def configure_args(build_triple, toolchain)
336340
args << %Q(--with-zlib-dir=#{@zlib.install_root})
337341
args << %Q(--with-openssl-dir=#{@openssl.install_root}) if @openssl
338342
args << %Q(--with-baseruby=#{baseruby_path})
343+
args << %Q(--with-dump-ast=#{dump_ast_path}) if @source.supports_with_dump_ast?
339344

340345
case target
341346
when /^wasm32-unknown-wasi/

lib/ruby_wasm/build/product/ruby_source.rb

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,12 @@ def configure_file
3333
File.join(src_dir, "configure")
3434
end
3535

36+
def supports_with_dump_ast?
37+
[File.join(src_dir, "configure.ac"), configure_file].any? do |path|
38+
File.file?(path) && File.read(path).include?("--with-dump-ast")
39+
end
40+
end
41+
3642
def fetch(executor)
3743
case @params[:type]
3844
when "github"
Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
require "test-unit"
2+
require "tmpdir"
3+
require "fileutils"
4+
require_relative "../lib/ruby_wasm/build"
5+
require_relative "../lib/ruby_wasm/build/product/ruby_source"
6+
require_relative "../lib/ruby_wasm/build/product/crossruby"
7+
8+
class TestCrossRubyConfigureArgs < Test::Unit::TestCase
9+
FakeProduct = Struct.new(:install_root, :install_dir, :product_build_dir)
10+
FakeToolchain =
11+
Struct.new(
12+
:cc,
13+
:cxx,
14+
:ld,
15+
:ar,
16+
:ranlib,
17+
:wasm_opt,
18+
:wasi_sdk_path,
19+
keyword_init: true
20+
)
21+
22+
def setup
23+
@toolchain =
24+
FakeToolchain.new(
25+
cc: "clang",
26+
cxx: "clang++",
27+
ld: "wasm-ld",
28+
ar: "llvm-ar",
29+
ranlib: "llvm-ranlib",
30+
wasm_opt: "wasm-opt",
31+
wasi_sdk_path: "/opt/wasi-sdk"
32+
)
33+
end
34+
35+
def build_crossruby(tmpdir, configure_contents:)
36+
source =
37+
RubyWasm::BuildSource.new(
38+
{
39+
name: "head",
40+
type: "local",
41+
path: tmpdir,
42+
},
43+
tmpdir
44+
)
45+
FileUtils.mkdir_p(source.src_dir)
46+
File.write(File.join(source.src_dir, "configure.ac"), configure_contents)
47+
48+
params =
49+
RubyWasm::BuildParams.new(
50+
name: "ruby-head-wasm-wasi",
51+
target: RubyWasm::Target.new("wasm32-unknown-wasip1"),
52+
default_exts: "json"
53+
)
54+
baseruby = FakeProduct.new(nil, "/tmp/baseruby/opt", "/tmp/baseruby/build")
55+
crossruby =
56+
RubyWasm::CrossRubyProduct.new(
57+
params,
58+
File.join(tmpdir, "build"),
59+
File.join(tmpdir, "rubies"),
60+
baseruby,
61+
source,
62+
@toolchain
63+
)
64+
crossruby.with_libyaml(FakeProduct.new("/tmp/libyaml"))
65+
crossruby.with_zlib(FakeProduct.new("/tmp/zlib"))
66+
crossruby
67+
end
68+
69+
def test_configure_args_include_dump_ast_when_supported
70+
Dir.mktmpdir do |tmpdir|
71+
crossruby =
72+
build_crossruby(
73+
tmpdir,
74+
configure_contents: "AC_ARG_WITH(dump-ast,\n AS_HELP_STRING([--with-dump-ast=DUMP_AST], []))"
75+
)
76+
77+
args = crossruby.configure_args("x86_64-linux-gnu", @toolchain)
78+
79+
assert_include args, "--with-dump-ast=/tmp/baseruby/build/dump_ast"
80+
end
81+
end
82+
83+
def test_configure_args_skip_dump_ast_when_unsupported
84+
Dir.mktmpdir do |tmpdir|
85+
crossruby =
86+
build_crossruby(
87+
tmpdir,
88+
configure_contents: "AC_ARG_WITH(baseruby,\n AS_HELP_STRING([--with-baseruby=BASERUBY], []))"
89+
)
90+
91+
args = crossruby.configure_args("x86_64-linux-gnu", @toolchain)
92+
93+
assert_not_include args.grep(/\A--with-dump-ast=/), "--with-dump-ast=/tmp/baseruby/build/dump_ast"
94+
end
95+
end
96+
end

0 commit comments

Comments
 (0)