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.
- checksums.yaml +4 -4
- data/INSTALL.md +440 -84
- data/README.md +40 -23
- data/ext/mkrf_conf_ext.rb +68 -0
- data/lib/wx/core/ext.rb +22 -3
- data/lib/wx/core/secret_store.rb +38 -0
- data/lib/wx/doc/extra/02_lifecycles.md +4 -4
- data/lib/wx/doc/extra/14_config.md +1 -1
- data/lib/wx/doc/secret_store.rb +55 -0
- data/lib/wx/version.rb +1 -1
- data/lib/wx/wxruby/base.rb +8 -8
- data/lib/wx/wxruby/cmd/check.rb +182 -0
- data/lib/wx/wxruby/cmd/sampler.rb +39 -29
- data/lib/wx/wxruby/cmd/setup.rb +125 -0
- data/lib/wx/wxruby/cmd/test.rb +56 -6
- data/rakelib/bin.rake +48 -0
- data/rakelib/bin.rb +62 -0
- data/rakelib/build.rb +11 -7
- data/rakelib/config.rake +3 -1
- data/rakelib/configure.rb +63 -35
- data/rakelib/doc.rake +3 -1
- data/rakelib/gem.rake +199 -0
- data/rakelib/gem.rb +334 -0
- data/rakelib/install.rb +5 -3
- data/rakelib/lib/config/{cygwin.rb → freebsd.rb} +1 -1
- data/rakelib/lib/config/linux.rb +26 -2
- data/rakelib/lib/config/macosx.rb +58 -11
- data/rakelib/lib/config/mingw.rb +134 -10
- data/rakelib/lib/config/pkgman/linux.rb +144 -0
- data/rakelib/lib/config/pkgman/macosx.rb +122 -0
- data/rakelib/lib/config/unixish.rb +47 -20
- data/rakelib/lib/config/{netbsd.rb → unknown.rb} +3 -2
- data/rakelib/lib/config.rb +301 -88
- data/rakelib/lib/core/package.rb +47 -49
- data/rakelib/lib/director/aui_manager.rb +1 -1
- data/rakelib/lib/director/dialog.rb +8 -0
- data/rakelib/lib/director/gdicommon.rb +1 -2
- data/rakelib/lib/director/grid_ctrl.rb +2 -2
- data/rakelib/lib/director/richtext_composite_object.rb +2 -4
- data/rakelib/lib/director/secret_store.rb +117 -0
- data/rakelib/lib/director/tree_event.rb +2 -2
- data/rakelib/lib/generate/doc/secret_store.yaml +55 -0
- data/rakelib/lib/generate/doc.rb +29 -14
- data/rakelib/lib/generate/interface.rb +4 -2
- data/rakelib/lib/specs/interfaces.rb +1 -0
- data/rakelib/lib/swig_runner.rb +11 -11
- data/rakelib/lib/typemap/common.rb +10 -0
- data/rakelib/prepost.rake +17 -5
- data/rakelib/yard/templates/default/fulldoc/html/css/wxruby3.css +18 -0
- data/rakelib/yard/templates/default/fulldoc/html/setup.rb +5 -5
- data/rakelib/yard/yard/relative_markdown_links.rb +7 -1
- data/samples/sampler/sample.rb +2 -0
- data/tests/lib/wxapp_runner.rb +1 -1
- data/tests/test_config.rb +7 -4
- data/tests/test_secret_store.rb +83 -0
- metadata +46 -23
- data/ext/mkrf_conf_srcgem.rb +0 -67
- data/rakelib/run.rake +0 -52
data/README.md
CHANGED
@@ -96,11 +96,11 @@ of these products.
|
|
96
96
|
|
97
97
|
Currently the following are fully supported:
|
98
98
|
|
99
|
-
| Platform
|
100
|
-
|
101
|
-
| Windows 10 (tested)<br>(most likely also Windows 11)
|
102
|
-
| Linux (tested;
|
103
|
-
| MacOS >= 10.10 using Cocoa (tested on
|
99
|
+
| Platform | Ruby version(s) | wxWidgets version(s) |
|
100
|
+
|------------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------|----------------------|
|
101
|
+
| Windows 10 (tested)<br>(most likely also Windows 11) | Ruby >= 2.5<br>(RubyInstaller MSYS2-DevKit) | wxWidgets >= 3.2 |
|
102
|
+
| Linux (tested; all major AMD64 and ARM64 distributions: Ubuntu, Debian, Fedora, OpenSuSE and ArchLinux)<br>(most likely also i686) | Ruby >= 2.5 | wxWidgets >= 3.2 |
|
103
|
+
| MacOS >= 10.10 using Cocoa (tested on AMD64 and ARM64 M1/M2 Chip) | Ruby >= 2.5 (MacPorts, Homebrew, ruby-install, RVM) | wxWidgets >= 3.2 |
|
104
104
|
|
105
105
|
Support for other platforms is not being actively developed at present,
|
106
106
|
but patches are welcome. It is likely to be much simpler to get wxRuby
|
@@ -109,32 +109,49 @@ on legacy systems (eg Windows 98, Mac OS 9).
|
|
109
109
|
|
110
110
|
### How can I install wxRuby3?
|
111
111
|
|
112
|
-
wxRuby3 is distributed as a Ruby gem on [RubyGems](https://rubygems.org)
|
113
|
-
|
114
|
-
latest stable Ruby version at the time of publishing) which includes an embedded wxWidgets installation (also latest
|
115
|
-
stable version).
|
112
|
+
wxRuby3 is distributed as a Ruby gem on [RubyGems](https://rubygems.org). This gem can also be downloaded from the release
|
113
|
+
assets on [Github](https://github.com/mcorino/wxRuby3/releases).
|
116
114
|
|
117
|
-
|
118
|
-
version of the Ruby interpreter.<br>
|
119
|
-
To install the source-only gem the following software is required:
|
115
|
+
The wxRuby3 gem provides a **worry-free** installation procedure for all supported platforms.
|
120
116
|
|
121
|
-
|
122
|
-
|
123
|
-
| Ruby | A supported version of the Ruby interpreter needs to be installed. |
|
124
|
-
| C++ compiler<br>(incl. dev tools like `make`) | On linux a recent version of the GNU C++ compiler (with c++-14 support) needs to be installed<br>On Windows the RubyInstaller MSYS2-Devkit needs to be installed<br>On MacOS XCode with commandline tools needs to be installed |
|
125
|
-
| Git version control toolkit | |
|
126
|
-
| SWIG >= 3.0.12 | On MacOS install with Homebrew |
|
127
|
-
| Doxygen (>= 1.9.1) | On MacOS install with Homebrew |
|
128
|
-
| wxWidgets >= 3.2 (*OPTIONAL*) | On Linux most distributions provide system installable (development) packages for wxWidgets providing a supported version.<br>Alternatively you can fairly easily install your own preferred version manually. |
|
117
|
+
Installing the gem requires no additional installation steps and/or additional software to be installed except for a
|
118
|
+
supported version of the Ruby interpreter. So the following command is all it takes to install:
|
129
119
|
|
130
|
-
|
120
|
+
```shell
|
121
|
+
gem install wxruby3
|
122
|
+
```
|
131
123
|
|
132
|
-
|
124
|
+
The wxRuby3 installation procedure will check the availability of a, prebuilt, binary package matching the platform
|
125
|
+
being installed on and if found will download and install that package resulting in a ready-to-run wxRuby3 installation.<br>
|
126
|
+
If no matching package is found the installation reverts to a source installation which will require an additional setup
|
127
|
+
step to finalize the wxRuby3 installation by executing the following command:
|
133
128
|
|
134
129
|
```shell
|
135
|
-
|
130
|
+
wxruby setup
|
136
131
|
```
|
137
132
|
|
133
|
+
This last command is a fully automated setup procedure provided by the wxRuby3 **CLI** installed with the gem. This
|
134
|
+
procedure (by default) will analyze your system and install (after asking your consent) any missing software
|
135
|
+
requirements and build the wxRuby3 extension libraries (including a embedded copy of wxWidgets if necessary). It may
|
136
|
+
take quite a while depending on your system but you can mostly sit back and relax.
|
137
|
+
|
138
|
+
> **NOTE**<br>
|
139
|
+
> A source based installation requires the availability of the Ruby development headers. User installed Rubies in most cases
|
140
|
+
> will already include those but (especially on Linux) system installed Rubies may require having an additional '-dev/-devel'
|
141
|
+
> package installed (although actually you may already have needed those to install the gems that the wxRuby3 gem depends
|
142
|
+
> on like the nokogiri gem).
|
143
|
+
|
144
|
+
The wxRuby3 CLI also provides a 'check' command with which the runtime status of the wxRuby3 installation can be checked
|
145
|
+
at any time. By default running `wxruby check` will display a message reporting the runtime and suggestions on finalizing
|
146
|
+
the installation if not finalized yet. No message is displayed if wxRuby3 is ready to run. Run `wxruby check -h` for
|
147
|
+
details concerning this command.
|
148
|
+
|
149
|
+
A selection of (prebuilt) binary packages is provided as release assets on [Github](https://github.com/mcorino/wxRuby3/releases).
|
150
|
+
See the [INSTALL](INSTALL.md#binary-packages) document for more details.
|
151
|
+
|
152
|
+
This install procedure can of course be tweaked and customized with commandline arguments.
|
153
|
+
See the [INSTALL](INSTALL.md) document for more details.
|
154
|
+
|
138
155
|
### Where can I ask a question, or report a bug?
|
139
156
|
|
140
157
|
Use GitHUb Issues.
|
@@ -0,0 +1,68 @@
|
|
1
|
+
# Copyright (c) 2023 M.J.N. Corino, The Netherlands
|
2
|
+
#
|
3
|
+
# This software is released under the MIT license.
|
4
|
+
|
5
|
+
###
|
6
|
+
# wxRuby3 extension configuration file for gems
|
7
|
+
###
|
8
|
+
|
9
|
+
OPTIONS = {
|
10
|
+
}
|
11
|
+
|
12
|
+
until ARGV.empty?
|
13
|
+
switch = ARGV.shift
|
14
|
+
case switch
|
15
|
+
when /^prebuilt=(none|only)$/
|
16
|
+
OPTIONS[:prebuilt] = $1 == 'only'
|
17
|
+
when /^package=(.+)$/
|
18
|
+
OPTIONS[:package] = $1
|
19
|
+
when 'help'
|
20
|
+
puts <<~__INFO_TXT
|
21
|
+
wxRuby3 extension build script
|
22
|
+
|
23
|
+
Usage: gem install wxruby3 -- help OR gem install wxruby3 [-- options [...]]
|
24
|
+
|
25
|
+
options:
|
26
|
+
|
27
|
+
prebuilt=OPT Specifies to either require (OPT == 'only') or avoid (OPT == 'none') installing prebuilt
|
28
|
+
binary packages. If not specified installing a prebuilt package will be attempted reverting
|
29
|
+
to source install if none found.
|
30
|
+
|
31
|
+
package=URL Specifies the http(s) url or absolute path to the prebuilt binary package to install.
|
32
|
+
Implies 'prebuilt=only'.
|
33
|
+
|
34
|
+
help Show this message.
|
35
|
+
__INFO_TXT
|
36
|
+
puts
|
37
|
+
exit(1)
|
38
|
+
else
|
39
|
+
$stderr.puts "ERROR: Invalid option [#{switch}] for wxRuby3 extension build script."
|
40
|
+
exit(1)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
task_args = ''
|
45
|
+
unless OPTIONS[:prebuilt].nil?
|
46
|
+
task_args << "'#{(OPTIONS[:prebuilt] ? '--prebuilt' : '--no-prebuilt')}'"
|
47
|
+
end
|
48
|
+
if OPTIONS[:package]
|
49
|
+
task_args << ', ' unless task_args.empty?
|
50
|
+
pkg = RUBY_PLATFORM =~ /mingw/ ? OPTIONS[:package].gsub('\\', '/') : OPTIONS[:package] # make sure the path is URI compatible
|
51
|
+
task_args << "'--package', " << "'#{pkg}'"
|
52
|
+
end
|
53
|
+
|
54
|
+
# generate new rakefile with appropriate default task (calls actual task in rakelib)
|
55
|
+
File.open('../Rakefile', 'w') do |f|
|
56
|
+
f.puts <<EOF__
|
57
|
+
###
|
58
|
+
# wxRuby3 rake file
|
59
|
+
# Copyright (c) M.J.N. Corino, The Netherlands
|
60
|
+
###
|
61
|
+
|
62
|
+
unless File.file?(File.join('lib', 'wx', 'wxruby_core.so'))
|
63
|
+
task :default do
|
64
|
+
Rake::Task['wxruby:gem:install'].invoke(#{task_args})
|
65
|
+
end
|
66
|
+
end
|
67
|
+
EOF__
|
68
|
+
end
|
data/lib/wx/core/ext.rb
CHANGED
@@ -28,18 +28,37 @@ module Wx
|
|
28
28
|
end
|
29
29
|
end
|
30
30
|
|
31
|
+
class Value
|
32
|
+
def initialize(code, block)
|
33
|
+
@code = code
|
34
|
+
@block = block
|
35
|
+
end
|
36
|
+
|
37
|
+
def value
|
38
|
+
@block ? @block.call : Kernel.eval(@code || 'nil')
|
39
|
+
end
|
40
|
+
|
41
|
+
def to_s
|
42
|
+
@code || ''
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
31
46
|
def delayed_constants
|
32
47
|
@delayed_constants ||= ::Hash.new
|
33
48
|
end
|
34
49
|
|
35
50
|
public
|
36
51
|
|
37
|
-
def add_delayed_constant(mod, sym, &block)
|
38
|
-
delayed_constants[Key.new(mod,sym)] = block
|
52
|
+
def add_delayed_constant(mod, sym, code='', &block)
|
53
|
+
delayed_constants[Key.new(mod,sym)] = Value.new(code, block)
|
54
|
+
end
|
55
|
+
|
56
|
+
def delayed_constants_for(mod)
|
57
|
+
delayed_constants.select { |k,v| k.mod == mod }
|
39
58
|
end
|
40
59
|
|
41
60
|
def load_delayed_constants
|
42
|
-
delayed_constants.each_pair { |key,
|
61
|
+
delayed_constants.each_pair { |key, val| key.mod.const_set(key.sym, val.value) }
|
43
62
|
delayed_constants.clear # cleanup
|
44
63
|
end
|
45
64
|
|
@@ -0,0 +1,38 @@
|
|
1
|
+
# Copyright (c) 2023 M.J.N. Corino, The Netherlands
|
2
|
+
#
|
3
|
+
# This software is released under the MIT license.
|
4
|
+
|
5
|
+
module Wx
|
6
|
+
|
7
|
+
class SecretStore
|
8
|
+
|
9
|
+
# Wipes the secret data.
|
10
|
+
def self.wipe(secret)
|
11
|
+
if ::String === secret
|
12
|
+
secret.bytesize.times { |i| secret.setbyte(i, 0) }
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
17
|
+
|
18
|
+
class SecretValue
|
19
|
+
|
20
|
+
# Redefine the initialize method to auto-convert UTF-16/-32 strings to UTF-8 if possible.
|
21
|
+
wx_init = self.instance_method(:initialize)
|
22
|
+
define_method(:initialize) do | *args |
|
23
|
+
if args.size == 1 && ::String === args.first
|
24
|
+
unless args.first.encoding == ::Encoding::UTF_8 || args.first.encoding == ::Encoding::ASCII_8BIT
|
25
|
+
# convert in place unless frozen
|
26
|
+
if !args.first.frozen?
|
27
|
+
args.first.encode!(::Encoding::UTF_8) rescue nil
|
28
|
+
else # create converted copy
|
29
|
+
(args = [args.first.encode(::Encoding::UTF_8)]) rescue nil
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
wx_init.bind(self).call(*args)
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
@@ -155,12 +155,12 @@ There are however quite a lot of wrapped native objects in wxRuby for which *obj
|
|
155
155
|
object tracking has been disabled for their classes. This means these kind of classes/object should **not** be derived from
|
156
156
|
(if even possible and/or useful) to add functionality/information or their identity used as key to link other information.<br>
|
157
157
|
These classes include:
|
158
|
-
|
158
|
+
- classes considered POD types like Wx::Size, Wx::Point, Wx::RealPoint, Wx::Rect, Wx::GBSpan, Wx::GBPosition, Wx::BusyInfoFlags,
|
159
159
|
Wx::AboutDialogInfo
|
160
|
-
|
160
|
+
- final non-instantiatable classes like the Wx::DC (Device Context) class family, Wx::GraphicsContext, Wx::WindowsDisabler,
|
161
161
|
Wx::EventBlocker, Wx::BusyInfo
|
162
|
-
|
163
|
-
|
162
|
+
- classes with native singleton objects like Wx::Clipboard
|
163
|
+
- the reference counted GDI objects like Wx::Pen, Wx::Brush, Wx::Colour, Wx::Cursor, Wx::Bitmap, Wx::Icon and similar
|
164
164
|
reference counted objects like Wx::Font
|
165
165
|
|
166
166
|
The reference documentation will note untracked object classes.
|
@@ -87,7 +87,7 @@ Another difference is that {Wx::Config} will not automatically create missing gr
|
|
87
87
|
happen when writing configuration values.
|
88
88
|
|
89
89
|
A last difference is that the default support is by default backed up by persistent storage (windows registry or file) and
|
90
|
-
the wxRuby enhanced support only provides in-memory storage (`Hash` instance) by default
|
90
|
+
the wxRuby enhanced support only provides in-memory storage (`Hash` instance) by default.<br>
|
91
91
|
Persisting configuration data from {Wx::Config} will require coding customized storage and retrieval operations (which is
|
92
92
|
trivial using standard YAML or JSON support).
|
93
93
|
|
@@ -0,0 +1,55 @@
|
|
1
|
+
# :stopdoc:
|
2
|
+
# Copyright (c) 2023 M.J.N. Corino, The Netherlands
|
3
|
+
#
|
4
|
+
# This software is released under the MIT license.
|
5
|
+
# :startdoc:
|
6
|
+
|
7
|
+
|
8
|
+
module Wx
|
9
|
+
|
10
|
+
class SecretStore
|
11
|
+
|
12
|
+
# Wipes the secret data.
|
13
|
+
# @param [String] secret string containing secret data
|
14
|
+
# @return [void]
|
15
|
+
def self.wipe(secret); end
|
16
|
+
|
17
|
+
end
|
18
|
+
|
19
|
+
class SecretValue
|
20
|
+
|
21
|
+
# @overload initialize()
|
22
|
+
# Creates an empty secret value (not the same as an empty password).
|
23
|
+
# @return [Wx::SecretValue]
|
24
|
+
# @overload initialize(secret)
|
25
|
+
# Creates a secret value from the given string.
|
26
|
+
# The secret argument may contain NUL bytes.
|
27
|
+
# Any UTF-8 encoded (or encodable; wxRuby will attempt re-encoding as UTF-8 for any string not encoded UTF-8 or ASCII-8BIT) string will be stored as UTF-8 encoded string.
|
28
|
+
# In these cases use {#get_as_string} if needing to compare the original string to a restored string.
|
29
|
+
# Otherwise the string will be stored as ASCII-8BIT encoded string.
|
30
|
+
# In these cases use {#get_data} if needing to compare the original string to a restored string.
|
31
|
+
# See {#==} for comparing secret values opaquely.
|
32
|
+
# @param secret [String]
|
33
|
+
# @return [Wx::SecretValue]
|
34
|
+
# @overload initialize(other)
|
35
|
+
# Creates a copy of an existing secret.
|
36
|
+
# @param other [Wx::SecretValue]
|
37
|
+
# @return [Wx::SecretValue]
|
38
|
+
def initialize(*args) end
|
39
|
+
|
40
|
+
# Returns a copy of the secret data as an ASCII-8BIT encoded String.
|
41
|
+
# Be aware this could be binary data and may contain embedded NUL characters.
|
42
|
+
# For more security {Wx::SecretStore.wipe} should be used to wipe the secret data after use.
|
43
|
+
# @return [String] secret data
|
44
|
+
def get_data; end
|
45
|
+
|
46
|
+
# Returns a copy of the secret data as an UTF-8 encoded String.
|
47
|
+
# Make sure to use this method only if sure that the secret originally stored was indeed
|
48
|
+
# UTF-8 data as otherwise the returned string will not match the stored data.
|
49
|
+
# For more security {Wx::SecretStore.wipe} should be used to wipe the secret data after use.
|
50
|
+
# @return [String] secret data
|
51
|
+
def get_as_string; end
|
52
|
+
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
data/lib/wx/version.rb
CHANGED
data/lib/wx/wxruby/base.rb
CHANGED
@@ -20,17 +20,20 @@ module WxRuby
|
|
20
20
|
def commands
|
21
21
|
@commands ||= ::Hash.new do |hash, key|
|
22
22
|
STDERR.puts "Unknown command #{key} specified."
|
23
|
-
exit(
|
23
|
+
exit(127)
|
24
24
|
end
|
25
25
|
end
|
26
26
|
private :commands
|
27
27
|
|
28
|
+
def setup_done?
|
29
|
+
File.exist?(File.join(WxRuby::ROOT, 'ext', 'wxruby.setup.done'))
|
30
|
+
end
|
31
|
+
|
28
32
|
def options
|
29
33
|
@options ||= {
|
30
34
|
:verbose => false
|
31
35
|
}
|
32
36
|
end
|
33
|
-
private :options
|
34
37
|
|
35
38
|
def register(cmdid, cmdhandler)
|
36
39
|
commands[cmdid.to_s] = case
|
@@ -59,7 +62,7 @@ module WxRuby
|
|
59
62
|
def parse_args(args)
|
60
63
|
opts = OptionParser.new
|
61
64
|
opts.banner = "Usage: wxruby [global options] COMMAND [arguments]\n\n" +
|
62
|
-
" COMMAND\t\t\tSpecifies wxruby command to execute."
|
65
|
+
" COMMAND\t\t\t\tSpecifies wxruby command to execute."
|
63
66
|
opts.separator ''
|
64
67
|
opts.on('-v', '--verbose',
|
65
68
|
'Show verbose output') { |v| ::WxRuby::Commands.options[:verbose] = true }
|
@@ -70,8 +73,7 @@ module WxRuby
|
|
70
73
|
describe_all
|
71
74
|
exit(0)
|
72
75
|
end
|
73
|
-
opts.
|
74
|
-
opts.parse!(args)
|
76
|
+
opts.order!(args) rescue ($stderr.puts $!.message; exit(127))
|
75
77
|
end
|
76
78
|
end
|
77
79
|
end
|
@@ -79,9 +81,7 @@ module WxRuby
|
|
79
81
|
def self.run(argv = ARGV)
|
80
82
|
# parse global options (upto first command)
|
81
83
|
argv = WxRuby::Commands.parse_args(argv)
|
82
|
-
|
83
|
-
WxRuby::Commands.run(argv.shift, argv)
|
84
|
-
end
|
84
|
+
WxRuby::Commands.run(argv.shift, argv) unless argv.empty?
|
85
85
|
end
|
86
86
|
end
|
87
87
|
|
@@ -0,0 +1,182 @@
|
|
1
|
+
# Copyright (c) 2023 M.J.N. Corino, The Netherlands
|
2
|
+
#
|
3
|
+
# This software is released under the MIT license.
|
4
|
+
|
5
|
+
# wxruby check command handler
|
6
|
+
#--------------------------------------------------------------------
|
7
|
+
|
8
|
+
require 'fileutils'
|
9
|
+
require 'plat4m'
|
10
|
+
|
11
|
+
module WxRuby
|
12
|
+
module Commands
|
13
|
+
|
14
|
+
class Check
|
15
|
+
|
16
|
+
LOAD_ERRORS = {
|
17
|
+
linux: /cannot\s+open\s+shared\s+object/i,
|
18
|
+
darwin: /library\s+not\s+loaded/i,
|
19
|
+
windows: /specified\s+module\s+could\s+not\s+be\s+found/i
|
20
|
+
}
|
21
|
+
|
22
|
+
DESC = 'Run wxRuby3 runtime readiness check.'
|
23
|
+
|
24
|
+
def self.description
|
25
|
+
" check -h|[options]\t\t\t#{DESC}"
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.options
|
29
|
+
Commands.options['check'] ||= { verbose: Commands.options[:verbose] }
|
30
|
+
end
|
31
|
+
|
32
|
+
def self.parse_args(args)
|
33
|
+
opts = OptionParser.new
|
34
|
+
opts.banner = "#{DESC}\n\nUsage: wxruby check -h|--help OR wxruby check [options]\n\n" +
|
35
|
+
"Returns:\n"+
|
36
|
+
" 0 if wxRuby3 is ready to run\n"+
|
37
|
+
" 1 if wxRuby3 does not seem to be built yet\n"+
|
38
|
+
" 2 if wxRuby3 has problems loading extension libraries\n"+
|
39
|
+
" 3 if an unexpected Ruby error occurred\n\n"+
|
40
|
+
"Unless '-q|--quiet' has been specified a description of the possible problem cause will\n"+
|
41
|
+
"be shown on failure.\n\n"
|
42
|
+
opts.separator ''
|
43
|
+
opts.on('-q', '--quiet',
|
44
|
+
"Do not show problem analysis messages on failures.") do |v|
|
45
|
+
Check.options[:quiet] = true
|
46
|
+
Check.options[:verbose] = false
|
47
|
+
end
|
48
|
+
opts.on('-v', '--verbose',
|
49
|
+
'Show verbose output') do |v|
|
50
|
+
Check.options[:verbose] = true
|
51
|
+
Check.options[:quiet] = false
|
52
|
+
end
|
53
|
+
opts.on('-h', '--help',
|
54
|
+
'Show this message.') do |v|
|
55
|
+
puts opts
|
56
|
+
puts
|
57
|
+
exit(0)
|
58
|
+
end
|
59
|
+
opts.parse!(args) rescue ($stderr.puts $!.message; exit(127))
|
60
|
+
end
|
61
|
+
|
62
|
+
def self.show_error(msg)
|
63
|
+
$stderr.puts(msg) unless options[:quiet]
|
64
|
+
end
|
65
|
+
|
66
|
+
def self.show_log(msg)
|
67
|
+
$stdout.puts(msg) if options[:verbose]
|
68
|
+
end
|
69
|
+
|
70
|
+
def self.run(argv)
|
71
|
+
return description if argv == :describe
|
72
|
+
|
73
|
+
parse_args(argv)
|
74
|
+
|
75
|
+
show_log('Checking build (or binary package installation) completion...')
|
76
|
+
# check if the binary setup (packages or built) has been completed successfully
|
77
|
+
unless Commands.setup_done?
|
78
|
+
$stderr.puts <<~__INFO_TXT
|
79
|
+
|
80
|
+
wxRuby3 requires the post-install setup cmd to be run to build and finish installing
|
81
|
+
the required runtime binaries. Execute the command like:
|
82
|
+
|
83
|
+
$ wxruby setup
|
84
|
+
|
85
|
+
To see the available options for the command execute:
|
86
|
+
|
87
|
+
$ wxruby setup -h
|
88
|
+
|
89
|
+
__INFO_TXT
|
90
|
+
exit(1)
|
91
|
+
end
|
92
|
+
|
93
|
+
# check runtime
|
94
|
+
show_log('Attempting to load wxRuby3 libraries...')
|
95
|
+
sysinfo = Plat4m.current
|
96
|
+
begin
|
97
|
+
require 'wx'
|
98
|
+
rescue LoadError => ex
|
99
|
+
if ex.message =~ LOAD_ERRORS[sysinfo.os.id]
|
100
|
+
# error loading shared libraries
|
101
|
+
show_log("Captured LoadError: #{ex.message}")
|
102
|
+
# check if wxWidgets libs can be located
|
103
|
+
show_log('Checking wxWidgets availability...')
|
104
|
+
wx_found = if Dir[File.join(WxRuby::ROOT, 'ext', "*.#{RbConfig::CONFIG['SOEXT']}")].empty?
|
105
|
+
# no embedded wxWidgets -> if system installed than 'wx-config' should be in the path
|
106
|
+
if system("wx-config --version>#{sysinfo.dev_null} 2>&1")
|
107
|
+
true # system installed
|
108
|
+
else
|
109
|
+
# no system installed wxWidgets
|
110
|
+
# check the system dependent load paths if any wxWidgets libs can be found
|
111
|
+
case sysinfo.os.id
|
112
|
+
when :linux
|
113
|
+
(ENV['LD_LIBRARY_PATH']||'').split(':').any? { |p| !Dir[File.join(p, 'libwx_base*.so')].empty? }
|
114
|
+
when :darwin
|
115
|
+
(ENV['DYLD_LIBRARY_PATH']||'').split(':').any? { |p| !Dir[File.join(p, 'libwx_base*.dylib')].empty? }
|
116
|
+
when :windows
|
117
|
+
(ENV['PATH']||'').split(';').any? { |p| !Dir[File.join(p, 'wxbase*.dll')].empty? }
|
118
|
+
else
|
119
|
+
true # do not know how to search so assume wxWidgets found
|
120
|
+
end
|
121
|
+
end
|
122
|
+
else
|
123
|
+
true # embedded wxWidgets
|
124
|
+
end
|
125
|
+
if wx_found
|
126
|
+
show_log('wxWidgets found')
|
127
|
+
show_error <<~__INFO_TXT
|
128
|
+
|
129
|
+
The runtime environment of this system seems to be missing some required libraries for
|
130
|
+
executing wxRuby3 apps.
|
131
|
+
Please be aware wxRuby3 requires a properly configured GUI based system to function.
|
132
|
+
See the documentation for more information on the required runtime environment.
|
133
|
+
|
134
|
+
__INFO_TXT
|
135
|
+
else
|
136
|
+
show_log('NO wxWidgets found')
|
137
|
+
show_error <<~__INFO_TXT
|
138
|
+
|
139
|
+
It seems wxRuby3 is not able to load any of the required wxWidgets libraries it was built
|
140
|
+
for.
|
141
|
+
Please make sure these (shared) libraries are available in the appropriate search path
|
142
|
+
for this system.
|
143
|
+
|
144
|
+
__INFO_TXT
|
145
|
+
end
|
146
|
+
else
|
147
|
+
show_error <<~__INFO_TXT
|
148
|
+
|
149
|
+
There is an unexpected problem loading the wxRuby3 extension libraries.
|
150
|
+
Please check the problem report below for a probable cause analysis. If you have reason
|
151
|
+
to suspect a bug to be the cause of this problem please file an issue at Github and attach
|
152
|
+
the problem report.
|
153
|
+
|
154
|
+
#{ex.message}
|
155
|
+
#{ex.backtrace.join("\n")}
|
156
|
+
|
157
|
+
__INFO_TXT
|
158
|
+
end
|
159
|
+
exit(2)
|
160
|
+
rescue Exception => ex
|
161
|
+
show_log("Captured Exception: #{ex.message}")
|
162
|
+
show_error <<~__INFO_TXT
|
163
|
+
|
164
|
+
There is an unexpected problem loading the wxRuby3 libraries.
|
165
|
+
Please check the problem report below for a probable cause analysis. If you have reason
|
166
|
+
to suspect a bug to be the cause of this problem please file an issue at Github and attach
|
167
|
+
the problem report.
|
168
|
+
|
169
|
+
#{ex.message}
|
170
|
+
#{ex.backtrace.join("\n")}
|
171
|
+
|
172
|
+
__INFO_TXT
|
173
|
+
exit(3)
|
174
|
+
end
|
175
|
+
end
|
176
|
+
|
177
|
+
end
|
178
|
+
|
179
|
+
self.register('check', Check)
|
180
|
+
|
181
|
+
end
|
182
|
+
end
|
@@ -10,44 +10,54 @@ require 'fileutils'
|
|
10
10
|
module WxRuby
|
11
11
|
module Commands
|
12
12
|
class Sampler
|
13
|
-
|
14
|
-
|
15
|
-
}
|
13
|
+
|
14
|
+
DESC = 'Run wxRuby3 Sampler application (or copy samples).'
|
16
15
|
|
17
16
|
def self.description
|
18
|
-
" sampler
|
17
|
+
" sampler -h|[options]\t\t#{DESC}"
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.options
|
21
|
+
Commands.options['sampler'] ||= { verbose: Commands.options[:verbose] }
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.parse_args(args)
|
25
|
+
opts = OptionParser.new
|
26
|
+
opts.banner = "#{DESC}\n\nUsage: wxruby sampler -h|--help OR wxruby sampler [options]\n\n" +
|
27
|
+
"Runs the sampler application if no options specified.\n\n"
|
28
|
+
opts.separator ''
|
29
|
+
opts.on('--copy=DEST',
|
30
|
+
'Copies the included wxRuby sample folders under the directory indicated by DEST (MUST exist)') {|v| Sampler.options[:copy] << v }
|
31
|
+
opts.on('-h', '--help',
|
32
|
+
'Show this message.') do |v|
|
33
|
+
puts opts
|
34
|
+
puts
|
35
|
+
exit(0)
|
36
|
+
end
|
37
|
+
opts.parse!(args) rescue ($stderr.puts $!.message; exit(127))
|
19
38
|
end
|
20
39
|
|
21
40
|
def self.run(argv)
|
22
|
-
if argv == :describe
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
puts 'Usage: wxruby [global options] sampler [help]|[copy DEST]'
|
31
|
-
puts
|
32
|
-
puts ' Starts the sampler application if called without arguments.'
|
33
|
-
puts ' Otherwise shows this help for argument "help" or copies the included wxRuby'
|
34
|
-
puts ' sample folders under the directory indicated by DEST for argument "copy DEST".'
|
35
|
-
puts ' The directory indicated by DEST *must* already exist.'
|
36
|
-
puts
|
37
|
-
elsif arg == 'copy'
|
38
|
-
unless File.directory?(dest = argv.shift)
|
39
|
-
STDERR.puts "ERROR: Invalid destination folder #{dest}"
|
40
|
-
exit(1)
|
41
|
-
end
|
42
|
-
Dir[File.join(WxRuby::ROOT, 'samples', '*')].each do |fp|
|
43
|
-
FileUtils.cp_r(fp, dest, verbose: true)
|
44
|
-
end
|
45
|
-
end
|
41
|
+
return description if argv == :describe
|
42
|
+
|
43
|
+
parse_args(argv)
|
44
|
+
|
45
|
+
if options[:copy]
|
46
|
+
unless File.directory?(dest = options[:copy])
|
47
|
+
$stderr.puts "ERROR: Invalid destination folder #{dest}"
|
48
|
+
exit(1)
|
46
49
|
end
|
50
|
+
Dir[File.join(WxRuby::ROOT, 'samples', '*')].each do |fp|
|
51
|
+
FileUtils.cp_r(fp, dest, verbose: true)
|
52
|
+
end
|
53
|
+
else
|
54
|
+
exec(RUBY, File.join(WxRuby::ROOT, 'samples', 'sampler.rb'))
|
47
55
|
end
|
48
56
|
end
|
49
57
|
end
|
50
58
|
|
51
|
-
self.
|
59
|
+
if self.setup_done?
|
60
|
+
self.register('sampler', Sampler)
|
61
|
+
end
|
52
62
|
end
|
53
63
|
end
|