mruby_tools 0.0.1.1 → 0.0.2.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/VERSION +1 -1
- data/bin/mrbt +10 -45
- data/lib/mruby_tools.rb +68 -8
- data/test/mruby_tools.rb +68 -0
- metadata +2 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bde41419ba3eb29e2b6487d232c94b2cf630387f
|
4
|
+
data.tar.gz: 643bb284b8af86dbd22cd29a70d5badb5824fcfb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4dcbdcf5da887ffad6bb6ac220aa4e2525724e228af89329beb64e58131c7eea40bf66038d13cb95c6dd3a1fe2f321e6246a6bc1cac68cf7c7b564ec6d60dff5
|
7
|
+
data.tar.gz: 376214a2967c23a8c9fd27aa113337a6439b4ed18c48e4749b90b94f96ac9a9e465e9bf9a86a5ec8b20235155fca3cb0ef930328d6529da7dfe5fd8ed1e28376
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.2.1
|
data/bin/mrbt
CHANGED
@@ -7,59 +7,24 @@ require 'mruby_tools'
|
|
7
7
|
# possibly: file1.rb -o outfile file2.rb -c generated.c
|
8
8
|
|
9
9
|
opts = MRubyTools.args(ARGV)
|
10
|
-
|
11
|
-
|
12
|
-
c_code = <<'EOF'
|
13
|
-
#include <stdlib.h>
|
14
|
-
#include <mruby.h>
|
15
|
-
#include <mruby/compile.h>
|
16
|
-
#include <mruby/string.h>
|
17
|
-
|
18
|
-
void check_exc(mrb_state *mrb, char *filename) {
|
19
|
-
if (mrb->exc) {
|
20
|
-
mrb_value exc = mrb_obj_value(mrb->exc);
|
21
|
-
mrb_value exc_msg = mrb_funcall(mrb, exc, "to_s", 0);
|
22
|
-
fprintf(stderr, "ERROR in %s - %s: %s\n",
|
23
|
-
filename,
|
24
|
-
mrb_obj_classname(mrb, exc),
|
25
|
-
mrb_str_to_cstr(mrb, exc_msg));
|
26
|
-
/* mrb_print_backtrace(mrb); # empty */
|
27
|
-
exit(1);
|
28
|
-
}
|
29
|
-
}
|
30
|
-
|
31
|
-
int
|
32
|
-
main(void)
|
33
|
-
{
|
34
|
-
mrb_state *mrb = mrb_open();
|
35
|
-
if (!mrb) {
|
36
|
-
printf("mrb problem");
|
37
|
-
exit(1);
|
38
|
-
}
|
39
|
-
EOF
|
40
|
-
|
41
|
-
c_code += opts.fetch(:rb_files).map { |rbf|
|
42
|
-
"\n" + MRubyTools.rb2c(rbf) + "\n\n"
|
43
|
-
}.join
|
44
|
-
|
45
|
-
c_code += <<EOF
|
46
|
-
mrb_close(mrb);
|
47
|
-
return 0;
|
48
|
-
}
|
49
|
-
EOF
|
10
|
+
MRubyTools.usage if opts[:help]
|
50
11
|
|
12
|
+
rb_files = opts.fetch(:rb_files)
|
13
|
+
MRubyTools.usage("no .rb files provided") if rb_files.empty?
|
14
|
+
c_code = MRubyTools.c_wrapper(rb_files)
|
51
15
|
puts c_code + "\n" if opts[:verbose]
|
52
16
|
|
53
|
-
|
54
|
-
|
55
|
-
|
17
|
+
out_file = opts.fetch(:out_file)
|
18
|
+
c_file = opts.fetch(:c_file)
|
19
|
+
c_file.write(c_code)
|
20
|
+
c_file.close
|
56
21
|
|
57
22
|
msd = MRubyTools.mruby_src_dir
|
58
23
|
|
59
24
|
gcc_args = [
|
60
|
-
'-std=c99', "-I", File.join(msd, 'include'),
|
25
|
+
'-std=c99', "-I", File.join(msd, 'include'), c_file.path, "-o", out_file,
|
61
26
|
File.join(msd, 'build', 'host', 'lib', 'libmruby.a'), '-lm',
|
62
27
|
]
|
63
28
|
|
64
29
|
puts "compiling..."
|
65
|
-
puts "created binary executable: #{
|
30
|
+
puts "created binary executable: #{out_file}" if system('gcc', *gcc_args)
|
data/lib/mruby_tools.rb
CHANGED
@@ -1,4 +1,47 @@
|
|
1
|
+
require 'tempfile'
|
2
|
+
|
1
3
|
module MRubyTools
|
4
|
+
def self.c_wrapper(rb_files)
|
5
|
+
c_code = <<'EOF'
|
6
|
+
#include <stdlib.h>
|
7
|
+
#include <mruby.h>
|
8
|
+
#include <mruby/compile.h>
|
9
|
+
#include <mruby/string.h>
|
10
|
+
|
11
|
+
void check_exc(mrb_state *mrb, char *filename) {
|
12
|
+
if (mrb->exc) {
|
13
|
+
mrb_value exc = mrb_obj_value(mrb->exc);
|
14
|
+
mrb_value exc_msg = mrb_funcall(mrb, exc, "to_s", 0);
|
15
|
+
fprintf(stderr, "ERROR in %s - %s: %s\n",
|
16
|
+
filename,
|
17
|
+
mrb_obj_classname(mrb, exc),
|
18
|
+
mrb_str_to_cstr(mrb, exc_msg));
|
19
|
+
/* mrb_print_backtrace(mrb); # empty */
|
20
|
+
exit(1);
|
21
|
+
}
|
22
|
+
}
|
23
|
+
|
24
|
+
int
|
25
|
+
main(void)
|
26
|
+
{
|
27
|
+
mrb_state *mrb = mrb_open();
|
28
|
+
if (!mrb) {
|
29
|
+
printf("mrb problem");
|
30
|
+
exit(1);
|
31
|
+
}
|
32
|
+
EOF
|
33
|
+
c_code += rb_files.map { |rbf|
|
34
|
+
"\n" + self.rb2c(rbf) + "\n\n"
|
35
|
+
}.join
|
36
|
+
|
37
|
+
c_code += <<EOF
|
38
|
+
mrb_close(mrb);
|
39
|
+
return 0;
|
40
|
+
}
|
41
|
+
EOF
|
42
|
+
c_code
|
43
|
+
end
|
44
|
+
|
2
45
|
def self.rb2c(rb_filename, indent: ' ')
|
3
46
|
c_str = File.read(rb_filename)
|
4
47
|
size = c_str.size
|
@@ -19,30 +62,47 @@ module MRubyTools
|
|
19
62
|
mruby_src_dir
|
20
63
|
end
|
21
64
|
|
65
|
+
def self.usage(msg = nil)
|
66
|
+
puts <<EOF
|
67
|
+
USAGE: mrbt file1.rb file2.rb ...
|
68
|
+
OPTIONS: -o outfile (provide a name for the standalone executable)
|
69
|
+
-c generated.c (leave the specified C file on the filesystem)
|
70
|
+
-v (verbose)
|
71
|
+
EOF
|
72
|
+
warn " ERROR: #{msg}" if msg
|
73
|
+
exit
|
74
|
+
end
|
75
|
+
|
22
76
|
def self.args(argv = ARGV)
|
23
77
|
rb_files = []
|
24
|
-
|
25
|
-
|
78
|
+
out_file = nil
|
79
|
+
c_file = nil
|
26
80
|
verbose = false
|
81
|
+
help = false
|
27
82
|
|
28
83
|
while !argv.empty?
|
29
84
|
arg = argv.shift
|
30
85
|
if arg == '-o'
|
31
|
-
|
32
|
-
raise "no
|
33
|
-
raise "#{
|
86
|
+
out_file = argv.shift
|
87
|
+
raise "no out_file provided with -o" unless out_file
|
88
|
+
raise "#{out_file} is misnamed" if File.extname(out_file) == '.rb'
|
34
89
|
elsif arg == '-c'
|
35
|
-
|
90
|
+
c_file = File.open(argv.shift || 'generated.c', "w")
|
36
91
|
elsif arg == '-v'
|
37
92
|
verbose = true
|
93
|
+
elsif arg == '-h'
|
94
|
+
help = true
|
38
95
|
else
|
39
96
|
rb_files << arg
|
40
97
|
end
|
41
98
|
end
|
42
99
|
|
100
|
+
c_file ||= Tempfile.new(['generated', '.c'])
|
101
|
+
|
43
102
|
{ verbose: verbose,
|
44
|
-
|
45
|
-
|
103
|
+
help: help,
|
104
|
+
c_file: c_file,
|
105
|
+
out_file: out_file || 'outfile',
|
46
106
|
rb_files: rb_files }
|
47
107
|
end
|
48
108
|
end
|
data/test/mruby_tools.rb
ADDED
@@ -0,0 +1,68 @@
|
|
1
|
+
require 'mruby_tools'
|
2
|
+
require 'minitest/autorun'
|
3
|
+
|
4
|
+
describe MRubyTools do
|
5
|
+
describe "c_wrapper" do
|
6
|
+
it "must return a string of mruby C code" do
|
7
|
+
[[], [__FILE__]].each { |rb_files|
|
8
|
+
str = MRubyTools.c_wrapper(rb_files)
|
9
|
+
str.must_be_kind_of String
|
10
|
+
str.wont_be_empty
|
11
|
+
str.must_match(/main\(void\)/)
|
12
|
+
str.must_match(/return/)
|
13
|
+
str.must_match(/exit/)
|
14
|
+
str.must_match(/mruby/)
|
15
|
+
str.must_match(/mrb/)
|
16
|
+
}
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
describe "rb2c" do
|
21
|
+
it "must inject the contents of a ruby file into mrb_load_string()" do
|
22
|
+
str = MRubyTools.rb2c(__FILE__)
|
23
|
+
str.must_be_kind_of String
|
24
|
+
str.wont_be_empty
|
25
|
+
str.must_match(/mrb_load_n?string\(/)
|
26
|
+
str.must_match(/exc/)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
describe "mruby_src_dir" do
|
31
|
+
it "must confirm the specified mruby source on the filesystem" do
|
32
|
+
candidates = []
|
33
|
+
%w{src git}.each { |subdir|
|
34
|
+
candidates +=
|
35
|
+
Dir[File.join(ENV['HOME'], subdir, 'mruby-1.*', 'include')]
|
36
|
+
}
|
37
|
+
unless candidates.empty?
|
38
|
+
latest = File.expand_path('..', candidates.last)
|
39
|
+
key = 'TESTING_MRUBY_SRC_DIR'
|
40
|
+
ENV[key] = latest
|
41
|
+
dir = MRubyTools.mruby_src_dir(key)
|
42
|
+
File.directory?(dir).must_equal true
|
43
|
+
File.directory?(File.join(dir, 'include')).must_equal true
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
it "must accept the dir specification from the environment" do
|
48
|
+
proc { MRubyTools.mruby_src_dir('bad key') }.must_raise Exception
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
describe "args" do
|
53
|
+
it "must provide a hash with expected keys" do
|
54
|
+
h = MRubyTools.args([])
|
55
|
+
h.must_be_kind_of Hash
|
56
|
+
[:verbose, :help, :c_file, :out_file, :rb_files].each { |key|
|
57
|
+
h.key?(key).must_equal true
|
58
|
+
}
|
59
|
+
h[:verbose].must_equal false
|
60
|
+
h[:help].must_equal false
|
61
|
+
[Tempfile, File].must_include h[:c_file].class
|
62
|
+
h[:out_file].must_be_kind_of String
|
63
|
+
h[:out_file].wont_be_empty
|
64
|
+
h[:rb_files].must_be_kind_of Array
|
65
|
+
h[:rb_files].must_be_empty
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mruby_tools
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Rick Hull
|
@@ -57,6 +57,7 @@ files:
|
|
57
57
|
- examples/timer.rb
|
58
58
|
- lib/mruby_tools.rb
|
59
59
|
- mruby_tools.gemspec
|
60
|
+
- test/mruby_tools.rb
|
60
61
|
homepage: https://github.com/rickhull/mruby-tools
|
61
62
|
licenses:
|
62
63
|
- LGPL-3.0
|