exerb 6.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +8 -0
- data/ChangeLog.ja.rd +305 -0
- data/README.en.txt +12 -0
- data/README.ja.html +143 -0
- data/README.ja.txt +6 -0
- data/README.md +50 -0
- data/Rakefile +205 -0
- data/bin/exerb +185 -0
- data/bin/mkexy +47 -0
- data/doc/LGPL +513 -0
- data/doc/class.ja.html +92 -0
- data/doc/command.ja.html +109 -0
- data/doc/core.ja.html +72 -0
- data/doc/example.ja.html +89 -0
- data/doc/faq.ja.html +59 -0
- data/doc/inside.ja.rd +404 -0
- data/doc/license.ja.html +62 -0
- data/doc/logo.gif +0 -0
- data/doc/misc.ja.html +72 -0
- data/doc/navi.gif +0 -0
- data/doc/recipe.ja.html +317 -0
- data/doc/style.css +187 -0
- data/doc/tutorial.ja.html +182 -0
- data/example/Makefile +54 -0
- data/example/cat_n.rb +14 -0
- data/example/exception.rb +9 -0
- data/example/ext/Win32API.so +0 -0
- data/example/ext/swin.so +0 -0
- data/example/msgbox.rb +14 -0
- data/example/rubytk.rb +22 -0
- data/example/runtime.ico +0 -0
- data/example/runtime.rb +19 -0
- data/example/vr/clipboard.rb +106 -0
- data/example/vr/compat/rubycompat.rb +18 -0
- data/example/vr/compat/vrcomctl.rb +12 -0
- data/example/vr/compat/vrcontrol.rb +50 -0
- data/example/vr/compat/vrmmedia.rb +24 -0
- data/example/vr/contrib/inifile.rb +116 -0
- data/example/vr/contrib/msgboxconst.rb +55 -0
- data/example/vr/contrib/toolbar.rb +371 -0
- data/example/vr/contrib/vrctlcolor.rb +110 -0
- data/example/vr/contrib/vrhotkey.rb +35 -0
- data/example/vr/contrib/vrlistviewex.rb +71 -0
- data/example/vr/contrib/vrstdscrollbar.rb +414 -0
- data/example/vr/contrib/vrwincomponent.rb +54 -0
- data/example/vr/dragdropformat.rb +209 -0
- data/example/vr/rscutil.rb +168 -0
- data/example/vr/sysmod.rb +249 -0
- data/example/vr/vractivex.rb +56 -0
- data/example/vr/vrclipboard.rb +53 -0
- data/example/vr/vrcomctl.rb +1819 -0
- data/example/vr/vrcontrol.rb +1374 -0
- data/example/vr/vrdde.rb +623 -0
- data/example/vr/vrddrop.rb +190 -0
- data/example/vr/vrdialog.rb +406 -0
- data/example/vr/vrhandler.rb +195 -0
- data/example/vr/vrlayout.old.rb +209 -0
- data/example/vr/vrlayout.rb +173 -0
- data/example/vr/vrlayout2.rb +340 -0
- data/example/vr/vrmargin.rb +141 -0
- data/example/vr/vrmgdlayout.rb +381 -0
- data/example/vr/vrmmedia.rb +287 -0
- data/example/vr/vrolednd.rb +192 -0
- data/example/vr/vrowndraw.rb +108 -0
- data/example/vr/vrrichedit.rb +366 -0
- data/example/vr/vrtimer.rb +148 -0
- data/example/vr/vrtooltip.rb +273 -0
- data/example/vr/vrtray.rb +143 -0
- data/example/vr/vrtvitem.rb +118 -0
- data/example/vr/vrtwopane.rb +223 -0
- data/example/vr/vruby.rb +1051 -0
- data/example/vr/winconst.rb +158 -0
- data/example/vruby.rb +38 -0
- data/exerb.gemspec +26 -0
- data/extconf.rb +7 -0
- data/lib/exerb/archive.rb +143 -0
- data/lib/exerb/config.rb +51 -0
- data/lib/exerb/error.rb +15 -0
- data/lib/exerb/executable.rb +68 -0
- data/lib/exerb/file_table.rb +189 -0
- data/lib/exerb/mkexy.rb +81 -0
- data/lib/exerb/name_table.rb +120 -0
- data/lib/exerb/recipe.rb +465 -0
- data/lib/exerb/resource.rb +190 -0
- data/lib/exerb/resource/base.rb +29 -0
- data/lib/exerb/resource/binary.rb +31 -0
- data/lib/exerb/resource/dialog.rb +30 -0
- data/lib/exerb/resource/group_icon.rb +85 -0
- data/lib/exerb/resource/icon.rb +52 -0
- data/lib/exerb/resource/version_info.rb +155 -0
- data/lib/exerb/resource_library.rb +120 -0
- data/lib/exerb/utility.rb +95 -0
- data/lib/exerb/utility2.rb +122 -0
- data/lib/exerb/version.rb +13 -0
- data/lib/exerb/win32/const/resource.rb +51 -0
- data/lib/exerb/win32/icon_file.rb +78 -0
- data/lib/exerb/win32/pe_file.rb +59 -0
- data/lib/exerb/win32/resource_directory.rb +105 -0
- data/lib/exerb/win32/resource_directory_root.rb +67 -0
- data/lib/exerb/win32/resource_entry.rb +98 -0
- data/lib/exerb/win32/struct/base.rb +43 -0
- data/lib/exerb/win32/struct/icon_dir_entry.rb +83 -0
- data/lib/exerb/win32/struct/icon_header.rb +43 -0
- data/lib/exerb/win32/struct/icon_res_entry.rb +48 -0
- data/lib/exerb/win32/struct/image_dos_header.rb +73 -0
- data/lib/exerb/win32/struct/image_file_header.rb +47 -0
- data/lib/exerb/win32/struct/image_nt_headers32.rb +53 -0
- data/lib/exerb/win32/struct/image_optional_header32.rb +107 -0
- data/lib/exerb/win32/struct/image_resource_data_entry.rb +45 -0
- data/lib/exerb/win32/struct/image_resource_directory.rb +47 -0
- data/lib/exerb/win32/struct/image_resource_directory_entry.rb +72 -0
- data/lib/exerb/win32/struct/image_section_header.rb +53 -0
- data/lib/exerb/win32/struct/version_info_block.rb +75 -0
- data/lib/exerb/win32/struct/vs_fixed_file_info.rb +62 -0
- data/src/exerb/cui.c +48 -0
- data/src/exerb/default.rb +1 -0
- data/src/exerb/exerb.c +877 -0
- data/src/exerb/exerb.h +92 -0
- data/src/exerb/gui.c +176 -0
- data/src/exerb/module.c +138 -0
- data/src/exerb/module.h +7 -0
- data/src/exerb/patch.c +27 -0
- data/src/exerb/resource.h +22 -0
- data/src/exerb/resource.rc +121 -0
- data/src/exerb/ruby.ico +0 -0
- data/src/exerb/utility.c +263 -0
- data/src/exerb/utility.h +33 -0
- data/test/alltests.rb +16 -0
- data/test/test-argv.rb +26 -0
- data/test/test-argv/test-argv.rb +9 -0
- data/test/test-argv/test-argv.ret +1 -0
- data/test/test-dollarzero.rb +26 -0
- data/test/test-dollarzero/test-dollarzero.rb +10 -0
- data/test/test-dollarzero/test-dollarzero.ret +2 -0
- data/test/test-dot.rb +26 -0
- data/test/test-dot/dot.dot.dot.rb +9 -0
- data/test/test-dot/dot.dot.rb +9 -0
- data/test/test-dot/test-dot.rb +13 -0
- data/test/test-dot/test-dot.ret +5 -0
- data/test/test-exitcode.rb +28 -0
- data/test/test-exitcode/test-exitcode.rb +9 -0
- data/test/test-kcode.rb +43 -0
- data/test/test-kcode/euc.rb +10 -0
- data/test/test-kcode/euc.ret +2 -0
- data/test/test-kcode/none.rb +10 -0
- data/test/test-kcode/none.ret +2 -0
- data/test/test-kcode/sjis.rb +10 -0
- data/test/test-kcode/sjis.ret +2 -0
- data/test/test-kcode/utf8.rb +10 -0
- data/test/test-kcode/utf8.ret +2 -0
- data/test/test-loadpath.rb +24 -0
- data/test/test-loadpath/test-loadpath.rb +9 -0
- data/test/test-nest.rb +18 -0
- data/test/test-nest/foo.rb +1 -0
- data/test/test-nest/foo/bar.rb +2 -0
- data/test/test-nest/foo/foo.rb +1 -0
- data/test/test-nest/test-nest.rb +1 -0
- data/test/test-nest/test-nest.ret +1 -0
- data/test/test-preload.rb +24 -0
- data/test/test-preload/test-preload.rb +9 -0
- data/test/test-regexp.rb +26 -0
- data/test/test-regexp/test-regexp.rb +23 -0
- data/test/test-regexp/test-regexp.ret +13 -0
- data/test/test-require1.rb +26 -0
- data/test/test-require1/require1.rb +9 -0
- data/test/test-require1/require2.rb +9 -0
- data/test/test-require1/require3.rb +9 -0
- data/test/test-require1/require4.rb +9 -0
- data/test/test-require1/require5.rb +9 -0
- data/test/test-require1/require6.rb +9 -0
- data/test/test-require1/test-require1.rb +41 -0
- data/test/test-require1/test-require1.ret +27 -0
- data/test/test-socket.rb +26 -0
- data/test/test-socket/test-socket.rb +7 -0
- data/test/test-socket/test-socket.ret +1 -0
- data/test/testcase.rb +66 -0
- data/vendor/mkexports.rb +167 -0
- metadata +352 -0
data/README.ja.txt
ADDED
data/README.md
ADDED
@@ -0,0 +1,50 @@
|
|
1
|
+
# Exerb
|
2
|
+
|
3
|
+
Packaged ruby source files and required other (*.rb *.so *.dll) to a .exe file.
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
|
8
|
+
1. install RubyInstaller's DevKit
|
9
|
+
|
10
|
+
from `http://rubyinstaller.org/add-ons/devkit` download and install
|
11
|
+
cd %DEVKITPATH% # install path, like c:/rbmingw
|
12
|
+
ruby dk.rb init
|
13
|
+
notepad config.yml # edit config file, set ruby installed path
|
14
|
+
ruby install
|
15
|
+
ruby -e "require 'devkit'; puts ENV\['RI_DEVKIT']" # test, ensure the path is %DEVKITPATH%
|
16
|
+
|
17
|
+
2. install gem
|
18
|
+
|
19
|
+
gem install exerb
|
20
|
+
|
21
|
+
## Usage
|
22
|
+
|
23
|
+
1. generate one or more ruby source files do some thing and test it
|
24
|
+
|
25
|
+
ruby r1.rb arg1 arg2 arg3
|
26
|
+
|
27
|
+
2. make exy file from ruby source file
|
28
|
+
|
29
|
+
mkexy -- r1.rb arg1 arg2 arg3 # or
|
30
|
+
ruby -r exerb/mkexy r1.rb arg1 arg2 arg3
|
31
|
+
|
32
|
+
3. check r1.exy file, check every required files.
|
33
|
+
can be change `general.core` to `cui/gui`, add `resource` , `path` section
|
34
|
+
more demo old_*.exy in example/ and test/ directory
|
35
|
+
|
36
|
+
4. generate exe file
|
37
|
+
|
38
|
+
exerb -v r1.exy
|
39
|
+
|
40
|
+
5. execute EXE file
|
41
|
+
|
42
|
+
r1.exe arg1 arg2 arg3 # can receive some result as ruby r1.rb arg1 arg2 arg3
|
43
|
+
|
44
|
+
## Contributing
|
45
|
+
|
46
|
+
1. Fork it ( https://github.com/[my-github-username]/exerb/fork )
|
47
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
48
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
49
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
50
|
+
5. Create a new Pull Request
|
data/Rakefile
ADDED
@@ -0,0 +1,205 @@
|
|
1
|
+
begin
|
2
|
+
require 'devkit'
|
3
|
+
raise LoadError unless ENV['RI_DEVKIT'] # need RubyInstaller's DevKit, not devkit gem.
|
4
|
+
rescue LoadError
|
5
|
+
msg = "You need to install the devkit to compile exerb-mingw.\n"
|
6
|
+
msg << " http://rubyinstaller.org/add-ons/devkit/"
|
7
|
+
abort msg
|
8
|
+
end
|
9
|
+
require 'rbconfig'
|
10
|
+
require 'ostruct'
|
11
|
+
require 'rake/clean'
|
12
|
+
|
13
|
+
unless RUBY_VERSION >= "1.9.3"
|
14
|
+
fail "You need at least Ruby 1.9.3 to compile exerb-mingw."
|
15
|
+
end
|
16
|
+
|
17
|
+
# Include vendored scripts
|
18
|
+
$LOAD_PATH.unshift File.expand_path("../vendor", __FILE__)
|
19
|
+
require "mkexports"
|
20
|
+
|
21
|
+
EXERB_CFLAGS = "-DRUBY19 -DRUBY19_COMPILED_CODE"
|
22
|
+
|
23
|
+
C = OpenStruct.new
|
24
|
+
c = RbConfig::CONFIG
|
25
|
+
c['CFLAGS'] = ' -Wall -std=gnu99 -O3 -g -Wextra -Wno-unused-parameter -Wno-parentheses -Wno-long-long -Wno-missing-field-initializers -Werror=pointer-arith -Werror=write-strings '
|
26
|
+
C.arch = c["arch"]
|
27
|
+
C.cc = "#{c['CC'] || 'gcc'}"
|
28
|
+
C.cflags = "#{c['CFLAGS'] || '-Os'}"
|
29
|
+
C.xcflags = "#{c['XCFLAGS'] || '-DRUBY_EXPORT'}"
|
30
|
+
C.exerb_cflags = EXERB_CFLAGS
|
31
|
+
C.cppflags = c['CPPFLAGS']
|
32
|
+
if c['rubyhdrdir']
|
33
|
+
C.incflags = "-I#{c['rubyhdrdir']}/#{c['arch']} -I#{c['rubyhdrdir']}" if c['rubyhdrdir']
|
34
|
+
else
|
35
|
+
C.incflags = "-I#{c['archdir']}"
|
36
|
+
end
|
37
|
+
C.ldflags = "-L#{c['libdir']}"
|
38
|
+
C.xldflags = "#{c['XLDFLAGS'] || '-Wl,--stack=0x02000000,--wrap=rb_require_safe,--wrap=rb_require'}"
|
39
|
+
C.rubylib = "#{c['LIBRUBYARG_STATIC']}"
|
40
|
+
C.libs = "#{c['LIBS']}"
|
41
|
+
C.ver = RUBY_VERSION.gsub('.','')
|
42
|
+
|
43
|
+
def make_resource(target, source, type)
|
44
|
+
file target => source do
|
45
|
+
mkdir_p File.dirname(target)
|
46
|
+
sh "windres -D#{type} #{source} #{target}"
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def compile_c(target, source)
|
51
|
+
cmdline = "#{C.cc} #{C.cflags} #{C.xcflags} #{C.cppflags} #{C.incflags} -c -o #{target} #{source}"
|
52
|
+
file target => source do
|
53
|
+
mkdir_p File.dirname(target)
|
54
|
+
sh cmdline
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
def link_cpp(target, options)
|
59
|
+
sources = options[:sources]
|
60
|
+
cc = 'gcc'
|
61
|
+
cflags = "#{C.cflags} #{C.xcflags} #{C.exerb_cflags} #{C.cppflags} #{C.incflags}"
|
62
|
+
ldflags = "#{C.ldflags} #{C.xldflags}"
|
63
|
+
dllflags = options[:isdll] ? "-shared" : ""
|
64
|
+
guiflags = options[:gui] ? "-mwindows" : ""
|
65
|
+
dldflags = options[:isdll] ? "-Wl,--enable-auto-image-base,--enable-auto-import,--export-all" : ""
|
66
|
+
impflags = options[:implib] ? "-Wl,--out-implib=#{options[:implib]}" : ""
|
67
|
+
rubylib = (options[:rubylib] || C.rubylib)
|
68
|
+
libs = C.libs
|
69
|
+
cmdline = "#{cc} #{cflags} #{ldflags} #{dllflags} #{guiflags} #{dldflags} #{impflags} -s -o #{target} #{sources.join(' ')} #{rubylib} #{libs}"
|
70
|
+
file target => sources + Array(options[:dependencies]) do
|
71
|
+
mkdir_p File.dirname(options[:implib]) if options[:implib]
|
72
|
+
mkdir_p File.dirname(target)
|
73
|
+
sh cmdline
|
74
|
+
sh "strip -R .reloc #{target}" unless options[:isdll]
|
75
|
+
end
|
76
|
+
file options[:implib] => target if options[:implib]
|
77
|
+
end
|
78
|
+
|
79
|
+
# FIXME: is not mapping all the exports
|
80
|
+
def make_def_proxy(target, source, proxy)
|
81
|
+
file target => source do
|
82
|
+
mkdir_p File.dirname(target)
|
83
|
+
File.open(target, "w") do |out|
|
84
|
+
File.open(source, "r").each_line do |line|
|
85
|
+
case line
|
86
|
+
when /\A\s*(LIBRARY|EXPORTS)/
|
87
|
+
out.puts line
|
88
|
+
when /\A(\s*)(\w+@\w+)=(rb_w32_\w+@.*)\Z/
|
89
|
+
out.puts "#{$1}#{$2} = #{proxy}.#{$3}"
|
90
|
+
when /\A(\s*)(\w+)=(rb_w32_\w+)\Z/
|
91
|
+
out.puts "#{$1}#{$2} = #{proxy}.#{$3}"
|
92
|
+
when /\A(\s*)(\w+@\w+)(\s+@.*)\Z/
|
93
|
+
out.puts "#{$1}#{$2} = #{proxy}.#{$2}#{$3}"
|
94
|
+
when /\A(\s*)(\w+)(\s+@.*)\Z/
|
95
|
+
out.puts "#{$1}#{$2} = #{proxy}.#{$2}#{$3}"
|
96
|
+
else
|
97
|
+
out.puts line
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
def make_def(target, source_lib)
|
105
|
+
file target => [source_lib] do
|
106
|
+
mkdir_p File.dirname(target)
|
107
|
+
|
108
|
+
puts "generating #{target}"
|
109
|
+
exports = Exports.extract([source_lib])
|
110
|
+
Exports.output(target) { |f| f.puts(*exports) }
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
def make_config(target, libruby_name, libruby_so)
|
115
|
+
file target do
|
116
|
+
puts "generating header #{target}"
|
117
|
+
File.open(target, "w") do |f|
|
118
|
+
f.write <<-EOH.gsub(/^\s+/, '')
|
119
|
+
#ifndef _EXERB_CONFIG_H_
|
120
|
+
#define _EXERB_CONFIG_H_
|
121
|
+
|
122
|
+
#define EXERB_LIBRUBY_NAME "#{libruby_name}"
|
123
|
+
#define EXERB_LIBRUBY_SO "#{libruby_so}"
|
124
|
+
|
125
|
+
#endif /* _EXERB_CONFIG_H_ */
|
126
|
+
EOH
|
127
|
+
end
|
128
|
+
end
|
129
|
+
CLEAN.include target
|
130
|
+
end
|
131
|
+
|
132
|
+
# Ruby 1.9.1 doesn't have SyncEnumerator
|
133
|
+
# This function is inspired by Python's zip
|
134
|
+
def zip(*enums)
|
135
|
+
r = block_given? ? nil : []
|
136
|
+
len = enums.collect { |x| x.size }.max
|
137
|
+
len.times do |i|
|
138
|
+
val = enums.collect { |x| x[i] }
|
139
|
+
if block_given?
|
140
|
+
yield val
|
141
|
+
else
|
142
|
+
r << val
|
143
|
+
end
|
144
|
+
end
|
145
|
+
r
|
146
|
+
end
|
147
|
+
|
148
|
+
exerb_dll_base = "exerb53"
|
149
|
+
exerb_config_header = "src/exerb/config.h"
|
150
|
+
file_resource_rc = "src/exerb/resource.rc"
|
151
|
+
file_resource_dll_o = "tmp/resource_dll.o"
|
152
|
+
file_resource_cui_o = "tmp/resource_cui.o"
|
153
|
+
file_resource_gui_o = "tmp/resource_gui.o"
|
154
|
+
file_exerb_def = "tmp/#{exerb_dll_base}.def"
|
155
|
+
file_exerb_lib = "tmp/#{exerb_dll_base}.dll.a"
|
156
|
+
file_exerb_rt_def = "tmp/#{exerb_dll_base}_rt.def"
|
157
|
+
file_exerb_dll = "data/exerb/#{exerb_dll_base}.dll"
|
158
|
+
file_ruby_cui = "data/exerb/ruby#{C.ver}c.exc"
|
159
|
+
file_ruby_cui_rt = "data/exerb/ruby#{C.ver}crt.exc"
|
160
|
+
file_ruby_gui = "data/exerb/ruby#{C.ver}g.exc"
|
161
|
+
file_ruby_gui_rt = "data/exerb/ruby#{C.ver}grt.exc"
|
162
|
+
|
163
|
+
lib_sources = Dir["src/exerb/{exerb,module,utility,patch}.c"]
|
164
|
+
dll_sources = [file_resource_dll_o]
|
165
|
+
cui_sources = ["src/exerb/cui.c", file_resource_cui_o]
|
166
|
+
gui_sources = ["src/exerb/gui.c", file_resource_gui_o]
|
167
|
+
|
168
|
+
make_resource file_resource_dll_o, file_resource_rc, "RUNTIME"
|
169
|
+
|
170
|
+
make_config exerb_config_header, c["RUBY_SO_NAME"], c["LIBRUBY_SO"]
|
171
|
+
|
172
|
+
make_def file_exerb_def, File.join(c["libdir"], c["LIBRUBY_A"])
|
173
|
+
make_def_proxy file_exerb_rt_def, file_exerb_def, exerb_dll_base
|
174
|
+
|
175
|
+
link_cpp file_exerb_dll, :sources => (dll_sources + lib_sources + [file_exerb_def]), :dependencies => exerb_config_header, :isdll => true, :implib => file_exerb_lib
|
176
|
+
|
177
|
+
make_resource file_resource_cui_o, file_resource_rc, "CUI"
|
178
|
+
link_cpp file_ruby_cui, :sources => (cui_sources + lib_sources + [file_exerb_def]), :dependencies => exerb_config_header
|
179
|
+
link_cpp file_ruby_cui_rt, :sources => (cui_sources + [file_exerb_lib]), :rubylib => "", :dependencies => exerb_config_header
|
180
|
+
|
181
|
+
make_resource file_resource_gui_o, file_resource_rc, "GUI"
|
182
|
+
link_cpp file_ruby_gui, :sources => (gui_sources + lib_sources + [file_exerb_def]), :gui => true, :dependencies => exerb_config_header
|
183
|
+
link_cpp file_ruby_gui_rt, :sources => (gui_sources + [file_exerb_lib]), :rubylib => "", :gui => true, :dependencies => exerb_config_header
|
184
|
+
|
185
|
+
task :rm_tmp do
|
186
|
+
FileUtils.rm_rf('tmp') if File.directory?('tmp')
|
187
|
+
end
|
188
|
+
|
189
|
+
desc "generate cui and gui exa data"
|
190
|
+
task :generate => [
|
191
|
+
file_ruby_cui,
|
192
|
+
file_ruby_cui_rt,
|
193
|
+
file_ruby_gui,
|
194
|
+
file_ruby_gui_rt,
|
195
|
+
:rm_tmp
|
196
|
+
]
|
197
|
+
|
198
|
+
desc "show infomation"
|
199
|
+
task :default do
|
200
|
+
puts "Please use 'gem' to build and install gem."
|
201
|
+
puts " This Rakefile used by generate data."
|
202
|
+
end
|
203
|
+
|
204
|
+
CLEAN.include('tmp')
|
205
|
+
CLOBBER.include('data')
|
data/bin/exerb
ADDED
@@ -0,0 +1,185 @@
|
|
1
|
+
#! G:/Ruby193/bin/ruby.exe
|
2
|
+
|
3
|
+
#==============================================================================#
|
4
|
+
# $Id: exerb,v 1.36 2008/06/13 23:54:45 arton Exp $
|
5
|
+
#==============================================================================#
|
6
|
+
|
7
|
+
require 'getoptlong'
|
8
|
+
require 'exerb/version'
|
9
|
+
require 'exerb/config'
|
10
|
+
require 'exerb/recipe'
|
11
|
+
require 'exerb/executable'
|
12
|
+
|
13
|
+
#==============================================================================#
|
14
|
+
|
15
|
+
module ExerbCommand
|
16
|
+
|
17
|
+
OPTIONS = [
|
18
|
+
['--corename', '-c', GetoptLong::REQUIRED_ARGUMENT, 'specifies exerb-core by defined name.'],
|
19
|
+
['--corefile', '-C', GetoptLong::REQUIRED_ARGUMENT, 'specifies exerb-core by path.'],
|
20
|
+
['--outfile', '-o', GetoptLong::REQUIRED_ARGUMENT, 'specifies output file.'],
|
21
|
+
['--kcode', '-k', GetoptLong::REQUIRED_ARGUMENT, 'specifies character code-set. (none/euc/sjis/utf8)'],
|
22
|
+
['--archive', '-a', GetoptLong::NO_ARGUMENT, 'create an archive only.'],
|
23
|
+
['--verbose', '-v', GetoptLong::NO_ARGUMENT, 'enable verbose mode.'],
|
24
|
+
# ['--debug', '-g', GetoptLong::NO_ARGUMENT, 'enable debug mode.'],
|
25
|
+
['--execute', '-e', GetoptLong::NO_ARGUMENT, 'execute an executable file after creation.'],
|
26
|
+
['--config', '-i', GetoptLong::NO_ARGUMENT, 'display config information.'],
|
27
|
+
['--version', '-V', GetoptLong::NO_ARGUMENT, 'display version number.'],
|
28
|
+
['--help', '-h', GetoptLong::NO_ARGUMENT, 'display this information.'],
|
29
|
+
]
|
30
|
+
|
31
|
+
def self.main(argv)
|
32
|
+
options = self.parse_options(argv)
|
33
|
+
|
34
|
+
self.print_config_and_exit if options[:config]
|
35
|
+
self.print_version_and_exit if options[:version]
|
36
|
+
self.print_usage_and_exit if options[:help] || argv.size < 1
|
37
|
+
|
38
|
+
arg_fname = argv.shift
|
39
|
+
arg_kcode = options[:kcode]
|
40
|
+
arg_core = options[:corefile]
|
41
|
+
arg_core ||= Exerb::Utility.find_core_by_name(options[:corename], true) if options[:corename]
|
42
|
+
|
43
|
+
recipe =
|
44
|
+
if /\.rbw?$/i =~ arg_fname
|
45
|
+
path1 = File.expand_path('../../lib', __FILE__)
|
46
|
+
system(Gem.ruby, "-I#{path1}", "-rexerb/mkexy", arg_fname)
|
47
|
+
Exerb::Recipe.load(arg_fname.chomp(File.extname(arg_fname)) + '.exy')
|
48
|
+
else
|
49
|
+
Exerb::Recipe.load(arg_fname)
|
50
|
+
end
|
51
|
+
|
52
|
+
# FIXME: arg priority
|
53
|
+
archive = recipe.create_archive(arg_kcode)
|
54
|
+
core_file = recipe.core_filepath(arg_core)
|
55
|
+
output_file = recipe.output_filepath(options[:outfile])
|
56
|
+
archive_file = recipe.archive_filepath(options[:outfile])
|
57
|
+
|
58
|
+
raise(Exerb::ExerbError, "a core file isn't specified") if core_file.nil?
|
59
|
+
raise(Exerb::ExerbError, "no such file -- #{core_file}") unless File.exist?(core_file)
|
60
|
+
raise(Exerb::ExerbError, "no such directory -- #{File.dirname(output_file)}") unless File.directory?(File.dirname(output_file))
|
61
|
+
|
62
|
+
if options[:verbose]
|
63
|
+
puts("Recipe File : #{arg_fname}")
|
64
|
+
puts("Core File : #{core_file}")
|
65
|
+
puts("Archive File : #{archive_file}") if options[:archive]
|
66
|
+
puts("Output File : #{output_file}")
|
67
|
+
end
|
68
|
+
|
69
|
+
if options[:archive]
|
70
|
+
archive.write_to_file(archive_file)
|
71
|
+
else
|
72
|
+
executable = Exerb::Executable.read(core_file)
|
73
|
+
executable.rsrc.add_archive(archive)
|
74
|
+
recipe.update_resource(executable.rsrc)
|
75
|
+
executable.write(output_file)
|
76
|
+
|
77
|
+
exec(File.expand_path(output_file)) if options[:execute]
|
78
|
+
end
|
79
|
+
|
80
|
+
exit(0)
|
81
|
+
rescue Exerb::ExerbError => e
|
82
|
+
STDERR.puts("exerb: #{e.message}")
|
83
|
+
exit(1)
|
84
|
+
end
|
85
|
+
|
86
|
+
def self.parse_options(argv)
|
87
|
+
options = {}
|
88
|
+
config = OPTIONS.collect { |ary| ary[0, 3] }
|
89
|
+
|
90
|
+
parser = GetoptLong.new
|
91
|
+
parser.set_options(*config)
|
92
|
+
parser.each_option { |name, argument|
|
93
|
+
options[name.sub(/^--/, '').intern] = argument
|
94
|
+
}
|
95
|
+
|
96
|
+
options[:archive] = !!options[:archive]
|
97
|
+
options[:verbose] = !!options[:verbose]
|
98
|
+
# options[:debug] = !!options[:debug]
|
99
|
+
options[:execute] = !!options[:execute]
|
100
|
+
options[:config] = !!options[:config]
|
101
|
+
options[:version] = !!options[:version]
|
102
|
+
options[:help] = !!options[:help]
|
103
|
+
|
104
|
+
return options
|
105
|
+
rescue GetoptLong::InvalidOption
|
106
|
+
exit(1)
|
107
|
+
end
|
108
|
+
|
109
|
+
def self.print_config_and_exit
|
110
|
+
puts "Exerb #{Exerb::VERSION}"
|
111
|
+
|
112
|
+
puts
|
113
|
+
puts "Search directories of Ruby library:"
|
114
|
+
$LOAD_PATH.each { |path| printf(" %s\n", File.expand_path(path)) }
|
115
|
+
|
116
|
+
puts
|
117
|
+
puts "Search directories of Exerb core:"
|
118
|
+
Exerb::CORE_PATH.each { |path| printf(" %s\n", File.expand_path(path)) }
|
119
|
+
|
120
|
+
name_max = Exerb::CORE_NAME.keys.collect { |name| name.size }.max
|
121
|
+
|
122
|
+
puts
|
123
|
+
puts "Defined names of Exerb core:"
|
124
|
+
Exerb::CORE_NAME.keys.sort.each { |name|
|
125
|
+
filename = Exerb::Utility.find_core_by_name(name)
|
126
|
+
message = (filename.nil? ? " (not found in search directories)" : "")
|
127
|
+
printf(" %s => %s%s\n", name.ljust(name_max), Exerb::CORE_NAME[name], message)
|
128
|
+
}
|
129
|
+
|
130
|
+
exit(1)
|
131
|
+
end
|
132
|
+
|
133
|
+
def self.print_version_and_exit
|
134
|
+
puts "Exerb #{Exerb::VERSION}"
|
135
|
+
exit(1)
|
136
|
+
end
|
137
|
+
|
138
|
+
def self.print_usage_and_exit
|
139
|
+
puts("Exerb #{Exerb::VERSION}")
|
140
|
+
|
141
|
+
puts
|
142
|
+
puts("Usage: exerb [options] {script-file|recipe-file}")
|
143
|
+
|
144
|
+
puts
|
145
|
+
puts("Options:")
|
146
|
+
OPTIONS.each { |long, short, arg, comment|
|
147
|
+
printf(" %s %-10s %s\n", short, long, comment)
|
148
|
+
}
|
149
|
+
|
150
|
+
exit(1)
|
151
|
+
end
|
152
|
+
|
153
|
+
=begin
|
154
|
+
def self.make_filename(filename, extension)
|
155
|
+
return filename.sub(/(\.exr$|$)/i, '.' + extension)
|
156
|
+
end
|
157
|
+
|
158
|
+
def self.select_core_file(options, recipe)
|
159
|
+
core_file = options[:corefile]
|
160
|
+
core_file ||= Exerb::Utility.find_core_by_name(options[:corename], true) if options[:corename]
|
161
|
+
core_file ||= recipe.corefile
|
162
|
+
core_file ||= Exerb::Utility.find_core_by_name('cui')
|
163
|
+
core_file ||= Exerb::Utility.find_core_by_name('gui')
|
164
|
+
core_file ||= raise(Exerb::ExerbError, "a core file isn't specified in the recipe file and command line options.")
|
165
|
+
|
166
|
+
return core_file
|
167
|
+
end
|
168
|
+
|
169
|
+
def self.select_out_file(options, recipe, recipe_file)
|
170
|
+
out_file = options[:outfile]
|
171
|
+
out_file ||= recipe.outfile
|
172
|
+
out_file ||= self.make_filename(recipe_file, 'exe')
|
173
|
+
|
174
|
+
return out_file
|
175
|
+
end
|
176
|
+
=end
|
177
|
+
|
178
|
+
end
|
179
|
+
|
180
|
+
#==============================================================================#
|
181
|
+
|
182
|
+
ExerbCommand.main(ARGV)
|
183
|
+
|
184
|
+
#==============================================================================#
|
185
|
+
#==============================================================================#
|
data/bin/mkexy
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
#! G:/Ruby193/bin/ruby.exe
|
2
|
+
|
3
|
+
#==============================================================================#
|
4
|
+
# $Id: mkexy,v 1.4 2008/06/13 23:54:45 arton Exp $
|
5
|
+
#==============================================================================#
|
6
|
+
|
7
|
+
require 'rubygems'
|
8
|
+
require 'optparse'
|
9
|
+
|
10
|
+
path1 = File.expand_path('../../lib', __FILE__)
|
11
|
+
ENV['old_exy'] = nil
|
12
|
+
ENV['exy_zipd'] = nil
|
13
|
+
|
14
|
+
OptionParser.new do |opts|
|
15
|
+
opts.banner = "MKEXY from ruby source file generate exy file\n\n" +
|
16
|
+
"Usage:\n" +
|
17
|
+
" mkexy [mkexy_options] [-- ruby_options] ruby_script ===(same as)\n" +
|
18
|
+
" ruby -r exerb/mkexy [ ruby_options] ruby_script\n"
|
19
|
+
|
20
|
+
opts.separator ""
|
21
|
+
opts.separator "mkexy specific options:"
|
22
|
+
|
23
|
+
opts.on("-o", "--old xxx.exy", "from old EXY file find core/resource/path info") do |exy|
|
24
|
+
ENV['old_exy'] = exy
|
25
|
+
end
|
26
|
+
|
27
|
+
opts.on("-c", "--compress", "use zlib deflate ruby source file") do |zipd|
|
28
|
+
ENV['exy_zipd'] = 'true'
|
29
|
+
end
|
30
|
+
|
31
|
+
opts.on("-h", "--help", "Show this message") do |v|
|
32
|
+
puts opts
|
33
|
+
exit 0
|
34
|
+
end
|
35
|
+
|
36
|
+
opts.on("-v", "--version", "Show version") do |v|
|
37
|
+
require "#{path1}/exerb/version"
|
38
|
+
puts "mkexy version: #{Exerb::VERSION}"
|
39
|
+
exit 0
|
40
|
+
end
|
41
|
+
end.parse!
|
42
|
+
|
43
|
+
|
44
|
+
exec(Gem.ruby, *(["-I#{path1}", "-rexerb/mkexy"] + ARGV))
|
45
|
+
|
46
|
+
#==============================================================================#
|
47
|
+
#==============================================================================#
|