wxruby3 0.9.4 → 0.9.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. checksums.yaml +4 -4
  2. data/INSTALL.md +315 -78
  3. data/README.md +32 -21
  4. data/ext/wxruby3/include/wxruby-ComboPopup.h +777 -0
  5. data/lib/wx/core/combo_ctrl.rb +171 -0
  6. data/lib/wx/core/ext.rb +22 -3
  7. data/lib/wx/doc/comboctrl.rb +128 -3
  8. data/lib/wx/doc/owner_drawn_combobox.rb +5 -1
  9. data/lib/wx/version.rb +1 -1
  10. data/lib/wx/wxruby/base.rb +6 -4
  11. data/lib/wx/wxruby/cmd/sampler.rb +39 -29
  12. data/lib/wx/wxruby/cmd/setup.rb +122 -0
  13. data/lib/wx/wxruby/cmd/test.rb +56 -6
  14. data/rakefile +14 -0
  15. data/rakelib/bin.rake +48 -0
  16. data/rakelib/bin.rb +62 -0
  17. data/rakelib/build.rb +11 -7
  18. data/rakelib/config.rake +3 -1
  19. data/rakelib/configure.rb +28 -8
  20. data/rakelib/doc.rake +3 -1
  21. data/rakelib/gem.rake +169 -0
  22. data/rakelib/gem.rb +82 -0
  23. data/rakelib/install.rb +2 -0
  24. data/rakelib/lib/config/linux.rb +24 -2
  25. data/rakelib/lib/config/macosx.rb +16 -0
  26. data/rakelib/lib/config/mingw.rb +133 -9
  27. data/rakelib/lib/config/pkgman/arch.rb +53 -0
  28. data/rakelib/lib/config/pkgman/base.rb +169 -0
  29. data/rakelib/lib/config/pkgman/debian.rb +66 -0
  30. data/rakelib/lib/config/pkgman/macosx.rb +183 -0
  31. data/rakelib/lib/config/pkgman/rhel.rb +54 -0
  32. data/rakelib/lib/config/pkgman/suse.rb +54 -0
  33. data/rakelib/lib/config/unixish.rb +36 -19
  34. data/rakelib/lib/config.rb +254 -61
  35. data/rakelib/lib/core/include/funcall.inc +2 -1
  36. data/rakelib/lib/core/package.rb +47 -49
  37. data/rakelib/lib/director/comboctrl.rb +104 -3
  38. data/rakelib/lib/director/defs.rb +1 -3
  39. data/rakelib/lib/director/gdicommon.rb +5 -0
  40. data/rakelib/lib/director/menu_item.rb +1 -1
  41. data/rakelib/lib/director/num_validator.rb +5 -7
  42. data/rakelib/lib/director/owner_drawn_combobox.rb +1 -0
  43. data/rakelib/lib/director/persistent_window.rb +2 -2
  44. data/rakelib/lib/director/pgeditor.rb +1 -1
  45. data/rakelib/lib/director/pgproperties.rb +3 -3
  46. data/rakelib/lib/director/pgproperty.rb +5 -1
  47. data/rakelib/lib/director/richtext_style_listbox.rb +5 -0
  48. data/rakelib/lib/director/sizer.rb +1 -1
  49. data/rakelib/lib/director/window.rb +4 -0
  50. data/rakelib/lib/extractor/module.rb +15 -0
  51. data/rakelib/lib/generate/doc/combo_ctrl.yaml +135 -0
  52. data/rakelib/lib/generate/doc/file_dialog_customize_hook.yaml +62 -0
  53. data/rakelib/lib/generate/doc/file_system.yaml +28 -0
  54. data/rakelib/lib/generate/doc.rb +29 -14
  55. data/rakelib/lib/generate/interface.rb +16 -6
  56. data/rakelib/lib/swig_runner.rb +18 -15
  57. data/rakelib/lib/typemap/combo_popup.rb +42 -0
  58. data/rakelib/prepost.rake +9 -4
  59. data/rakelib/yard/templates/default/fulldoc/html/css/wxruby3.css +14 -0
  60. data/rakelib/yard/templates/default/fulldoc/html/setup.rb +5 -5
  61. data/rakelib/yard/yard/relative_markdown_links.rb +7 -1
  62. data/tests/test_combo_ctrl.rb +196 -0
  63. metadata +28 -17
  64. data/ext/mkrf_conf_srcgem.rb +0 -67
  65. data/rakelib/run.rake +0 -52
@@ -0,0 +1,54 @@
1
+ # Copyright (c) 2023 M.J.N. Corino, The Netherlands
2
+ #
3
+ # This software is released under the MIT license.
4
+
5
+ ###
6
+ # wxRuby3 buildtools platform pkg manager for RHEL type systems
7
+ ###
8
+
9
+ module WXRuby3
10
+
11
+ module Config
12
+
13
+ module Platform
14
+
15
+ module PkgManager
16
+
17
+ PLATFORM_DEPS = %w[expat-devel findutils gspell-devel gstreamer1-plugins-base-devel gtk3-devel libcurl-devel libjpeg-devel libnotify-devel libpng-devel libSM-devel libsecret-devel libtiff-devel SDL-devel webkit2gtk4.1-devel zlib-devel]
18
+
19
+ class << self
20
+
21
+ private
22
+
23
+ def do_install(distro, pkgs)
24
+ run_dnf(make_install_cmd(pkgs))
25
+ end
26
+
27
+ def add_platform_pkgs(pkgs)
28
+ # add build tools
29
+ if pkgs.include?('git')
30
+ pkgs.delete('git')
31
+ pkgs << 'git-core'
32
+ end
33
+ # find pkgs we need
34
+ PLATFORM_DEPS.inject(pkgs) { |list, pkg| list << pkg unless system("dnf list installed #{pkg} >/dev/null 2>&1"); list }
35
+ end
36
+
37
+ def run_dnf(cmd)
38
+ run("dnf #{cmd}")
39
+ end
40
+
41
+ def make_install_cmd(pkgs)
42
+ # create install command
43
+ "install -y #{ pkgs.join(' ') }"
44
+ end
45
+
46
+ end
47
+
48
+ end
49
+
50
+ end
51
+
52
+ end
53
+
54
+ end
@@ -0,0 +1,54 @@
1
+ # Copyright (c) 2023 M.J.N. Corino, The Netherlands
2
+ #
3
+ # This software is released under the MIT license.
4
+
5
+ ###
6
+ # wxRuby3 buildtools platform pkg manager for SuSE type systems
7
+ ###
8
+
9
+ module WXRuby3
10
+
11
+ module Config
12
+
13
+ module Platform
14
+
15
+ module PkgManager
16
+
17
+ PLATFORM_DEPS = %w[gtk3-devel webkit2gtk3-devel gspell-devel gstreamer-devel gstreamer-plugins-base-devel libcurl-devel libsecret-devel libnotify-devel libSDL-devel zlib-devel libjpeg-devel libpng-devel]
18
+
19
+ class << self
20
+
21
+ private
22
+
23
+ def do_install(distro, pkgs)
24
+ run_zypper(make_install_cmd(pkgs))
25
+ end
26
+
27
+ def add_platform_pkgs(pkgs)
28
+ # add build tools
29
+ if pkgs.include?('g++')
30
+ pkgs.delete('g++')
31
+ pkgs << 'gcc-c++'
32
+ end
33
+ # find pkgs we need
34
+ PLATFORM_DEPS.inject(pkgs) { |list, pkg| list << pkg unless system("rpm -q --whatprovides #{pkg} >/dev/null 2>&1"); list }
35
+ end
36
+
37
+ def run_zypper(cmd)
38
+ run("zypper -t -i #{cmd}")
39
+ end
40
+
41
+ def make_install_cmd(pkgs)
42
+ # create install command
43
+ "install -y #{ pkgs.join(' ') }"
44
+ end
45
+
46
+ end
47
+
48
+ end
49
+
50
+ end
51
+
52
+ end
53
+
54
+ end
@@ -52,32 +52,49 @@ module WXRuby3
52
52
  objs = pkg.all_obj_files.collect { |o| File.join('..', o) }.join(' ') + ' '
53
53
  depsh = pkg.dep_libnames.collect { |dl| "#{dl}.#{dll_ext}" }.join(' ')
54
54
  sh "cd lib && #{WXRuby3.config.ld} #{WXRuby3.config.ldflags(pkg.lib_target)} #{objs} #{depsh} " +
55
- "#{WXRuby3.config.libs} #{WXRuby3.config.link_output_flag}#{pkg.lib_target}"
55
+ "#{WXRuby3.config.libs} #{WXRuby3.config.link_output_flag}#{pkg.lib_target}",
56
+ fail_on_error: true
57
+ end
58
+
59
+ def check_tool_pkgs
60
+ pkg_deps = super
61
+ pkg_deps << 'doxygen' unless system('command -v doxygen>/dev/null')
62
+ pkg_deps << 'swig' unless system('command -v swig>/dev/null')
63
+ pkg_deps
56
64
  end
57
65
 
58
66
  def get_rpath_origin
59
67
  "$ORIGIN"
60
68
  end
61
69
 
70
+ def expand(cmd)
71
+ STDERR.puts "> sh: #{cmd}" if verbose?
72
+ s = super
73
+ STDERR.puts "< #{s}" if verbose?
74
+ s
75
+ end
76
+
62
77
  private
63
78
 
64
79
  def wx_checkout
65
- check_git
80
+ $stdout.print 'Checking out wxWidgets...' if run_silent?
66
81
  # clone wxWidgets GIT repository under ext_path
67
82
  chdir(ext_path) do
68
- if (rc = sh("git clone https://github.com/wxWidgets/wxWidgets.git"))
83
+ if (rc = sh("#{get_cfg_string('git')} clone https://github.com/wxWidgets/wxWidgets.git"))
69
84
  chdir('wxWidgets') do
70
85
  tag = if @wx_version
71
86
  "v#{@wx_version}"
72
87
  else
73
- expand('git tag').split("\n").select { |t| (/\Av3\.(\d+)/ =~ t) && $1.to_i >= 2 }.max
88
+ expand("#{get_cfg_string('git')} tag").split("\n").select { |t| (/\Av3\.(\d+)/ =~ t) && $1.to_i >= 2 }.max
74
89
  end
75
90
  # checkout the version we are building against
76
- rc = sh("git checkout #{tag}")
91
+ rc = sh("#{get_cfg_string('git')} checkout #{tag}")
77
92
  end
78
93
  end
79
- unless rc
80
- STDERR.puts "ERROR: Failed to checkout wxWidgets."
94
+ if rc
95
+ $stdout.puts 'done!' if run_silent?
96
+ else
97
+ $stderr.puts "ERROR: Failed to checkout wxWidgets."
81
98
  exit(1)
82
99
  end
83
100
  end
@@ -92,36 +109,36 @@ module WXRuby3
92
109
  end
93
110
 
94
111
  def wx_build
112
+ $stdout.print 'Configuring wxWidgets...' if run_silent?
95
113
  # initialize submodules
96
- unless sh('git submodule update --init')
97
- STDERR.puts "ERROR: Failed to update wxWidgets submodules."
114
+ unless sh("#{get_cfg_string('git')} submodule update --init")
115
+ $stderr.puts "ERROR: Failed to update wxWidgets submodules."
98
116
  exit(1)
99
117
  end
100
118
  # configure wxWidgets
101
119
  unless wx_configure
102
- STDERR.puts "ERROR: Failed to configure wxWidgets."
120
+ $stderr.puts "ERROR: Failed to configure wxWidgets."
103
121
  exit(1)
104
122
  end
123
+ $stdout.puts 'done!' if run_silent?
124
+ $stdout.print 'Building wxWidgets...' if run_silent?
105
125
  # make and install wxWidgets
106
126
  unless wx_make
107
- STDERR.puts "ERROR: Failed to build wxWidgets libraries."
127
+ $stderr.puts "ERROR: Failed to build wxWidgets libraries."
108
128
  exit(1)
109
129
  end
130
+ $stdout.puts 'done!' if run_silent?
110
131
  end
111
132
 
112
133
  def wx_generate_xml
113
134
  chdir(File.join(ext_path, 'wxWidgets', 'docs', 'doxygen')) do
114
- sh({ 'WX_SKIP_DOXYGEN_VERSION_CHECK' => '1' }, './regen.sh xml')
135
+ unless sh({ 'DOXYGEN' => get_cfg_string("doxygen"), 'WX_SKIP_DOXYGEN_VERSION_CHECK' => '1' }, './regen.sh xml')
136
+ $stderr.puts 'ERROR: Failed to generate wxWidgets XML API specifications for parsing by wxRuby3.'
137
+ exit(1)
138
+ end
115
139
  end
116
140
  end
117
141
 
118
- def expand(cmd)
119
- STDERR.puts "> sh: #{cmd}" if verbose?
120
- s = super
121
- STDERR.puts "< #{s}" if verbose?
122
- s
123
- end
124
-
125
142
  # Allow specification of custom wxWidgets build (mostly useful for
126
143
  # static wxRuby3 builds)
127
144
  def get_wx_path
@@ -9,6 +9,8 @@
9
9
  require 'rbconfig'
10
10
  require 'fileutils'
11
11
  require 'json'
12
+ require 'open3'
13
+ require 'monitor'
12
14
 
13
15
  module FileUtils
14
16
  # add convenience methods
@@ -73,14 +75,16 @@ module WXRuby3
73
75
  'with-wxwin' => !!ENV['WITH_WXWIN'],
74
76
  'with-debug' => ((ENV['WXRUBY_DEBUG'] || '') == '1'),
75
77
  'swig' => ENV['WXRUBY_SWIG'] || 'swig',
76
- 'doxygen' => ENV['WXRUBY_DOXYGEN'] || 'doxygen'
78
+ 'doxygen' => ENV['WXRUBY_DOXYGEN'] || 'doxygen',
79
+ 'git' => ENV['WXRUBY_GIT'] || 'git'
77
80
  })
81
+ CONFIG['autoinstall'] = (ENV['WXRUBY_AUTOINSTALL'] != '0') if ENV['WXRUBY_AUTOINSTALL']
78
82
  BUILD_CFG = '.wxconfig'
79
83
 
80
84
  # Ruby 2.5 is the minimum version for wxRuby3
81
85
  __rb_ver = RUBY_VERSION.split('.').collect {|v| v.to_i}
82
86
  if (__rb_major = __rb_ver.shift) < 2 || (__rb_major == 2 && __rb_ver.shift < 5)
83
- STDERR.puts 'ERROR: wxRuby3 requires Ruby >= 2.5.0!'
87
+ $stderr.puts 'ERROR: wxRuby3 requires Ruby >= 2.5.0!'
84
88
  exit(1)
85
89
  end
86
90
 
@@ -111,38 +115,186 @@ module WXRuby3
111
115
 
112
116
  module Config
113
117
 
114
- def do_run(*cmd, capture: nil)
115
- output = nil
116
- if capture
117
- env_bup = exec_env.keys.inject({}) do |h, ev|
118
- h[ev] = ENV[ev] ? ENV[ev].dup : nil
119
- h
118
+ def self.command_to_s(*cmd)
119
+ txt = if ::Hash === cmd.first
120
+ cmd = cmd.dup
121
+ env = cmd.shift
122
+ env.collect { |k, v| "#{k}=#{v}" }.join(' ') << ' '
123
+ else
124
+ ''
125
+ end
126
+ txt << cmd.join(' ')
127
+ end
128
+
129
+ def run_silent?
130
+ !!ENV['WXRUBY_RUN_SILENT']
131
+ end
132
+
133
+ def silent_log_name
134
+ ENV['WXRUBY_RUN_SILENT'] || 'silent_run.log'
135
+ end
136
+
137
+ def log_progress(msg)
138
+ run_silent? ? silent_runner.log(msg) : $stdout.puts(msg)
139
+ end
140
+
141
+ class SilentRunner < Monitor
142
+
143
+ PROGRESS_CH = '.|/-\\|/-\\|'
144
+
145
+ def initialize
146
+ super
147
+ @cout = 0
148
+ @incremental = false
149
+ end
150
+
151
+ def incremental(f=true)
152
+ synchronize do
153
+ @cout = 0
154
+ @incremental = !!f
120
155
  end
121
- case capture
122
- when :out
123
- # default
124
- when :no_err
125
- # redirect stderr to null sink
126
- cmd << '2> ' << (windows? ? 'NULL' : '/dev/null')
127
- when :err, :all
128
- cmd << '2>&1'
156
+ end
157
+
158
+ def run(*cmd, **kwargs)
159
+ synchronize do
160
+ @cout = 0 unless @incremental
129
161
  end
130
- begin
131
- # setup ENV for child execution
132
- ENV.merge!(Config.instance.exec_env)
133
- output = `#{cmd.join(' ')}`
134
- ensure
135
- # restore ENV
136
- env_bup.each_pair do |k,v|
137
- if v
138
- ENV[k] = v
139
- else
140
- ENV.delete(k)
162
+ output = nil
163
+ verbose = kwargs.delete(:verbose)
164
+ capture = kwargs.delete(:capture)
165
+ if (Config.instance.verbose? && verbose != false) || !capture
166
+ txt = Config.command_to_s(*cmd)
167
+ if Config.instance.verbose? && verbose != false
168
+ $stdout.puts txt
169
+ end
170
+ if !capture
171
+ silent_log { |f| f.puts txt }
172
+ end
173
+ end
174
+ if capture
175
+ if capture == :out || capture == :no_err
176
+ kwargs[:err] = (Config.instance.windows? ? 'NULL' : '/dev/null') if capture == :no_err
177
+ Open3.popen2(*cmd, **kwargs) do |_ins, os, tw|
178
+ output = silent_runner(os)
179
+ tw.value
180
+ end
181
+ else
182
+ Open3.popen2e(*cmd, **kwargs) do |_ins, eos, tw|
183
+ output = silent_runner(eos)
184
+ tw.value
141
185
  end
142
186
  end
187
+ output.join
188
+ else
189
+ rc = silent_log do |fout|
190
+ Open3.popen2e(*cmd, **kwargs) do |_ins, eos, tw|
191
+ silent_runner(eos, fout)
192
+ v = tw.value.exitstatus
193
+ fout.puts "-> Exit code: #{v}"
194
+ v
195
+ end
196
+ end
197
+ rc
198
+ end
199
+ end
200
+
201
+ def log(msg)
202
+ silent_log { |f| f.puts(msg) }
203
+ end
204
+
205
+ private
206
+
207
+ def silent_runner(os, output=[])
208
+ synchronize do
209
+ if @incremental
210
+ @cout += 1
211
+ $stdout.print "#{PROGRESS_CH[@cout%10]}\b"
212
+ $stdout.flush
213
+ end
214
+ end
215
+ os.each do |ln|
216
+ synchronize do
217
+ unless @incremental
218
+ @cout += 1
219
+ $stdout.print "#{PROGRESS_CH[@cout%10]}\b"
220
+ $stdout.flush
221
+ end
222
+ output << ln
223
+ end
224
+ end
225
+ output
226
+ end
227
+
228
+ def silent_log(&block)
229
+ File.open(Config.instance.silent_log_name, 'a') do |fout|
230
+ block.call(fout)
231
+ end
232
+ end
233
+
234
+ end
235
+
236
+ def silent_runner
237
+ @silent_runner ||= SilentRunner.new
238
+ end
239
+ private :silent_runner
240
+
241
+ def do_silent_run(*cmd, **kwargs)
242
+ silent_runner.run(*cmd, **kwargs)
243
+ end
244
+ private :do_silent_run
245
+
246
+ def do_silent_run_step(*cmd, **kwargs)
247
+ silent_runner.run_one(*cmd, **kwargs)
248
+ end
249
+ private :do_silent_run_step
250
+
251
+ def set_silent_run_incremental
252
+ silent_runner.incremental
253
+ end
254
+
255
+ def set_silent_run_batched
256
+ silent_runner.incremental(false)
257
+ end
258
+
259
+ def do_run(*cmd, capture: nil)
260
+ output = nil
261
+ if run_silent?
262
+ output = do_silent_run(exec_env, *cmd, capture: capture)
263
+ unless capture
264
+ fail "Command failed with status (#{rc}): #{Config.command_to_s(*cmd)}" unless output == 0
143
265
  end
144
266
  else
145
- Rake.sh(exec_env, *cmd, verbose: verbose?)
267
+ if capture
268
+ env_bup = exec_env.keys.inject({}) do |h, ev|
269
+ h[ev] = ENV[ev] ? ENV[ev].dup : nil
270
+ h
271
+ end
272
+ case capture
273
+ when :out
274
+ # default
275
+ when :no_err
276
+ # redirect stderr to null sink
277
+ cmd << '2> ' << (windows? ? 'NULL' : '/dev/null')
278
+ when :err, :all
279
+ cmd << '2>&1'
280
+ end
281
+ begin
282
+ # setup ENV for child execution
283
+ ENV.merge!(Config.instance.exec_env)
284
+ output = `#{cmd.join(' ')}`
285
+ ensure
286
+ # restore ENV
287
+ env_bup.each_pair do |k,v|
288
+ if v
289
+ ENV[k] = v
290
+ else
291
+ ENV.delete(k)
292
+ end
293
+ end
294
+ end
295
+ else
296
+ Rake.sh(exec_env, *cmd, verbose: verbose?)
297
+ end
146
298
  end
147
299
  output
148
300
  end
@@ -182,24 +334,32 @@ module WXRuby3
182
334
  def expand(cmd)
183
335
  `#{cmd}`
184
336
  end
185
- private :expand
186
337
 
187
- def sh(*cmd, **kwargs)
188
- Rake.sh(*cmd, **kwargs) { |ok,_| !!ok }
338
+ def sh(*cmd, fail_on_error: false, **kwargs)
339
+ if run_silent?
340
+ rc = do_silent_run(*cmd, **kwargs)
341
+ fail "Command failed with status (#{rc}): #{Config.command_to_s(*cmd)}" if fail_on_error && rc != 0
342
+ rc == 0
343
+ elsif fail_on_error
344
+ Rake.sh(*cmd, **kwargs)
345
+ else
346
+ Rake.sh(*cmd, **kwargs) { |ok,_| !!ok }
347
+ end
189
348
  end
190
- private :sh
191
349
  alias :bash :sh
192
- private :bash
193
350
 
194
351
  def test(*tests, **options)
195
352
  errors = 0
353
+ excludes = (ENV['WXRUBY_TEST_EXCLUDE'] || '').split(';')
196
354
  tests = Dir.glob(File.join(Config.instance.test_dir, '*.rb')) if tests.empty?
197
355
  tests.each do |test|
198
- unless File.exist?(test)
199
- test = File.join(Config.instance.test_dir, test)
200
- test = Dir.glob(test+'.rb').shift || test unless File.exist?(test)
356
+ unless excludes.include?(File.basename(test, '.*'))
357
+ unless File.exist?(test)
358
+ test = File.join(Config.instance.test_dir, test)
359
+ test = Dir.glob(test+'.rb').shift || test unless File.exist?(test)
360
+ end
361
+ Rake.sh(Config.instance.exec_env, *make_ruby_cmd(test)) { |ok,status| errors += 1 unless ok }
201
362
  end
202
- Rake.sh(Config.instance.exec_env, *make_ruby_cmd(test)) { |ok,status| errors += 1 unless ok }
203
363
  end
204
364
  fail "ERRORS: ##{errors} test scripts failed." if errors>0
205
365
  end
@@ -209,26 +369,56 @@ module WXRuby3
209
369
  Rake.sh(Config.instance.exec_env, *make_ruby_cmd('-x', irb_cmd), **options)
210
370
  end
211
371
 
212
- def check_git
213
- if expand("which git 2>/dev/null").chomp.empty?
214
- STDERR.puts 'ERROR: Need GIT installed to run wxRuby3 bootstrap!'
215
- exit(1)
216
- end
372
+ def check_wx_config
373
+ false
217
374
  end
218
375
 
219
- def check_doxygen
220
- if expand("which #{get_config('doxygen')} 2>/dev/null").chomp.empty?
221
- STDERR.puts "ERROR: Cannot find #{get_config('doxygen')}. Need Doxygen installed to run wxRuby3 bootstrap!"
376
+ def wx_config(_option)
377
+ nil
378
+ end
379
+
380
+ def check_tool_pkgs
381
+ []
382
+ end
383
+
384
+ def install_prerequisites
385
+ pkg_deps = check_tool_pkgs
386
+ if get_config('autoinstall') == false
387
+ $stderr.puts <<~__ERROR_TXT
388
+ ERROR: This system lacks installed versions of the following required software packages:
389
+ #{pkg_deps.join(', ')}
390
+
391
+ Install these packages and try again.
392
+ __ERROR_TXT
222
393
  exit(1)
223
394
  end
395
+ pkg_deps
224
396
  end
225
397
 
226
- def check_wx_config
227
- false
398
+ # only called after src gem build
399
+ def cleanup_prerequisites
400
+ # noop
228
401
  end
229
402
 
230
- def wx_config(_option)
231
- nil
403
+ def wants_autoinstall?
404
+ flag = get_config('autoinstall')
405
+ if flag.nil?
406
+ $stdout.puts <<~__Q_TEXT
407
+
408
+ [ --- ATTENTION! --- ]
409
+ wxRuby3 requires some software packages to be installed before being able to continue building.
410
+ If you like these can be automatically installed next (if you are building the source gem the
411
+ software will be removed again after building finishes).
412
+ Do you want to have the required software installed now? [yN] :
413
+ __Q_TEXT
414
+ answer = $stdin.gets(chomp: true).strip
415
+ while !answer.empty? && !%w[Y y N n].include?(answer)
416
+ $stdout.puts 'Please answer Y/y or N/n [Yn] : '
417
+ answer = $stdin.gets(chomp: true).strip
418
+ end
419
+ flag = %w[Y y].include?(answer)
420
+ end
421
+ flag
232
422
  end
233
423
 
234
424
  def get_config(key)
@@ -341,10 +531,10 @@ module WXRuby3
341
531
  def create
342
532
  load # load the build config (if any)
343
533
  klass = Class.new do
344
- include Config
345
-
346
534
  include FileUtils
347
535
 
536
+ include Config
537
+
348
538
  def initialize
349
539
  @ruby_exe = RB_CONFIG["ruby_install_name"]
350
540
 
@@ -431,8 +621,10 @@ module WXRuby3
431
621
  @ruby_includes = [ RB_CONFIG["rubyhdrdir"],
432
622
  RB_CONFIG["sitehdrdir"],
433
623
  RB_CONFIG["vendorhdrdir"],
434
- File.join(RB_CONFIG["rubyhdrdir"],
435
- RB_CONFIG['arch']) ].compact
624
+ RB_CONFIG['rubyarchhdrdir'] ?
625
+ RB_CONFIG['rubyarchhdrdir'] :
626
+ File.join(RB_CONFIG["rubyhdrdir"], RB_CONFIG['arch'])
627
+ ].compact
436
628
  @ruby_includes << File.join(@wxruby_path, 'include')
437
629
 
438
630
  @ruby_cppflags = [RB_CONFIG["CFLAGS"]].compact
@@ -482,10 +674,9 @@ module WXRuby3
482
674
 
483
675
  def report
484
676
  if @debug_build
485
- puts "Enabled DEBUG build"
486
- puts "Enabled debugging output"
677
+ log_progress("Enabled DEBUG build")
487
678
  else
488
- puts "Enabled RELEASE build"
679
+ log_progress("Enabled RELEASE build")
489
680
  end
490
681
  end
491
682
 
@@ -550,7 +741,7 @@ module WXRuby3
550
741
  end
551
742
 
552
743
  def do_bootstrap
553
- check_doxygen
744
+ install_prerequisites
554
745
  # do we have a local wxWidgets tree already?
555
746
  unless File.directory?(File.join(ext_path, 'wxWidgets', 'docs', 'doxygen'))
556
747
  wx_checkout
@@ -567,6 +758,11 @@ module WXRuby3
567
758
  respawn_rake
568
759
  end
569
760
 
761
+ def cleanup_bootstrap
762
+ rm_rf(File.join(ext_path, 'wxWidgets'), verbose: !WXRuby3.config.run_silent?) if File.directory?(File.join(ext_path, 'wxWidgets'))
763
+ cleanup_prerequisites
764
+ end
765
+
570
766
  # Testing the relevant wxWidgets setup.h file to see what
571
767
  # features are supported.
572
768
 
@@ -638,10 +834,7 @@ module WXRuby3
638
834
  private :create
639
835
 
640
836
  def instance
641
- unless @instance
642
- @instance = create
643
- end
644
- @instance
837
+ @instance ||= create
645
838
  end
646
839
 
647
840
  def get_config(key)
@@ -22,7 +22,8 @@ namespace Swig
22
22
  DirectorRubyException(VALUE error, VALUE rcvr, ID fn_id)
23
23
  : DirectorException(Qnil)
24
24
  {
25
- VALUE msg = rb_sprintf("Caught exception in SWIG director method for %s#%s", rb_class2name(CLASS_OF(rcvr)), rb_id2name(fn_id));
25
+ VALUE msg = rb_sprintf("Caught exception in SWIG director method for %s#%s : ", rb_class2name(CLASS_OF(rcvr)), rb_id2name(fn_id));
26
+ rb_str_append(msg, rb_funcall(error, rb_intern("message"), 0));
26
27
  this->swig_msg = StringValuePtr(msg);
27
28
  swig_error = rb_exc_new_str(rb_eRuntimeError, msg);
28
29
  VALUE bt = rb_funcall(error, rb_intern("backtrace"), 0);