|
1 |
| -require "rake" |
2 | 1 | require_relative "./product"
|
3 | 2 |
|
4 | 3 | module RubyWasm
|
@@ -28,17 +27,15 @@ def make_args(crossruby)
|
28 | 27 | make_args
|
29 | 28 | end
|
30 | 29 |
|
31 |
| - def define_task(crossruby) |
32 |
| - task "#{crossruby.name}-ext-#{@name}" => [crossruby.configure] do |
33 |
| - lib = @name |
34 |
| - objdir = product_build_dir crossruby |
35 |
| - FileUtils.mkdir_p objdir |
36 |
| - do_extconf crossruby |
37 |
| - sh %Q(make -C "#{objdir}" #{make_args(crossruby).join(" ")} #{lib}.a) |
38 |
| - # A ext can provide link args by link.filelist. It contains only built archive file by default. |
39 |
| - unless File.exist?(linklist(crossruby)) |
40 |
| - File.write(linklist(crossruby), Dir.glob("#{objdir}/*.a").join("\n")) |
41 |
| - end |
| 30 | + def build(crossruby) |
| 31 | + lib = @name |
| 32 | + objdir = product_build_dir crossruby |
| 33 | + FileUtils.mkdir_p objdir |
| 34 | + do_extconf crossruby |
| 35 | + FileUtils.sh %Q(make -C "#{objdir}" #{make_args(crossruby).join(" ")} #{lib}.a) |
| 36 | + # A ext can provide link args by link.filelist. It contains only built archive file by default. |
| 37 | + unless File.exist?(linklist(crossruby)) |
| 38 | + File.write(linklist(crossruby), Dir.glob("#{objdir}/*.a").join("\n")) |
42 | 39 | end
|
43 | 40 | end
|
44 | 41 |
|
@@ -66,19 +63,19 @@ def do_extconf(crossruby)
|
66 | 63 | "-I#{crossruby.build_dir}"
|
67 | 64 | ]
|
68 | 65 | # Clear RUBYOPT to avoid loading unrelated bundle setup
|
69 |
| - sh ({ "RUBYOPT" => "" }), |
70 |
| - "#{crossruby.baseruby_path} #{extconf_args.join(" ")}", |
71 |
| - chdir: objdir |
| 66 | + FileUtils.sh ({ "RUBYOPT" => "" }), |
| 67 | + "#{crossruby.baseruby_path} #{extconf_args.join(" ")}", |
| 68 | + chdir: objdir |
72 | 69 | end
|
73 | 70 |
|
74 | 71 | def do_install_rb(crossruby)
|
75 | 72 | objdir = product_build_dir crossruby
|
76 |
| - sh %Q(make -C "#{objdir}" #{make_args(crossruby).join(" ")} install-rb) |
| 73 | + FileUtils.sh %Q(make -C "#{objdir}" #{make_args(crossruby).join(" ")} install-rb) |
77 | 74 | end
|
78 | 75 | end
|
79 | 76 |
|
80 | 77 | class CrossRubyProduct < AutoconfProduct
|
81 |
| - attr_reader :source, :toolchain, :build, :configure, :install_task |
| 78 | + attr_reader :source, :toolchain |
82 | 79 | attr_accessor :user_exts,
|
83 | 80 | :wasmoptflags,
|
84 | 81 | :cppflags,
|
@@ -115,51 +112,39 @@ def initialize(
|
115 | 112 | super(@params.target, @toolchain)
|
116 | 113 | end
|
117 | 114 |
|
118 |
| - def define_task |
119 |
| - directory dest_dir |
120 |
| - directory build_dir |
121 |
| - |
122 |
| - @configure = |
123 |
| - task "#{name}-configure", |
124 |
| - [:reconfigure] => |
125 |
| - [build_dir, source.src_dir, source.configure_file] + |
126 |
| - dep_tasks do |t, args| |
127 |
| - args.with_defaults(reconfigure: false) |
128 |
| - |
129 |
| - if !File.exist?("#{build_dir}/Makefile") || args[:reconfigure] |
130 |
| - args = configure_args(RbConfig::CONFIG["host"], toolchain) |
131 |
| - sh "#{source.configure_file} #{args.join(" ")}", chdir: build_dir |
132 |
| - end |
133 |
| - # NOTE: we need rbconfig.rb at configuration time to build user given extensions with mkmf |
134 |
| - sh "make rbconfig.rb", chdir: build_dir |
135 |
| - end |
136 |
| - |
137 |
| - user_ext_products = @user_exts |
138 |
| - user_ext_tasks = @user_exts.map { |prod| prod.define_task(self) } |
139 |
| - extinit_task = |
140 |
| - task extinit_obj => [@configure, extinit_c_erb] + user_ext_tasks do |
141 |
| - mkdir_p File.dirname(extinit_obj) |
142 |
| - sh %Q(ruby #{extinit_c_erb} #{@user_exts.map(&:name).join(" ")} | #{toolchain.cc} -c -x c - -o #{extinit_obj}) |
143 |
| - end |
| 115 | + def configure(reconfigure: false) |
| 116 | + if !File.exist?("#{build_dir}/Makefile") || reconfigure |
| 117 | + args = configure_args(RbConfig::CONFIG["host"], toolchain) |
| 118 | + FileUtils.sh "#{source.configure_file} #{args.join(" ")}", |
| 119 | + chdir: build_dir |
| 120 | + end |
| 121 | + # NOTE: we need rbconfig.rb at configuration time to build user given extensions with mkmf |
| 122 | + FileUtils.sh "make rbconfig.rb", chdir: build_dir |
| 123 | + end |
144 | 124 |
|
145 |
| - install_dir = File.join(build_dir, "install") |
146 |
| - install = |
147 |
| - task install_dir => [@configure, extinit_task, dest_dir] do |
148 |
| - next if File.exist?(install_dir) |
149 |
| - sh "make install DESTDIR=#{install_dir}", chdir: build_dir |
150 |
| - end |
151 |
| - |
152 |
| - @install_task = |
153 |
| - task artifact => [@configure, install, dest_dir] do |
154 |
| - rm_rf dest_dir |
155 |
| - cp_r install_dir, dest_dir |
156 |
| - @user_exts.each { |ext| ext.do_install_rb(self) } |
157 |
| - sh "tar cfz #{artifact} -C rubies #{name}" |
158 |
| - end |
| 125 | + def build_exts |
| 126 | + @user_exts.each { |prod| prod.build(self) } |
| 127 | + mkdir_p File.dirname(extinit_obj) |
| 128 | + FileUtils.sh %Q(ruby #{extinit_c_erb} #{@user_exts.map(&:name).join(" ")} | #{toolchain.cc} -c -x c - -o #{extinit_obj}) |
159 | 129 | end
|
160 | 130 |
|
161 |
| - def build |
162 |
| - @install_task.invoke |
| 131 | + def build(remake: false, reconfigure: false) |
| 132 | + FileUtils.mkdir_p dest_dir |
| 133 | + FileUtils.mkdir_p build_dir |
| 134 | + Rake::Task[source.configure_file].invoke |
| 135 | + dep_tasks.each(&:invoke) |
| 136 | + configure(reconfigure: reconfigure) |
| 137 | + build_exts |
| 138 | + |
| 139 | + install_dir = File.join(build_dir, "install") |
| 140 | + if !File.exist?(install_dir) || remake || reconfigure |
| 141 | + FileUtils.sh "make install DESTDIR=#{install_dir}", chdir: build_dir |
| 142 | + end |
| 143 | + |
| 144 | + FileUtils.rm_rf dest_dir |
| 145 | + FileUtils.cp_r install_dir, dest_dir |
| 146 | + @user_exts.each { |ext| ext.do_install_rb(self) } |
| 147 | + FileUtils.sh "tar cfz #{artifact} -C rubies #{name}" |
163 | 148 | end
|
164 | 149 |
|
165 | 150 | def name
|
|
0 commit comments