wxruby3 0.9.5 → 0.9.8

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 (58) hide show
  1. checksums.yaml +4 -4
  2. data/INSTALL.md +440 -84
  3. data/README.md +40 -23
  4. data/ext/mkrf_conf_ext.rb +68 -0
  5. data/lib/wx/core/ext.rb +22 -3
  6. data/lib/wx/core/secret_store.rb +38 -0
  7. data/lib/wx/doc/extra/02_lifecycles.md +4 -4
  8. data/lib/wx/doc/extra/14_config.md +1 -1
  9. data/lib/wx/doc/secret_store.rb +55 -0
  10. data/lib/wx/version.rb +1 -1
  11. data/lib/wx/wxruby/base.rb +8 -8
  12. data/lib/wx/wxruby/cmd/check.rb +182 -0
  13. data/lib/wx/wxruby/cmd/sampler.rb +39 -29
  14. data/lib/wx/wxruby/cmd/setup.rb +125 -0
  15. data/lib/wx/wxruby/cmd/test.rb +56 -6
  16. data/rakelib/bin.rake +48 -0
  17. data/rakelib/bin.rb +62 -0
  18. data/rakelib/build.rb +11 -7
  19. data/rakelib/config.rake +3 -1
  20. data/rakelib/configure.rb +63 -35
  21. data/rakelib/doc.rake +3 -1
  22. data/rakelib/gem.rake +199 -0
  23. data/rakelib/gem.rb +334 -0
  24. data/rakelib/install.rb +5 -3
  25. data/rakelib/lib/config/{cygwin.rb → freebsd.rb} +1 -1
  26. data/rakelib/lib/config/linux.rb +26 -2
  27. data/rakelib/lib/config/macosx.rb +58 -11
  28. data/rakelib/lib/config/mingw.rb +134 -10
  29. data/rakelib/lib/config/pkgman/linux.rb +144 -0
  30. data/rakelib/lib/config/pkgman/macosx.rb +122 -0
  31. data/rakelib/lib/config/unixish.rb +47 -20
  32. data/rakelib/lib/config/{netbsd.rb → unknown.rb} +3 -2
  33. data/rakelib/lib/config.rb +301 -88
  34. data/rakelib/lib/core/package.rb +47 -49
  35. data/rakelib/lib/director/aui_manager.rb +1 -1
  36. data/rakelib/lib/director/dialog.rb +8 -0
  37. data/rakelib/lib/director/gdicommon.rb +1 -2
  38. data/rakelib/lib/director/grid_ctrl.rb +2 -2
  39. data/rakelib/lib/director/richtext_composite_object.rb +2 -4
  40. data/rakelib/lib/director/secret_store.rb +117 -0
  41. data/rakelib/lib/director/tree_event.rb +2 -2
  42. data/rakelib/lib/generate/doc/secret_store.yaml +55 -0
  43. data/rakelib/lib/generate/doc.rb +29 -14
  44. data/rakelib/lib/generate/interface.rb +4 -2
  45. data/rakelib/lib/specs/interfaces.rb +1 -0
  46. data/rakelib/lib/swig_runner.rb +11 -11
  47. data/rakelib/lib/typemap/common.rb +10 -0
  48. data/rakelib/prepost.rake +17 -5
  49. data/rakelib/yard/templates/default/fulldoc/html/css/wxruby3.css +18 -0
  50. data/rakelib/yard/templates/default/fulldoc/html/setup.rb +5 -5
  51. data/rakelib/yard/yard/relative_markdown_links.rb +7 -1
  52. data/samples/sampler/sample.rb +2 -0
  53. data/tests/lib/wxapp_runner.rb +1 -1
  54. data/tests/test_config.rb +7 -4
  55. data/tests/test_secret_store.rb +83 -0
  56. metadata +46 -23
  57. data/ext/mkrf_conf_srcgem.rb +0 -67
  58. data/rakelib/run.rake +0 -52
@@ -7,6 +7,9 @@
7
7
  ###
8
8
 
9
9
  require_relative './unixish'
10
+ require_relative 'pkgman/macosx'
11
+
12
+ require 'pathname'
10
13
 
11
14
  module WXRuby3
12
15
 
@@ -32,12 +35,7 @@ module WXRuby3
32
35
  def get_rpath_origin
33
36
  "@loader_path"
34
37
  end
35
-
36
- def check_rpath_patch
37
- # no need to check anything; install_name_tool is part of XCode cmdline tools
38
- # and without these we couldn't build anything
39
- true
40
- end
38
+ protected :get_rpath_origin
41
39
 
42
40
  def patch_rpath(shlib, *rpath)
43
41
  # don't leave old rpath-s behind
@@ -46,13 +44,59 @@ module WXRuby3
46
44
  sh("install_name_tool #{rpath.collect {|rp| "-add_rpath '#{rp}'"}.join(' ')} #{shlib} 2>/dev/null", verbose: false) { |_,_| }
47
45
  true
48
46
  end
49
-
50
- def update_shlib_loadpaths(shlib, deplibs)
51
- changes = deplibs.collect { |dl| "-change '#{dl}' '@rpath/#{File.basename(dl)}'"}
52
- sh("install_name_tool #{changes.join(' ')} #{shlib} 2>/dev/null", verbose: false) { |_,_| }
47
+ protected :patch_rpath
48
+
49
+ # add Ruby library path for wxruby shared libraries
50
+ def update_shlib_ruby_libpath(shlib)
51
+ # fix lookup for the Ruby shared library
52
+ # on MacOSX the Ruby library will be linked with it's full path from the **development** environment
53
+ # which is no use after binary deployment so we change that to be relative to the executable's path
54
+ # loading the shared libs (which is always going to be the Ruby exe)
55
+
56
+ # get the development folder holding ruby lib
57
+ ruby_libdir = Pathname.new(RB_CONFIG['libdir'])
58
+ # determine the relative path to the lib directory from the executable dir
59
+ # (this remains constant for any similar deployed Ruby for this platform)
60
+ rel_ruby_libdir = ruby_libdir.relative_path_from(RB_CONFIG['bindir'])
61
+ # get the Ruby library name used for linking
62
+ ld_ruby_lib = (RB_CONFIG['LIBRUBYARG_SHARED'].split.find { |s| s =~ /^-lruby/ }).sub(/^-l/,'')
63
+ # match the full shared library name that will be linked
64
+ ruby_so = [RB_CONFIG['LIBRUBY_SO'], RB_CONFIG['LIBRUBY_SONAME'], *RB_CONFIG['LIBRUBY_ALIASES'].split].find do |soname|
65
+ soname =~ /^lib#{ld_ruby_lib}\./
66
+ end
67
+ # form the full path of the shared Ruby library linked
68
+ ruby_lib = File.join(ruby_libdir.to_s, RB_CONFIG['LIBRUBY_SO'])
69
+ # change the full path to a path relative to the Ruby executable
70
+ sh("install_name_tool -change #{ruby_lib} '@executable_path/#{rel_ruby_libdir.to_s}/#{ruby_so}' #{shlib}")
53
71
  true
54
72
  end
55
73
 
74
+ # add deployment lookup paths for wxwidgets shared libraries
75
+ def update_shlib_wxwin_libpaths(shlib, deplibs)
76
+ if super
77
+ changes = deplibs.collect { |dl| "-change '#{dl}' '@rpath/#{File.basename(dl)}'"}
78
+ sh("install_name_tool #{changes.join(' ')} #{shlib} 2>/dev/null", verbose: false) { |_,_| }
79
+ true
80
+ else
81
+ false
82
+ end
83
+ end
84
+
85
+ def check_tool_pkgs
86
+ pkg_deps = super
87
+ # need g++ to build wxRuby3 extensions in any case
88
+ pkg_deps << 'gcc' unless system('command -v g++>/dev/null')
89
+ # need this to build anything (like wxRuby3 extensions itself)
90
+ pkg_deps << 'xcode' unless system('command -v install_name_tool>/dev/null')
91
+ pkg_deps
92
+ end
93
+
94
+ def install_prerequisites
95
+ pkg_deps = check_tool_pkgs
96
+ PkgManager.install(pkg_deps)
97
+ []
98
+ end
99
+
56
100
  def get_wx_libs
57
101
  wx_libset = ::Set.new
58
102
  lib_list = wx_config("--libs all").split(' ')
@@ -88,7 +132,10 @@ module WXRuby3
88
132
  private
89
133
 
90
134
  def wx_configure
91
- bash('./configure --disable-optimise --disable-sys-libs --without-liblzma --prefix=`pwd`/install --disable-tests --without-subdirs --disable-debug_info CFLAGS="-Wno-unused-but-set-variable"')
135
+ bash("./configure --with-macosx-version-min=#{WXRuby3.config.sysinfo.os.release}.0 " +
136
+ "--disable-optimise --disable-sys-libs --without-liblzma --without-regex " +
137
+ "--prefix=`pwd`/install --disable-tests --without-subdirs --disable-debug_info " +
138
+ "CFLAGS=\"-Wno-unused-but-set-variable\"")
92
139
  end
93
140
 
94
141
  def wx_make
@@ -8,6 +8,9 @@
8
8
 
9
9
  require_relative './unixish'
10
10
 
11
+ require 'uri'
12
+
13
+
11
14
  if ENV['RI_DEVKIT'].nil?
12
15
  begin
13
16
  require 'devkit'
@@ -23,6 +26,13 @@ module WXRuby3
23
26
 
24
27
  module Platform
25
28
 
29
+ SWIG_URL = 'https://sourceforge.net/projects/swig/files/swigwin/swigwin-4.2.0/swigwin-4.2.0.zip/download'
30
+ SWIG_ZIP = 'swigwin-4.2.0.zip'
31
+
32
+ DOXYGEN_URL = 'https://www.doxygen.nl/files/doxygen-1.10.0.windows.x64.bin.zip'
33
+
34
+ GIT_URL = 'https://github.com/git-for-windows/git/releases/download/v2.43.0.windows.1/MinGit-2.43.0-64-bit.zip'
35
+
26
36
  def self.included(base)
27
37
  base.class_eval do
28
38
  include Config::UnixLike
@@ -65,20 +75,79 @@ module WXRuby3
65
75
  ftmp.unlink # cleanup
66
76
  end
67
77
 
68
- private
69
-
70
- def wx_make
71
- bash('make && make install')
78
+ def check_tool_pkgs
79
+ pkg_deps = []
80
+ pkg_deps << 'doxygen' if expand("which #{get_cfg_string('doxygen')} 2>/dev/null").strip.empty?
81
+ pkg_deps << 'swig' if expand("which #{get_cfg_string('swig')} 2>/dev/null").strip.empty?
82
+ pkg_deps << 'git' if expand("which #{get_cfg_string('git')} 2>/dev/null").strip.empty?
83
+ pkg_deps
72
84
  end
73
85
 
74
- def wx_generate_xml
75
- chdir(File.join(ext_path, 'wxWidgets', 'docs', 'doxygen')) do
76
- sh({ 'WX_SKIP_DOXYGEN_VERSION_CHECK' => '1' }, 'regen.bat xml')
86
+ def install_prerequisites
87
+ pkg_deps = super
88
+ unless pkg_deps.empty?
89
+ # autoinstall or not?
90
+ unless wants_autoinstall?
91
+ STDERR.puts <<~__ERROR_TXT
92
+ ERROR: This system lacks installed versions of the following required software packages:
93
+ #{pkg_deps.join(', ')}
94
+
95
+ Install these packages and try again.
96
+ __ERROR_TXT
97
+ exit(1)
98
+ end
99
+ # if SWIG was not found in the PATH
100
+ if pkg_deps.include?('swig')
101
+ $stdout.print 'Installing SWIG...' if run_silent?
102
+ # download and install SWIG
103
+ fname = download_and_install(SWIG_URL, SWIG_ZIP, 'swig.exe')
104
+ $stdout.puts 'done!' if run_silent?
105
+ Config.instance.log_progress("Installed #{fname}")
106
+ set_config('swig', fname)
107
+ Config.save
108
+ end
109
+ # if doxygen was not found in the PATH
110
+ if pkg_deps.include?('doxygen')
111
+ $stdout.print 'Installing Doxygen...' if run_silent?
112
+ # download and install doxygen
113
+ fname = download_and_install(DOXYGEN_URL, File.basename(URI(DOXYGEN_URL).path), 'doxygen.exe', 'doxygen')
114
+ $stdout.puts 'done!' if run_silent?
115
+ Config.instance.log_progress("Installed #{fname}")
116
+ set_config('doxygen', fname)
117
+ Config.save
118
+ end
119
+ # if git was not found in the PATH
120
+ if pkg_deps.include?('git')
121
+ $stdout.print 'Installing Git...' if run_silent?
122
+ # download and install doxygen
123
+ fname = download_and_install(GIT_URL, File.basename(URI(GIT_URL).path), 'git.exe', 'git')
124
+ $stdout.puts 'done!' if run_silent?
125
+ Config.instance.log_progress("Installed #{fname}")
126
+ set_config('git', fname)
127
+ Config.save
128
+ end
77
129
  end
130
+ []
78
131
  end
79
132
 
80
- def respawn_rake(argv = ARGV)
81
- Kernel.exec('rake', *argv)
133
+ # only called after src gem build
134
+ def cleanup_prerequisites
135
+ tmp_tool_root = File.join(ENV['HOME'].gsub("\\", '/'), '.wxruby3')
136
+ path = get_cfg_string('swig')
137
+ unless path.empty? || !path.start_with?(tmp_tool_root)
138
+ path = File.dirname(path) while File.dirname(path) != tmp_tool_root
139
+ rm_rf(path)
140
+ end
141
+ path = get_cfg_string('doxygen')
142
+ unless path.empty? || !path.start_with?(tmp_tool_root)
143
+ path = File.dirname(path) while File.dirname(path) != tmp_tool_root
144
+ rm_rf(path)
145
+ end
146
+ path = get_cfg_string('git')
147
+ unless path.empty? || !path.start_with?(tmp_tool_root)
148
+ path = File.dirname(path) while File.dirname(path) != tmp_tool_root
149
+ rm_rf(path)
150
+ end
82
151
  end
83
152
 
84
153
  def expand(cmd)
@@ -93,6 +162,61 @@ module WXRuby3
93
162
  super(*cmd, **kwargs)
94
163
  end
95
164
 
165
+ private
166
+
167
+ def download_and_install(url, zip, exe, unpack_to=nil)
168
+ # make sure the download destination exists
169
+ tmp_tool_root = File.join(ENV['HOME'].gsub("\\", '/'), '.wxruby3')
170
+ dest = unpack_to ? File.join(tmp_tool_root, unpack_to) : File.join(tmp_tool_root, File.basename(zip, '.*'))
171
+ mkdir(tmp_tool_root) unless File.directory?(tmp_tool_root)
172
+ # download
173
+ chdir(tmp_tool_root) do
174
+ unless download_file(url, zip)
175
+ STDERR.puts "ERROR: Failed to download installation package for #{exe}"
176
+ exit(1)
177
+ end
178
+ # unpack
179
+ unless sh("powershell Expand-Archive -LiteralPath '#{zip}' -DestinationPath #{dest} -Force")
180
+ STDERR.puts "ERROR: Failed to unpack installation package for #{exe}"
181
+ exit(1)
182
+ end
183
+ # cleanup
184
+ rm_f(zip)
185
+ end
186
+ # find executable
187
+ find_exe(dest, exe)
188
+ end
189
+
190
+ def find_exe(path, exe)
191
+ fp = Dir.glob(File.join(path, '*')).find { |p| File.file?(p) && File.basename(p) == exe }
192
+ unless fp
193
+ Dir.glob(File.join(path, '*')).each do |p|
194
+ fp = find_exe(p, exe) if File.directory?(p)
195
+ return fp if fp
196
+ end
197
+ end
198
+ fp
199
+ end
200
+
201
+ def wx_make
202
+ bash('make && make install')
203
+ end
204
+
205
+ def wx_generate_xml
206
+ doxygen = get_cfg_string("doxygen")
207
+ doxygen = nix_path(doxygen) unless doxygen == 'doxygen'
208
+ chdir(File.join(ext_path, 'wxWidgets', 'docs', 'doxygen')) do
209
+ unless bash({ 'DOXYGEN' => doxygen, 'WX_SKIP_DOXYGEN_VERSION_CHECK' => '1' }, './regen.sh', 'xml')
210
+ $stderr.puts 'ERROR: Failed to generate wxWidgets XML API specifications for parsing by wxRuby3.'
211
+ exit(1)
212
+ end
213
+ end
214
+ end
215
+
216
+ def respawn_rake(argv = ARGV)
217
+ Kernel.exec('rake', *argv)
218
+ end
219
+
96
220
  def nix_path(winpath)
97
221
  (winpath.nil? || winpath.empty?) ? '' : `cygpath -a -u #{winpath}`.strip
98
222
  end
@@ -118,7 +242,7 @@ module WXRuby3
118
242
  @wx_cppflags.each { |flags| flags.gsub!(/-I(\S+)/) { |s| "-I#{win_path($1)}" } }
119
243
  @wx_libs.each { |libflag| libflag.gsub!(/-L(\S+)/) { |s| "-L#{win_path($1)}" } }
120
244
 
121
- @extra_cflags.concat %w[-Wno-unused-function -Wno-conversion-null -Wno-maybe-uninitialized]
245
+ @extra_cflags.concat %w[-Wno-unused-function -Wno-conversion-null -Wno-maybe-uninitialized -Wno-deprecated-copy]
122
246
  @extra_cflags << ' -Wno-deprecated-declarations' unless @no_deprecated
123
247
 
124
248
  # create a .dll binary
@@ -0,0 +1,144 @@
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 base
7
+ ###
8
+
9
+ module WXRuby3
10
+
11
+ module Config
12
+
13
+ module Platform
14
+
15
+ module PkgManager
16
+
17
+ PLATFORM_DEPS = {
18
+ debian: %w[libgtk-3-dev libwebkit2gtk-4.0-dev libgspell-1-dev libunwind-dev libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev libcurl4-openssl-dev libsecret-1-dev libnotify-dev],
19
+ rhel: %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],
20
+ suse: %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],
21
+ arch: %w[pkg-config gtk3 webkit2gtk gspell libunwind gstreamer curl libsecret libnotify libpng12]
22
+ }
23
+ PLATFORM_ALTS = {
24
+ suse: { 'g++' => 'gcc-c++' },
25
+ rhel: { 'git' => 'git-core' },
26
+ arch: { 'g++' => 'gcc' }
27
+ }
28
+ MIN_GENERIC_PKGS = %w[gtk3-devel patchelf g++ make git webkit2gtk3-devel gspell-devel gstreamer-devel gstreamer-plugins-base-devel libcurl-devel libsecret-devel libnotify-devel libSDL-devel zlib-devel]
29
+
30
+ class << self
31
+
32
+ def install(pkgs)
33
+ # do we need to install anything?
34
+ if !pkgs.empty? || builds_wxwidgets?
35
+ # check linux distro compatibility
36
+ unless no_autoinstall? || pkgman
37
+ # do we need to build wxWidgets?
38
+ pkgs.concat(MIN_GENERIC_PKGS) if builds_wxwidgets?
39
+ $stderr.puts <<~__ERROR_TXT
40
+ ERROR: Do not know how to install required packages for distro type '#{WXRuby3.config.sysinfo.os.variant}'.
41
+
42
+ Make sure the following packages (or equivalent) are installed and than try again with `--no-autoinstall`:
43
+ #{pkgs.join(', ')}
44
+ __ERROR_TXT
45
+ exit(1)
46
+ end
47
+ # can we install?
48
+ unless no_autoinstall? || has_sudo? || is_root?
49
+ $stderr.puts 'ERROR: Cannot check for or install required packages. Please install sudo and try again.'
50
+ exit(1)
51
+ end
52
+ # do we need to build wxWidgets?
53
+ if builds_wxwidgets?
54
+ # add platform specific packages for wxWidgets
55
+ add_platform_pkgs(pkgs)
56
+ end
57
+ # do we actually have any packages to install?
58
+ unless pkgs.empty?
59
+ # autoinstall or not?
60
+ unless wants_autoinstall?
61
+ $stderr.puts <<~__ERROR_TXT
62
+ ERROR: This system may lack installed versions of the following required software packages:
63
+ #{pkgs.join(', ')}
64
+
65
+ Install these packages and try again.
66
+ __ERROR_TXT
67
+ exit(1)
68
+ end
69
+ # do the actual install
70
+ unless run(pkgman.make_install_command(*pkgs))
71
+ $stderr.puts <<~__ERROR_TXT
72
+ ERROR: Failed to install all or some of the following required software packages:
73
+ #{pkgs.join(', ')}
74
+
75
+ Fix any problems or install these packages yourself and try again.
76
+ __ERROR_TXT
77
+ if WXRuby3.config.run_silent?
78
+ $stderr.puts "For error details check #{WXRuby3.config.silent_log_name}"
79
+ end
80
+ exit(1)
81
+ end
82
+ end
83
+ end
84
+ end
85
+
86
+ private
87
+
88
+ def pkgman
89
+ @pkgman ||= WXRuby3.config.sysinfo.os.pkgman
90
+ end
91
+
92
+ def platform_pkgs
93
+ PLATFORM_DEPS[WXRuby3.config.sysinfo.os.variant.to_sym] || []
94
+ end
95
+
96
+ def add_platform_pkgs(pkgs)
97
+ # transform any platform specific package alternatives
98
+ (PLATFORM_ALTS[WXRuby3.config.sysinfo.os.variant.to_sym] || {}).each_pair do |org, alt|
99
+ pkgs << alt if pkgs.delete(org)
100
+ end
101
+ # add any other platform specific package dependencies
102
+ pkgs.concat(pkgman.select_uninstalled(platform_pkgs))
103
+ end
104
+
105
+ def builds_wxwidgets?
106
+ Config.get_config('with-wxwin') && Config.get_cfg_string('wxwin').empty?
107
+ end
108
+
109
+ def no_autoinstall?
110
+ Config.get_config('autoinstall') == false
111
+ end
112
+
113
+ def wants_autoinstall?
114
+ WXRuby3.config.wants_autoinstall?
115
+ end
116
+
117
+ def has_sudo?
118
+ system('command -v sudo > /dev/null')
119
+ end
120
+
121
+ def is_root?
122
+ `id -u 2>/dev/null`.chomp == '0'
123
+ end
124
+
125
+ def run(cmd)
126
+ $stdout.print "Running #{cmd}..."
127
+ rc = WXRuby3.config.sh(cmd)
128
+ $stderr.puts(rc ? 'done!' : 'FAILED!')
129
+ rc
130
+ end
131
+
132
+ def expand(cmd)
133
+ `#{is_root? ? '' : 'sudo '}#{cmd}`
134
+ end
135
+
136
+ end
137
+
138
+ end
139
+
140
+ end
141
+
142
+ end
143
+
144
+ end
@@ -0,0 +1,122 @@
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 MacOSX pkg manager
7
+ ###
8
+
9
+ module WXRuby3
10
+
11
+ module Config
12
+
13
+ module Platform
14
+
15
+ module PkgManager
16
+
17
+ class << self
18
+
19
+ def install(pkgs)
20
+ # do we need to install anything?
21
+ unless pkgs.empty?
22
+ # can we install XCode commandline tools?
23
+ unless no_autoinstall? || !pkgs.include?('xcode') || has_sudo? || is_root?
24
+ STDERR.puts 'ERROR: Cannot check for or install required packages. Please install sudo or run as root and try again.'
25
+ exit(1)
26
+ end
27
+
28
+ # autoinstall or not?
29
+ unless pkgs.empty? || wants_autoinstall?
30
+ $stderr.puts <<~__ERROR_TXT
31
+ ERROR: This system may lack installed versions of the following required software packages:
32
+ #{pkgs.join(', ')}
33
+
34
+ Install these packages and try again.
35
+ __ERROR_TXT
36
+ exit(1)
37
+ end
38
+ # do the actual install (or nothing)
39
+ unless do_install(pkgs)
40
+ $stderr.puts <<~__ERROR_TXT
41
+ ERROR: Failed to install all or some of the following required software packages:
42
+ #{pkgs.join(', ')}
43
+
44
+ Fix any problems or install these packages yourself and try again.
45
+ __ERROR_TXT
46
+ exit(1)
47
+ end
48
+ end
49
+ end
50
+
51
+ private
52
+
53
+ def pkgman
54
+ @pkgman ||= WXRuby3.config.sysinfo.os.pkgman
55
+ end
56
+
57
+ def do_install(pkgs)
58
+ rc = true
59
+ # first see if we need to install XCode commandline tools
60
+ if pkgs.include?('xcode')
61
+ pkgs.delete('xcode')
62
+ rc = auth_run('xcode-select --install')
63
+ end
64
+ # now check if we need any other packages
65
+ if rc && !pkgs.empty?
66
+ if pkgman.macports?
67
+
68
+ # this is really crap; with MacPorts we need to install swig-ruby instead of simply swig
69
+ # which for whatever nonsensical reason will pull in another (older) Ruby version (probably 2.3 or such)
70
+ # although SWIG's Ruby support is version agnostic and has no binary bindings
71
+ if pkgs.include?('swig')
72
+ pkgs.delete('swig')
73
+ pkgs << 'swig-ruby'
74
+ end
75
+
76
+ end
77
+
78
+ # actually install packages
79
+ pkgs.each { |pkg| rc &&= run(pkgman.make_install_command(pkg)); break unless rc }
80
+ end
81
+ rc
82
+ end
83
+
84
+ def no_autoinstall?
85
+ Config.get_config('autoinstall') == false
86
+ end
87
+
88
+ def wants_autoinstall?
89
+ WXRuby3.config.wants_autoinstall?
90
+ end
91
+
92
+ def has_sudo?
93
+ WXRuby3.config.sysinfo.os.has_sudo?
94
+ end
95
+
96
+ def is_root?
97
+ WXRuby3.config.sysinfo.os.is_root?
98
+ end
99
+
100
+ def auth_run(cmd)
101
+ $stdout.print "Running #{cmd}..."
102
+ rc = WXRuby3.config.sh("#{is_root? ? '' : 'sudo '}#{cmd}")
103
+ $stderr.puts(rc ? 'done!' : 'FAILED!')
104
+ rc
105
+ end
106
+
107
+ def run(*cmd, title: nil)
108
+ $stdout.print(title ? title : "Running #{cmd}...")
109
+ rc = WXRuby3.config.sh(*cmd)
110
+ $stderr.puts(rc ? 'done!' : 'FAILED!')
111
+ rc
112
+ end
113
+
114
+ end
115
+
116
+ end
117
+
118
+ end
119
+
120
+ end
121
+
122
+ end
@@ -52,39 +52,66 @@ 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
69
+ protected :get_rpath_origin
70
+
71
+ # add deployment lookup paths for wxruby shared libraries
72
+ def update_shlib_loadpaths(shlib)
73
+ WXRuby3.config.patch_rpath(shlib, WXRuby3.config.get_rpath_origin, "#{WXRuby3.config.get_rpath_origin}/../ext")
74
+ end
75
+
76
+ def expand(cmd)
77
+ STDERR.puts "> sh: #{cmd}" if verbose?
78
+ s = super
79
+ STDERR.puts "< #{s}" if verbose?
80
+ s
81
+ end
82
+
83
+ def download_file(url, dest)
84
+ sh("curl -L #{url} --output #{dest}")
85
+ end
61
86
 
62
87
  private
63
88
 
64
89
  def wx_checkout
65
- check_git
90
+ $stdout.print 'Checking out wxWidgets...' if run_silent?
66
91
  # clone wxWidgets GIT repository under ext_path
67
92
  chdir(ext_path) do
68
- if (rc = sh("git clone https://github.com/wxWidgets/wxWidgets.git"))
93
+ if (rc = sh("#{get_cfg_string('git')} clone https://github.com/wxWidgets/wxWidgets.git"))
69
94
  chdir('wxWidgets') do
70
95
  tag = if @wx_version
71
96
  "v#{@wx_version}"
72
97
  else
73
- expand('git tag').split("\n").select { |t| (/\Av3\.(\d+)/ =~ t) && $1.to_i >= 2 }.max
98
+ expand("#{get_cfg_string('git')} tag").split("\n").select { |t| (/\Av3\.(\d+)/ =~ t) && $1.to_i >= 2 }.max
74
99
  end
75
100
  # checkout the version we are building against
76
- rc = sh("git checkout #{tag}")
101
+ rc = sh("#{get_cfg_string('git')} checkout #{tag}")
77
102
  end
78
103
  end
79
- unless rc
80
- STDERR.puts "ERROR: Failed to checkout wxWidgets."
104
+ if rc
105
+ $stdout.puts 'done!' if run_silent?
106
+ else
107
+ $stderr.puts "ERROR: Failed to checkout wxWidgets."
81
108
  exit(1)
82
109
  end
83
110
  end
84
111
  end
85
112
 
86
113
  def wx_configure
87
- bash('./configure --prefix=`pwd`/install --disable-tests --without-subdirs --disable-debug_info')
114
+ bash('./configure --prefix=`pwd`/install --disable-tests --without-subdirs --without-regex --disable-debug_info')
88
115
  end
89
116
 
90
117
  def wx_make
@@ -92,36 +119,36 @@ module WXRuby3
92
119
  end
93
120
 
94
121
  def wx_build
122
+ $stdout.print 'Configuring wxWidgets...' if run_silent?
95
123
  # initialize submodules
96
- unless sh('git submodule update --init')
97
- STDERR.puts "ERROR: Failed to update wxWidgets submodules."
124
+ unless sh("#{get_cfg_string('git')} submodule update --init")
125
+ $stderr.puts "ERROR: Failed to update wxWidgets submodules."
98
126
  exit(1)
99
127
  end
100
128
  # configure wxWidgets
101
129
  unless wx_configure
102
- STDERR.puts "ERROR: Failed to configure wxWidgets."
130
+ $stderr.puts "ERROR: Failed to configure wxWidgets."
103
131
  exit(1)
104
132
  end
133
+ $stdout.puts 'done!' if run_silent?
134
+ $stdout.print 'Building wxWidgets...' if run_silent?
105
135
  # make and install wxWidgets
106
136
  unless wx_make
107
- STDERR.puts "ERROR: Failed to build wxWidgets libraries."
137
+ $stderr.puts "ERROR: Failed to build wxWidgets libraries."
108
138
  exit(1)
109
139
  end
140
+ $stdout.puts 'done!' if run_silent?
110
141
  end
111
142
 
112
143
  def wx_generate_xml
113
144
  chdir(File.join(ext_path, 'wxWidgets', 'docs', 'doxygen')) do
114
- sh({ 'WX_SKIP_DOXYGEN_VERSION_CHECK' => '1' }, './regen.sh xml')
145
+ unless sh({ 'DOXYGEN' => get_cfg_string("doxygen"), 'WX_SKIP_DOXYGEN_VERSION_CHECK' => '1' }, './regen.sh xml')
146
+ $stderr.puts 'ERROR: Failed to generate wxWidgets XML API specifications for parsing by wxRuby3.'
147
+ exit(1)
148
+ end
115
149
  end
116
150
  end
117
151
 
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
152
  # Allow specification of custom wxWidgets build (mostly useful for
126
153
  # static wxRuby3 builds)
127
154
  def get_wx_path
@@ -3,7 +3,8 @@
3
3
  # This software is released under the MIT license.
4
4
 
5
5
  ###
6
- # wxRuby3 buildtools configuration
6
+ # wxRuby3 buildtools configuration fallback
7
7
  ###
8
8
 
9
- raise "NETBSD platform is unsupported as yet."
9
+ $stderr.puts 'ERROR: Unsupported Ruby platform!'
10
+ exit(1)