ocra 1.1.5.pre2 → 1.1.5.pre3
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +10 -0
- data/README.txt +27 -16
- data/bin/ocra +138 -87
- data/lib/ocra.rb +1 -1
- data/share/ocra/edicon.exe +0 -0
- data/share/ocra/stub.exe +0 -0
- data/share/ocra/stubw.exe +0 -0
- data/test/test_ocra.rb +153 -79
- metadata +4 -4
data/History.txt
CHANGED
@@ -17,6 +17,16 @@
|
|
17
17
|
include all files listed in the Gem specification (Thanks to Jorge
|
18
18
|
L. Cangas for patch & ideas).
|
19
19
|
|
20
|
+
* NameErrors are now rescued when attempting to load autoloadable
|
21
|
+
constants. Hopefully resolves issues with ActiveRecord [#28488].
|
22
|
+
|
23
|
+
* Now works if the script changes environment or working directory
|
24
|
+
while running.
|
25
|
+
|
26
|
+
* Fixed a regression in 1.1.4 when resource files are specified;
|
27
|
+
directory layout would not be maintained, e.g. when running "ocra
|
28
|
+
bin/script share/data.dat".
|
29
|
+
|
20
30
|
=== 1.1.4
|
21
31
|
|
22
32
|
* The tempdir marker is now pretty-printed as "<tempdir>" in the
|
data/README.txt
CHANGED
@@ -23,11 +23,6 @@ the tracker on the RubyForge project page
|
|
23
23
|
http://rubyforge.org/projects/ocra/. You are welcome to ask questions
|
24
24
|
in the forums there aswell.
|
25
25
|
|
26
|
-
== TODO:
|
27
|
-
|
28
|
-
* Support for packaging gems that need extra non-ruby files
|
29
|
-
(e.g. mime-types, prawn).
|
30
|
-
|
31
26
|
== SYNOPSIS:
|
32
27
|
|
33
28
|
ocra [option] script.rb
|
@@ -80,7 +75,6 @@ in the forums there aswell.
|
|
80
75
|
|
81
76
|
* Avoid absolute paths in your code and when invoking OCRA.
|
82
77
|
|
83
|
-
|
84
78
|
== REQUIREMENTS:
|
85
79
|
|
86
80
|
* Windows
|
@@ -119,7 +113,18 @@ your application will be put in the 'src' subdirectory.
|
|
119
113
|
|
120
114
|
=== Libraries
|
121
115
|
|
122
|
-
|
116
|
+
Any code that is loaded through Kernel#require when your script is
|
117
|
+
executed will be included in the OCRA executable. Conditionally loaded
|
118
|
+
code will not be loaded and included in the executable unless the code
|
119
|
+
is actually run when OCRA invokes your script. Otherwise, OCRA won't
|
120
|
+
know about it and will not include the source files.
|
121
|
+
|
122
|
+
RubyGems are handled specially. Whenever a file from a Gem is
|
123
|
+
detected, OCRA will attempt to include all the files from that
|
124
|
+
specific Gem (all files listed in the manifest), expect some unlikely
|
125
|
+
needed files such as readme's and other documentation. This can be
|
126
|
+
overruled using the '--no-gem-filter' which will make OCRA include
|
127
|
+
every file that is listed in the Gem's manifest.
|
123
128
|
|
124
129
|
Libraries found in non-standard path (for example, if you invoke OCRA
|
125
130
|
with "ruby -I some/path") will be placed into the site dir
|
@@ -128,13 +133,13 @@ with "ruby -I some/path") will be placed into the site dir
|
|
128
133
|
tree, since OCRA may place the files elsewhere when extracted into the
|
129
134
|
temporary directory.
|
130
135
|
|
131
|
-
|
132
|
-
|
133
|
-
|
136
|
+
In case your script (or any of its dependencies) sets up autoloaded
|
137
|
+
module using Kernel#autoload, OCRA will automatically try to load them
|
138
|
+
to ensure that they are all included in the executable. Modules that
|
139
|
+
doesn't exist will be ignored (a warning will be logged).
|
134
140
|
|
135
|
-
|
136
|
-
|
137
|
-
script.
|
141
|
+
Dynamic link libraries (.dll files, for example WxWidgets, or other
|
142
|
+
source files) will be detected and included by OCRA.
|
138
143
|
|
139
144
|
=== Environment variables
|
140
145
|
|
@@ -154,13 +159,16 @@ executable, for example
|
|
154
159
|
|
155
160
|
=== Working directory
|
156
161
|
|
162
|
+
The OCRA executable does not change the working directory when it is
|
163
|
+
launched.
|
164
|
+
|
157
165
|
You should not assume that the current working directory when invoking
|
158
166
|
an executable built with .exe is the location of the source script. It
|
159
167
|
can be the directory where the executable is placed (when invoked
|
160
168
|
through the Windows Explorer), the users' current working directory
|
161
|
-
(when invoking from the Command Prompt), or even
|
162
|
-
when the executable is invoked through
|
163
|
-
optionally change the directory yourself:
|
169
|
+
(when invoking from the Command Prompt), or even
|
170
|
+
<tt>C:\\WINDOWS\\SYSTEM32</tt> when the executable is invoked through
|
171
|
+
a file association. You can optionally change the directory yourself:
|
164
172
|
|
165
173
|
Dir.chdir File.dirname($0)
|
166
174
|
|
@@ -214,6 +222,9 @@ of files, for example
|
|
214
222
|
|
215
223
|
=== Window/Console
|
216
224
|
|
225
|
+
By default, OCRA builds console application from .rb-files and
|
226
|
+
windowed applications (without console window) from .rbw-files.
|
227
|
+
|
217
228
|
Ruby on Windows provides two executables: ruby.exe is a console mode
|
218
229
|
application and rubyw.exe is a windowed application which does not
|
219
230
|
bring up a console window when launched using the Windows Explorer.
|
data/bin/ocra
CHANGED
@@ -11,7 +11,7 @@ module Ocra
|
|
11
11
|
OP_SETENV = 5
|
12
12
|
OP_POST_CREATE_PROCESS = 6
|
13
13
|
|
14
|
-
VERSION = "1.1.5.
|
14
|
+
VERSION = "1.1.5.pre3"
|
15
15
|
|
16
16
|
IGNORE_MODULES = /^enumerator.so$/
|
17
17
|
|
@@ -32,63 +32,76 @@ module Ocra
|
|
32
32
|
|
33
33
|
TEMPDIR_MARKER = "\xFF"
|
34
34
|
|
35
|
+
@options = {
|
36
|
+
:lzma_mode => true,
|
37
|
+
:extra_dlls => [],
|
38
|
+
:files => [],
|
39
|
+
:load_autoload => true,
|
40
|
+
:force_windows => false,
|
41
|
+
:force_console => false,
|
42
|
+
:icon_filename => nil,
|
43
|
+
:quiet => false,
|
44
|
+
:autodll => true,
|
45
|
+
:show_warnings => true,
|
46
|
+
:gem_filter => true
|
47
|
+
}
|
48
|
+
|
49
|
+
@options.each_key { |opt| eval("def self.#{opt}; @options[:#{opt}]; end") }
|
50
|
+
|
35
51
|
class << self
|
36
|
-
attr_accessor :lzma_mode
|
37
|
-
attr_accessor :extra_dlls
|
38
|
-
attr_accessor :files
|
39
|
-
attr_accessor :load_autoload
|
40
|
-
attr_accessor :force_windows
|
41
|
-
attr_accessor :force_console
|
42
|
-
attr_accessor :icon_filename
|
43
|
-
attr_accessor :quiet
|
44
|
-
attr_accessor :autodll
|
45
|
-
attr_accessor :show_warnings
|
46
|
-
attr_accessor :gem_filter
|
47
|
-
|
48
52
|
attr_reader :lzmapath
|
49
53
|
attr_reader :ediconpath
|
50
54
|
attr_reader :stubimage
|
51
55
|
attr_reader :stubwimage
|
52
|
-
|
53
|
-
def get_next_embedded_image
|
54
|
-
DATA.read(DATA.readline.to_i).unpack("m")[0]
|
55
|
-
end
|
56
56
|
end
|
57
57
|
|
58
|
-
|
58
|
+
# Returns a binary blob store embedded in the current Ruby script.
|
59
|
+
def get_next_embedded_image
|
60
|
+
DATA.read(DATA.readline.to_i).unpack("m")[0]
|
61
|
+
end
|
62
|
+
|
63
|
+
def Ocra.dospath(path)
|
64
|
+
path.tr('/','\\')
|
65
|
+
end
|
66
|
+
|
67
|
+
def Ocra.posixpath(path)
|
68
|
+
path.tr('\\','/')
|
69
|
+
end
|
70
|
+
|
71
|
+
def Ocra.save_environment
|
59
72
|
@load_path_before = $LOAD_PATH.dup
|
60
|
-
|
73
|
+
@pwd_before = Dir.pwd
|
74
|
+
@env_before = {}; ENV.each { |key, value| @env_before[key] = value }
|
75
|
+
end
|
76
|
+
|
77
|
+
def Ocra.restore_environment
|
78
|
+
@env_before.each { |key, value| ENV[key] = value }
|
79
|
+
ENV.each_key { |key| ENV.delete(key) unless @env_before.has_key?(key) }
|
80
|
+
Dir.chdir @pwd_before
|
81
|
+
end
|
82
|
+
|
83
|
+
def Ocra.find_stubs
|
61
84
|
if defined?(DATA)
|
62
85
|
@stubimage = get_next_embedded_image
|
63
86
|
@stubwimage = get_next_embedded_image
|
64
87
|
lzmaimage = get_next_embedded_image
|
65
|
-
@lzmapath = File.join(ENV['TEMP'], 'lzma.exe')
|
88
|
+
@lzmapath = File.join(ENV['TEMP'], 'lzma.exe')
|
66
89
|
File.open(@lzmapath, "wb") { |file| file << lzmaimage }
|
67
90
|
ediconimage = get_next_embedded_image
|
68
|
-
@ediconpath = File.join(ENV['TEMP'], 'edicon.exe')
|
91
|
+
@ediconpath = File.join(ENV['TEMP'], 'edicon.exe')
|
69
92
|
File.open(@ediconpath, "wb") { |file| file << ediconimage }
|
70
93
|
else
|
71
94
|
ocrapath = File.dirname(__FILE__)
|
72
95
|
@stubimage = File.open(File.join(ocrapath, '../share/ocra/stub.exe'), "rb") { |file| file.read }
|
73
96
|
@stubwimage = File.open(File.join(ocrapath, '../share/ocra/stubw.exe'), "rb") { |file| file.read }
|
74
|
-
@lzmapath = File.expand_path('../share/ocra/lzma.exe', ocrapath)
|
75
|
-
@ediconpath = File.expand_path('../share/ocra/edicon.exe', ocrapath)
|
97
|
+
@lzmapath = File.expand_path('../share/ocra/lzma.exe', ocrapath)
|
98
|
+
@ediconpath = File.expand_path('../share/ocra/edicon.exe', ocrapath)
|
76
99
|
end
|
100
|
+
@lzmapath = Ocra.dospath(@lzmapath)
|
101
|
+
@ediconpath = Ocra.dospath(@ediconpath)
|
77
102
|
end
|
78
103
|
|
79
104
|
def Ocra.parseargs(argv)
|
80
|
-
lzma_mode = true
|
81
|
-
extra_dlls = []
|
82
|
-
files = []
|
83
|
-
load_autoload = true
|
84
|
-
force_windows = false
|
85
|
-
force_console = false
|
86
|
-
icon_filename = nil
|
87
|
-
quiet = false
|
88
|
-
autodll = true
|
89
|
-
show_warnings = true
|
90
|
-
gem_filter = true
|
91
|
-
|
92
105
|
usage = <<EOF
|
93
106
|
ocra [options] script.rb
|
94
107
|
|
@@ -107,34 +120,34 @@ EOF
|
|
107
120
|
while arg = argv.shift
|
108
121
|
case arg
|
109
122
|
when /\A--(no-)?lzma\z/
|
110
|
-
lzma_mode = !$1
|
123
|
+
@options[:lzma_mode] = !$1
|
111
124
|
when /\A--dll\z/
|
112
|
-
extra_dlls << argv.shift
|
125
|
+
@options[:extra_dlls] << argv.shift
|
113
126
|
when /\A--quiet\z/
|
114
|
-
quiet = true
|
127
|
+
@options[:quiet] = true
|
115
128
|
when /\A--windows\z/
|
116
|
-
force_windows = true
|
129
|
+
@options[:force_windows] = true
|
117
130
|
when /\A--console\z/
|
118
|
-
force_console = true
|
131
|
+
@options[:force_console] = true
|
119
132
|
when /\A--no-autoload\z/
|
120
|
-
load_autoload = false
|
133
|
+
@options[:load_autoload] = false
|
121
134
|
when /\A--icon\z/
|
122
|
-
icon_filename = argv.shift
|
135
|
+
@options[:icon_filename] = argv.shift
|
123
136
|
raise "Icon file #{icon_filename} not found.\n" unless File.exist?(icon_filename)
|
124
137
|
when /\A--no-autodll\z/
|
125
|
-
autodll = false
|
138
|
+
@options[:autodll] = false
|
126
139
|
when /\A--version\z/
|
127
140
|
puts "Ocra #{VERSION}"
|
128
141
|
exit
|
129
142
|
when /\A--no-warnings\z/
|
130
|
-
show_warnings = false
|
143
|
+
@options[:show_warnings] = false
|
131
144
|
when /\A--no-gem-filter\z/
|
132
|
-
gem_filter = false
|
145
|
+
@options[:gem_filter] = false
|
133
146
|
when /\A--help\z/, /\A--/
|
134
147
|
puts usage
|
135
148
|
exit
|
136
149
|
else
|
137
|
-
files << arg
|
150
|
+
@options[:files] << arg
|
138
151
|
end
|
139
152
|
end
|
140
153
|
|
@@ -142,23 +155,12 @@ EOF
|
|
142
155
|
puts usage
|
143
156
|
exit
|
144
157
|
end
|
145
|
-
|
146
|
-
@lzma_mode = lzma_mode
|
147
|
-
@extra_dlls = extra_dlls
|
148
|
-
@quiet = quiet
|
149
|
-
@force_windows = force_windows
|
150
|
-
@force_console = force_console
|
151
|
-
@load_autoload = load_autoload
|
152
|
-
@icon_filename = icon_filename
|
153
|
-
@autodll = autodll
|
154
|
-
@files = files
|
155
|
-
@show_warnings = show_warnings
|
156
|
-
@gem_filter = gem_filter
|
157
158
|
end
|
158
159
|
|
159
160
|
def Ocra.init(argv)
|
161
|
+
save_environment
|
160
162
|
parseargs(argv)
|
161
|
-
|
163
|
+
find_stubs
|
162
164
|
end
|
163
165
|
|
164
166
|
# Force loading autoloaded constants. Searches through all modules
|
@@ -178,6 +180,8 @@ EOF
|
|
178
180
|
if mod.autoload?(const)
|
179
181
|
begin
|
180
182
|
mod.const_get(const)
|
183
|
+
rescue NameError
|
184
|
+
puts "=== WARNING: #{mod}::#{const} was defined autoloadable, but caused NameError" if Ocra.show_warnings
|
181
185
|
rescue LoadError
|
182
186
|
puts "=== WARNING: #{mod}::#{const} was not loadable" if Ocra.show_warnings
|
183
187
|
end
|
@@ -187,6 +191,9 @@ EOF
|
|
187
191
|
end
|
188
192
|
end
|
189
193
|
|
194
|
+
# Compute the relative path from the 'src' path (directory) to 'tgt'
|
195
|
+
# (directory or file). Return the absolute path to 'tgt' if it can't
|
196
|
+
# be reached from 'src'.
|
190
197
|
def Ocra.relative_path(src, tgt)
|
191
198
|
a = src.split('/')
|
192
199
|
b = tgt.split('/')
|
@@ -202,11 +209,14 @@ EOF
|
|
202
209
|
# Determines if 'src' is contained in 'tgt' (i.e. it is a subpath of
|
203
210
|
# 'tgt'). Both must be absolute paths and not contain '..'
|
204
211
|
def Ocra.subpath?(src, tgt)
|
205
|
-
src_normalized =
|
206
|
-
tgt_normalized =
|
212
|
+
src_normalized = Ocra.dospath(src).downcase
|
213
|
+
tgt_normalized = Ocra.dospath(tgt).downcase
|
207
214
|
src_normalized =~ /^#{Regexp.escape tgt_normalized}[\/\\]/i
|
208
215
|
end
|
209
216
|
|
217
|
+
# Guess the load path (from 'paths') that was used to load
|
218
|
+
# 'path'. This is primarily relevant on Ruby 1.8 which stores
|
219
|
+
# "unqualified" paths in $LOADED_FEATURES.
|
210
220
|
def Ocra.find_load_path(paths, path)
|
211
221
|
if path[1,1] == ":"
|
212
222
|
rps = paths.map {|p| relative_path(File.expand_path(p), path) }
|
@@ -219,6 +229,8 @@ EOF
|
|
219
229
|
|
220
230
|
def Ocra.build_exe
|
221
231
|
@added_load_paths = $LOAD_PATH - @load_path_before
|
232
|
+
|
233
|
+
restore_environment
|
222
234
|
|
223
235
|
# Attempt to autoload libraries before doing anything else.
|
224
236
|
attempt_load_autoload if Ocra.load_autoload
|
@@ -236,12 +248,38 @@ EOF
|
|
236
248
|
|
237
249
|
require 'rbconfig'
|
238
250
|
exec_prefix = RbConfig::CONFIG['exec_prefix']
|
239
|
-
src_prefix =
|
251
|
+
src_prefix = Dir.pwd
|
240
252
|
sitelibdir = RbConfig::CONFIG['sitelibdir']
|
241
253
|
bindir = RbConfig::CONFIG['bindir']
|
242
254
|
libruby_so = RbConfig::CONFIG['LIBRUBY_SO']
|
243
255
|
|
244
|
-
|
256
|
+
# Find the root of all files specified on the command line and use
|
257
|
+
# it as the "src" of the output. Adjust 'Ocra.files' to be
|
258
|
+
# relative to the resulting root.
|
259
|
+
files = Ocra.files.map { |file| Dir[Ocra.posixpath(file)] }.flatten
|
260
|
+
files = files.map { |file| File.expand_path(file) }
|
261
|
+
src_prefix = files.inject(File.dirname(files[0])) do |srcroot, path|
|
262
|
+
if subpath?(path, exec_prefix)
|
263
|
+
srcroot
|
264
|
+
else
|
265
|
+
loop do
|
266
|
+
relpath = relative_path(srcroot, path)
|
267
|
+
if relpath =~ /^[A-Z]:$/i
|
268
|
+
puts "ERROR: No common directory contains all specified files"
|
269
|
+
end
|
270
|
+
if relpath =~ /^\.\.\//
|
271
|
+
srcroot = File.dirname(srcroot)
|
272
|
+
else
|
273
|
+
break
|
274
|
+
end
|
275
|
+
end
|
276
|
+
srcroot
|
277
|
+
end
|
278
|
+
end
|
279
|
+
files = files.map { |file| relative_path(src_prefix, file) }
|
280
|
+
Ocra.files.replace(files)
|
281
|
+
|
282
|
+
instsitelibdir = relative_path(exec_prefix, sitelibdir)
|
245
283
|
|
246
284
|
load_path = []
|
247
285
|
|
@@ -260,7 +298,7 @@ EOF
|
|
260
298
|
Gem.path.each do |gempath|
|
261
299
|
geminstallpath = File.join(gempath, "gems")
|
262
300
|
if subpath?(filename, geminstallpath)
|
263
|
-
gemlocalpath = filename
|
301
|
+
gemlocalpath = relative_path(geminstallpath, filename)
|
264
302
|
fullgemname = gemlocalpath.split('/')[0]
|
265
303
|
gems << [gempath, fullgemname]
|
266
304
|
features_from_gems << filename
|
@@ -304,9 +342,9 @@ EOF
|
|
304
342
|
end
|
305
343
|
fullpath = File.expand_path(filename, path)
|
306
344
|
if subpath?(fullpath, exec_prefix)
|
307
|
-
libs << [ fullpath,
|
345
|
+
libs << [ fullpath, relative_path(exec_prefix, fullpath) ]
|
308
346
|
elsif subpath?(fullpath, src_prefix)
|
309
|
-
targetpath = "src
|
347
|
+
targetpath = File.join("src", relative_path(src_prefix, fullpath))
|
310
348
|
libs << [ fullpath, targetpath ]
|
311
349
|
if not @added_load_paths.include?(path) and not load_path.include?(path)
|
312
350
|
load_path << File.join(TEMPDIR_MARKER, File.dirname(targetpath))
|
@@ -344,8 +382,8 @@ EOF
|
|
344
382
|
puts "=== Building #{executable}" unless Ocra.quiet
|
345
383
|
OcraBuilder.new(executable, windowed) do |sb|
|
346
384
|
# Add explicitly mentioned files
|
347
|
-
|
348
|
-
file = File.
|
385
|
+
files.each do |file|
|
386
|
+
file = File.join(src_prefix, file)
|
349
387
|
|
350
388
|
if subpath?(file, exec_prefix)
|
351
389
|
target = relative_path(exec_prefix, file)
|
@@ -355,8 +393,6 @@ EOF
|
|
355
393
|
target = File.join('src', File.basename(file))
|
356
394
|
end
|
357
395
|
|
358
|
-
target.tr!('/','\\')
|
359
|
-
|
360
396
|
if File.directory?(file)
|
361
397
|
sb.ensuremkdir(target)
|
362
398
|
else
|
@@ -370,15 +406,15 @@ EOF
|
|
370
406
|
else
|
371
407
|
rubyexe = (RbConfig::CONFIG['ruby_install_name'] || "ruby") + ".exe"
|
372
408
|
end
|
373
|
-
sb.createfile(File.join(bindir, rubyexe), "bin
|
409
|
+
sb.createfile(File.join(bindir, rubyexe), File.join("bin", rubyexe))
|
374
410
|
if libruby_so
|
375
|
-
sb.createfile(File.join(bindir, libruby_so), "bin
|
411
|
+
sb.createfile(File.join(bindir, libruby_so), File.join("bin", libruby_so))
|
376
412
|
end
|
377
413
|
|
378
414
|
# Add detected DLLs
|
379
415
|
dlls.each do |dll|
|
380
|
-
if subpath?(dll
|
381
|
-
target = dll
|
416
|
+
if subpath?(dll, exec_prefix)
|
417
|
+
target = relative_path(exec_prefix, dll)
|
382
418
|
else
|
383
419
|
target = File.join('bin', File.basename(dll))
|
384
420
|
end
|
@@ -387,17 +423,17 @@ EOF
|
|
387
423
|
|
388
424
|
# Add extra DLLs
|
389
425
|
Ocra.extra_dlls.each do |dll|
|
390
|
-
sb.createfile(File.join(bindir, dll), File.join("bin", dll)
|
426
|
+
sb.createfile(File.join(bindir, dll), File.join("bin", dll))
|
391
427
|
end
|
392
428
|
|
393
429
|
# Add gemspec files
|
394
430
|
gemspecs.each do |gemspec|
|
395
431
|
if subpath?(gemspec, exec_prefix)
|
396
|
-
path = gemspec
|
397
|
-
sb.createfile(gemspec, path
|
432
|
+
path = relative_path(exec_prefix, gemspec)
|
433
|
+
sb.createfile(gemspec, path)
|
398
434
|
elsif defined?(Gem) and gemhome = Gem.path.find { |pth| subpath?(gemspec, pth) }
|
399
435
|
path = File.join('gemhome', relative_path(gemhome, gemspec))
|
400
|
-
sb.createfile(gemspec, path
|
436
|
+
sb.createfile(gemspec, path)
|
401
437
|
else
|
402
438
|
raise "#{gemspec} does not exist in the Ruby installation. Don't know where to put it."
|
403
439
|
end
|
@@ -405,7 +441,7 @@ EOF
|
|
405
441
|
|
406
442
|
# Add loaded libraries
|
407
443
|
libs.each do |path, target|
|
408
|
-
sb.createfile(path, target
|
444
|
+
sb.createfile(path, target)
|
409
445
|
end
|
410
446
|
|
411
447
|
# Set environment variable
|
@@ -414,7 +450,7 @@ EOF
|
|
414
450
|
sb.setenv('GEM_PATH', "#{TEMPDIR_MARKER}\\gemhome")
|
415
451
|
|
416
452
|
# Launch the script
|
417
|
-
sb.postcreateprocess(TEMPDIR_MARKER + "\\bin\\" + rubyexe, "#{rubyexe} \"\xff\\src\\" +
|
453
|
+
sb.postcreateprocess(TEMPDIR_MARKER + "\\bin\\" + rubyexe, "#{rubyexe} \"\xff\\src\\" + Ocra.dospath(Ocra.files[0]) + "\"")
|
418
454
|
|
419
455
|
puts "=== Compressing" unless Ocra.quiet or not Ocra.lzma_mode
|
420
456
|
end
|
@@ -452,13 +488,16 @@ EOF
|
|
452
488
|
loaded = loaded_dlls
|
453
489
|
exec_prefix = RbConfig::CONFIG['exec_prefix']
|
454
490
|
loaded.select do |path|
|
455
|
-
Ocra.subpath?(path
|
491
|
+
Ocra.subpath?(path, exec_prefix) and
|
456
492
|
File.basename(path) =~ /\.dll$/i and
|
457
493
|
File.basename(path).downcase != RbConfig::CONFIG['LIBRUBY_SO'].downcase
|
458
494
|
end
|
459
495
|
end
|
460
496
|
end
|
461
|
-
|
497
|
+
|
498
|
+
# Utility class that produces the actual executable. Opcodes
|
499
|
+
# (createfile, mkdir etc) are added by invoking methods on an
|
500
|
+
# instance of OcraBuilder.
|
462
501
|
class OcraBuilder
|
463
502
|
def initialize(path, windowed)
|
464
503
|
@paths = {}
|
@@ -507,36 +546,43 @@ EOF
|
|
507
546
|
ocrafile.write(Signature.pack("C*"))
|
508
547
|
end
|
509
548
|
end
|
549
|
+
|
510
550
|
def mkdir(path)
|
511
551
|
@paths[path.downcase] = true
|
512
552
|
puts "m #{showtempdir path}" unless Ocra.quiet
|
513
|
-
@of << [OP_CREATE_DIRECTORY, path].pack("VZ*")
|
553
|
+
@of << [OP_CREATE_DIRECTORY, Ocra.dospath(path)].pack("VZ*")
|
514
554
|
end
|
555
|
+
|
515
556
|
def ensuremkdir(tgt)
|
516
557
|
return if tgt == "."
|
517
|
-
if not @paths[tgt.downcase]
|
558
|
+
if not @paths[Ocra.posixpath(tgt.downcase)]
|
518
559
|
ensuremkdir(File.dirname(tgt))
|
519
560
|
mkdir(tgt)
|
520
561
|
end
|
521
562
|
end
|
563
|
+
|
522
564
|
def createfile(src, tgt)
|
523
565
|
ensuremkdir(File.dirname(tgt))
|
524
566
|
str = File.open(src, "rb") { |file| file.read }
|
525
567
|
puts "a #{showtempdir tgt}" unless Ocra.quiet
|
526
|
-
@of << [OP_CREATE_FILE, tgt, str.size, str].pack("VZ*VA*")
|
568
|
+
@of << [OP_CREATE_FILE, Ocra.dospath(tgt), str.size, str].pack("VZ*VA*")
|
527
569
|
end
|
570
|
+
|
528
571
|
def createprocess(image, cmdline)
|
529
572
|
puts "l #{showtempdir image} #{showtempdir cmdline}" unless Ocra.quiet
|
530
|
-
@of << [OP_CREATE_PROCESS, image, cmdline].pack("VZ*Z*")
|
573
|
+
@of << [OP_CREATE_PROCESS, Ocra.dospath(image), cmdline].pack("VZ*Z*")
|
531
574
|
end
|
575
|
+
|
532
576
|
def postcreateprocess(image, cmdline)
|
533
577
|
puts "p #{showtempdir image} #{showtempdir cmdline}" unless Ocra.quiet
|
534
|
-
@of << [OP_POST_CREATE_PROCESS, image, cmdline].pack("VZ*Z*")
|
578
|
+
@of << [OP_POST_CREATE_PROCESS, Ocra.dospath(image), cmdline].pack("VZ*Z*")
|
535
579
|
end
|
580
|
+
|
536
581
|
def setenv(name, value)
|
537
582
|
puts "e #{name} #{showtempdir value}" unless Ocra.quiet
|
538
583
|
@of << [OP_SETENV, name, value].pack("VZ*Z*")
|
539
584
|
end
|
585
|
+
|
540
586
|
def close
|
541
587
|
@of.close
|
542
588
|
end
|
@@ -552,6 +598,11 @@ end # module Ocra
|
|
552
598
|
if File.basename(__FILE__) == File.basename($0)
|
553
599
|
Ocra.init(ARGV)
|
554
600
|
ARGV.clear
|
601
|
+
|
602
|
+
if !File.exist?(Ocra.files[0])
|
603
|
+
puts "ERROR: #{Ocra.files[0]} was not found!"
|
604
|
+
exit
|
605
|
+
end
|
555
606
|
|
556
607
|
at_exit do
|
557
608
|
if $!.nil? or $!.kind_of?(SystemExit)
|
data/lib/ocra.rb
CHANGED
data/share/ocra/edicon.exe
CHANGED
Binary file
|
data/share/ocra/stub.exe
CHANGED
Binary file
|
data/share/ocra/stubw.exe
CHANGED
Binary file
|
data/test/test_ocra.rb
CHANGED
@@ -34,6 +34,17 @@ class TestOcra < Test::Unit::TestCase
|
|
34
34
|
# Path to test fixtures.
|
35
35
|
FixturePath = File.expand_path(File.join(File.dirname(__FILE__), 'fixtures'))
|
36
36
|
|
37
|
+
# Create a pristine environment to test built executables. Files are
|
38
|
+
# copied and the PATH environment is set to the minimal. Yields to
|
39
|
+
# the block, then cleans up.
|
40
|
+
def pristine_env(*files)
|
41
|
+
with_tmpdir files do
|
42
|
+
with_env "PATH" => ENV["SystemRoot"] + ";" + ENV["SystemRoot"] + "\\SYSTEM32" do
|
43
|
+
yield
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
37
48
|
attr_reader :ocra
|
38
49
|
|
39
50
|
def initialize(*args)
|
@@ -48,13 +59,11 @@ class TestOcra < Test::Unit::TestCase
|
|
48
59
|
# files located in test/fixtures.
|
49
60
|
def with_fixture(name)
|
50
61
|
path = File.join(FixturePath, name)
|
51
|
-
|
52
|
-
|
62
|
+
with_tmpdir do
|
63
|
+
cp_r path, '.'
|
53
64
|
cd name do
|
54
65
|
yield
|
55
66
|
end
|
56
|
-
ensure
|
57
|
-
rm_rf name
|
58
67
|
end
|
59
68
|
end
|
60
69
|
|
@@ -76,10 +85,11 @@ class TestOcra < Test::Unit::TestCase
|
|
76
85
|
end
|
77
86
|
end
|
78
87
|
|
79
|
-
def with_tmpdir
|
88
|
+
def with_tmpdir(files = [])
|
80
89
|
tempdirname = File.join(ENV['TEMP'], ".ocratest-#{$$}-#{rand 2**32}").tr('\\','/')
|
81
90
|
Dir.mkdir tempdirname
|
82
91
|
begin
|
92
|
+
cp files, tempdirname
|
83
93
|
FileUtils.cd tempdirname do
|
84
94
|
yield
|
85
95
|
end
|
@@ -88,35 +98,14 @@ class TestOcra < Test::Unit::TestCase
|
|
88
98
|
end
|
89
99
|
end
|
90
100
|
|
91
|
-
def with_exe(name)
|
92
|
-
orig_exe = File.expand_path(name)
|
93
|
-
with_tmpdir do
|
94
|
-
cp orig_exe, File.join('.', File.basename(name))
|
95
|
-
yield
|
96
|
-
end
|
97
|
-
end
|
98
|
-
|
99
|
-
# Test setup method. Creates a tempory directory to work in and
|
100
|
-
# changes to it.
|
101
|
-
def setup
|
102
|
-
@testnum += 1
|
103
|
-
@tempdirname = ".ocratest-#{$$}-#{@testnum}"
|
104
|
-
Dir.mkdir @tempdirname
|
105
|
-
Dir.chdir @tempdirname
|
106
|
-
end
|
107
|
-
|
108
|
-
# Test cleanup method. Exits the temporary directory and deletes it.
|
109
|
-
def teardown
|
110
|
-
Dir.chdir '..'
|
111
|
-
FileUtils.rm_rf @tempdirname
|
112
|
-
end
|
113
|
-
|
114
101
|
# Hello world test. Test that we can build and run executables.
|
115
102
|
def test_helloworld
|
116
103
|
with_fixture 'helloworld' do
|
117
104
|
assert system("ruby", ocra, "helloworld.rb", *DefaultArgs)
|
118
105
|
assert File.exist?("helloworld.exe")
|
119
|
-
|
106
|
+
pristine_env "helloworld.exe" do
|
107
|
+
assert system("helloworld.exe")
|
108
|
+
end
|
120
109
|
end
|
121
110
|
end
|
122
111
|
|
@@ -125,7 +114,9 @@ class TestOcra < Test::Unit::TestCase
|
|
125
114
|
with_fixture 'helloworld' do
|
126
115
|
assert system("ruby", ocra, "helloworld.rb", "--quiet", "--lzma")
|
127
116
|
assert File.exist?("helloworld.exe")
|
128
|
-
|
117
|
+
pristine_env "helloworld.exe" do
|
118
|
+
assert system("helloworld.exe")
|
119
|
+
end
|
129
120
|
end
|
130
121
|
end
|
131
122
|
|
@@ -134,10 +125,12 @@ class TestOcra < Test::Unit::TestCase
|
|
134
125
|
def test_writefile
|
135
126
|
with_fixture 'writefile' do
|
136
127
|
assert system("ruby", ocra, "writefile.rb", *DefaultArgs)
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
128
|
+
pristine_env "writefile.exe" do
|
129
|
+
assert File.exist?("writefile.exe")
|
130
|
+
assert system("writefile.exe")
|
131
|
+
assert File.exist?("output.txt")
|
132
|
+
assert "output", File.read("output.txt")
|
133
|
+
end
|
141
134
|
end
|
142
135
|
end
|
143
136
|
|
@@ -145,8 +138,10 @@ class TestOcra < Test::Unit::TestCase
|
|
145
138
|
def test_exitstatus
|
146
139
|
with_fixture 'exitstatus' do
|
147
140
|
assert system("ruby", ocra, "exitstatus.rb", *DefaultArgs)
|
148
|
-
|
149
|
-
|
141
|
+
pristine_env "exitstatus.exe" do
|
142
|
+
system("exitstatus.exe")
|
143
|
+
assert_equal 167, $?.exitstatus
|
144
|
+
end
|
150
145
|
end
|
151
146
|
end
|
152
147
|
|
@@ -155,8 +150,10 @@ class TestOcra < Test::Unit::TestCase
|
|
155
150
|
with_fixture 'arguments' do
|
156
151
|
assert system("ruby", ocra, "arguments.rb", *DefaultArgs)
|
157
152
|
assert File.exist?("arguments.exe")
|
158
|
-
|
159
|
-
|
153
|
+
pristine_env "arguments.exe" do
|
154
|
+
system("arguments.exe foo \"bar baz\"")
|
155
|
+
assert_equal 5, $?.exitstatus
|
156
|
+
end
|
160
157
|
end
|
161
158
|
end
|
162
159
|
|
@@ -166,9 +163,11 @@ class TestOcra < Test::Unit::TestCase
|
|
166
163
|
with_fixture 'stdoutredir' do
|
167
164
|
assert system("ruby", ocra, "stdoutredir.rb", *DefaultArgs)
|
168
165
|
assert File.exist?("stdoutredir.exe")
|
169
|
-
|
170
|
-
|
171
|
-
|
166
|
+
pristine_env "stdoutredir.exe" do
|
167
|
+
system("stdoutredir.exe > output.txt")
|
168
|
+
assert File.exist?("output.txt")
|
169
|
+
assert_equal "Hello, World!\n", File.read("output.txt")
|
170
|
+
end
|
172
171
|
end
|
173
172
|
end
|
174
173
|
|
@@ -178,8 +177,11 @@ class TestOcra < Test::Unit::TestCase
|
|
178
177
|
with_fixture 'stdinredir' do
|
179
178
|
assert system("ruby", ocra, "stdinredir.rb", *DefaultArgs)
|
180
179
|
assert File.exist?("stdinredir.exe")
|
181
|
-
system("stdinredir.exe
|
182
|
-
|
180
|
+
# Kernel.system("ruby -e \"system 'stdinredir.exe<input.txt';p $?\"")
|
181
|
+
pristine_env "stdinredir.exe", "input.txt" do
|
182
|
+
system("stdinredir.exe < input.txt")
|
183
|
+
end
|
184
|
+
assert_equal 104, $?.exitstatus
|
183
185
|
end
|
184
186
|
end
|
185
187
|
|
@@ -197,8 +199,10 @@ class TestOcra < Test::Unit::TestCase
|
|
197
199
|
with_fixture 'gdbmdll' do
|
198
200
|
assert system("ruby", ocra, "gdbmdll.rb", *args)
|
199
201
|
with_env 'PATH' => '.' do
|
200
|
-
|
201
|
-
|
202
|
+
pristine_env "gdbmdll.exe" do
|
203
|
+
system("gdbmdll.exe")
|
204
|
+
assert_equal 104, $?.exitstatus
|
205
|
+
end
|
202
206
|
end
|
203
207
|
end
|
204
208
|
end
|
@@ -210,8 +214,10 @@ class TestOcra < Test::Unit::TestCase
|
|
210
214
|
with_fixture 'relativerequire' do
|
211
215
|
assert system("ruby", ocra, "relativerequire.rb", *DefaultArgs)
|
212
216
|
assert File.exist?("relativerequire.exe")
|
213
|
-
|
214
|
-
|
217
|
+
pristine_env "relativerequire.exe" do
|
218
|
+
system("relativerequire.exe")
|
219
|
+
assert_equal 160, $?.exitstatus
|
220
|
+
end
|
215
221
|
end
|
216
222
|
end
|
217
223
|
|
@@ -222,8 +228,9 @@ class TestOcra < Test::Unit::TestCase
|
|
222
228
|
with_fixture 'autoload' do
|
223
229
|
assert system("ruby", ocra, "autoload.rb", *DefaultArgs)
|
224
230
|
assert File.exist?("autoload.exe")
|
225
|
-
|
226
|
-
|
231
|
+
pristine_env "autoload.exe" do
|
232
|
+
assert system("autoload.exe")
|
233
|
+
end
|
227
234
|
end
|
228
235
|
end
|
229
236
|
|
@@ -235,7 +242,9 @@ class TestOcra < Test::Unit::TestCase
|
|
235
242
|
args.push '--no-warnings'
|
236
243
|
assert system("ruby", ocra, "autoloadmissing.rb", *args)
|
237
244
|
assert File.exist?("autoloadmissing.exe")
|
238
|
-
|
245
|
+
pristine_env "autoloadmissing.exe" do
|
246
|
+
assert system("autoloadmissing.exe")
|
247
|
+
end
|
239
248
|
end
|
240
249
|
end
|
241
250
|
|
@@ -244,8 +253,9 @@ class TestOcra < Test::Unit::TestCase
|
|
244
253
|
with_fixture 'autoloadnested' do
|
245
254
|
assert system("ruby", ocra, "autoloadnested.rb", *DefaultArgs)
|
246
255
|
assert File.exist?("autoloadnested.exe")
|
247
|
-
|
248
|
-
|
256
|
+
pristine_env "autoloadnested.exe" do
|
257
|
+
assert system("autoloadnested.exe")
|
258
|
+
end
|
249
259
|
end
|
250
260
|
end
|
251
261
|
|
@@ -256,7 +266,9 @@ class TestOcra < Test::Unit::TestCase
|
|
256
266
|
with_fixture 'relloadpath1' do
|
257
267
|
assert system('ruby', '-I', 'lib', ocra, 'relloadpath1.rb', *DefaultArgs)
|
258
268
|
assert File.exist?('relloadpath1.exe')
|
259
|
-
|
269
|
+
pristine_env "relloadpath1.exe" do
|
270
|
+
assert system('relloadpath1.exe')
|
271
|
+
end
|
260
272
|
end
|
261
273
|
end
|
262
274
|
|
@@ -265,7 +277,9 @@ class TestOcra < Test::Unit::TestCase
|
|
265
277
|
with_fixture 'relloadpath1' do
|
266
278
|
assert system('ruby', '-I', './lib', ocra, 'relloadpath1.rb', *DefaultArgs)
|
267
279
|
assert File.exist?('relloadpath1.exe')
|
268
|
-
|
280
|
+
pristine_env "relloadpath1.exe" do
|
281
|
+
assert system('relloadpath1.exe')
|
282
|
+
end
|
269
283
|
end
|
270
284
|
end
|
271
285
|
|
@@ -277,7 +291,9 @@ class TestOcra < Test::Unit::TestCase
|
|
277
291
|
with_env 'RUBYLIB' => 'lib' do
|
278
292
|
assert system('ruby', ocra, 'relloadpath1.rb', *DefaultArgs)
|
279
293
|
assert File.exist?('relloadpath1.exe')
|
280
|
-
|
294
|
+
pristine_env "relloadpath1.exe" do
|
295
|
+
assert system('relloadpath1.exe')
|
296
|
+
end
|
281
297
|
end
|
282
298
|
end
|
283
299
|
end
|
@@ -288,7 +304,9 @@ class TestOcra < Test::Unit::TestCase
|
|
288
304
|
with_env 'RUBYLIB' => './lib' do
|
289
305
|
assert system('ruby', ocra, 'relloadpath1.rb', *DefaultArgs)
|
290
306
|
assert File.exist?('relloadpath1.exe')
|
291
|
-
|
307
|
+
pristine_env "relloadpath1.exe" do
|
308
|
+
assert system('relloadpath1.exe')
|
309
|
+
end
|
292
310
|
end
|
293
311
|
end
|
294
312
|
end
|
@@ -299,7 +317,9 @@ class TestOcra < Test::Unit::TestCase
|
|
299
317
|
cd 'src' do
|
300
318
|
assert system('ruby', '-I', '../lib', ocra, 'relloadpath2.rb', *DefaultArgs)
|
301
319
|
assert File.exist?('relloadpath2.exe')
|
302
|
-
|
320
|
+
pristine_env "relloadpath2.exe" do
|
321
|
+
assert system('relloadpath2.exe')
|
322
|
+
end
|
303
323
|
end
|
304
324
|
end
|
305
325
|
end
|
@@ -310,7 +330,9 @@ class TestOcra < Test::Unit::TestCase
|
|
310
330
|
with_fixture 'relloadpath3' do
|
311
331
|
assert system('ruby', ocra, 'relloadpath3.rb', *DefaultArgs)
|
312
332
|
assert File.exist?('relloadpath3.exe')
|
313
|
-
|
333
|
+
pristine_env "relloadpath3.exe" do
|
334
|
+
assert system('relloadpath3.exe')
|
335
|
+
end
|
314
336
|
end
|
315
337
|
end
|
316
338
|
|
@@ -321,14 +343,16 @@ class TestOcra < Test::Unit::TestCase
|
|
321
343
|
cd 'src' do
|
322
344
|
assert system('ruby', ocra, 'relloadpath4.rb', *DefaultArgs)
|
323
345
|
assert File.exist?('relloadpath4.exe')
|
324
|
-
|
346
|
+
pristine_env "relloadpath4.exe" do
|
347
|
+
assert system('relloadpath4.exe')
|
348
|
+
end
|
325
349
|
end
|
326
350
|
end
|
327
351
|
end
|
328
352
|
|
329
353
|
# Test that ocra.rb accepts --version and outputs the version number.
|
330
354
|
def test_version
|
331
|
-
assert_match(/^Ocra \d+(\.\d)
|
355
|
+
assert_match(/^Ocra \d+(\.\d)+(.pre\d+)?$/, `ruby \"#{ocra}\" --version`)
|
332
356
|
end
|
333
357
|
|
334
358
|
# Test that ocra.rb accepts --icon.
|
@@ -337,7 +361,9 @@ class TestOcra < Test::Unit::TestCase
|
|
337
361
|
icofile = File.join(OcraRoot, 'src', 'vit-ruby.ico')
|
338
362
|
assert system("ruby", ocra, '--icon', icofile, "helloworld.rb", *DefaultArgs)
|
339
363
|
assert File.exist?("helloworld.exe")
|
340
|
-
|
364
|
+
pristine_env "helloworld.exe" do
|
365
|
+
assert system("helloworld.exe")
|
366
|
+
end
|
341
367
|
end
|
342
368
|
end
|
343
369
|
|
@@ -347,7 +373,9 @@ class TestOcra < Test::Unit::TestCase
|
|
347
373
|
with_fixture 'resource' do
|
348
374
|
assert system("ruby", ocra, "resource.rb", "resource.txt", "res/resource.txt", *DefaultArgs)
|
349
375
|
assert File.exist?("resource.exe")
|
350
|
-
|
376
|
+
pristine_env "resource.exe" do
|
377
|
+
assert system("resource.exe")
|
378
|
+
end
|
351
379
|
end
|
352
380
|
end
|
353
381
|
|
@@ -365,9 +393,11 @@ class TestOcra < Test::Unit::TestCase
|
|
365
393
|
with_fixture 'environment' do
|
366
394
|
with_env "RUBYOPT" => "-rtime" do
|
367
395
|
assert system("ruby", ocra, "environment.rb", *DefaultArgs)
|
368
|
-
|
369
|
-
|
370
|
-
|
396
|
+
pristine_env "environment.exe" do
|
397
|
+
assert system("environment.exe")
|
398
|
+
env = Marshal.load(File.open("environment", "rb") { |f| f.read })
|
399
|
+
assert_equal "-rtime", env['RUBYOPT']
|
400
|
+
end
|
371
401
|
end
|
372
402
|
end
|
373
403
|
end
|
@@ -375,25 +405,29 @@ class TestOcra < Test::Unit::TestCase
|
|
375
405
|
def test_exit
|
376
406
|
with_fixture 'exit' do
|
377
407
|
assert system("ruby", ocra, "exit.rb", *DefaultArgs)
|
378
|
-
|
379
|
-
|
408
|
+
pristine_env "exit.exe" do
|
409
|
+
assert File.exist?("exit.exe")
|
410
|
+
assert system("exit.exe")
|
411
|
+
end
|
380
412
|
end
|
381
413
|
end
|
382
414
|
|
383
415
|
def test_ocra_executable_env
|
384
416
|
with_fixture 'environment' do
|
385
417
|
assert system("ruby", ocra, "environment.rb", *DefaultArgs)
|
386
|
-
|
387
|
-
|
388
|
-
|
389
|
-
|
418
|
+
pristine_env "environment.exe" do
|
419
|
+
assert system("environment.exe")
|
420
|
+
env = Marshal.load(File.open("environment", "rb") { |f| f.read })
|
421
|
+
expected_path = File.expand_path("environment.exe").tr('/','\\')
|
422
|
+
assert_equal expected_path, env['OCRA_EXECUTABLE']
|
423
|
+
end
|
390
424
|
end
|
391
425
|
end
|
392
426
|
|
393
427
|
def test_hierarchy
|
394
428
|
with_fixture 'hierarchy' do
|
395
429
|
assert system("ruby", ocra, "hierarchy.rb", "assets/**/*", *DefaultArgs)
|
396
|
-
|
430
|
+
pristine_env "hierarchy.exe" do
|
397
431
|
assert system("hierarchy.exe")
|
398
432
|
end
|
399
433
|
end
|
@@ -404,7 +438,7 @@ class TestOcra < Test::Unit::TestCase
|
|
404
438
|
assert system("ruby", ocra, "helloworld.rb", *DefaultArgs)
|
405
439
|
tempdir = File.expand_path("temporary directory")
|
406
440
|
mkdir_p tempdir
|
407
|
-
|
441
|
+
pristine_env "helloworld.exe" do
|
408
442
|
with_env "TMP" => tempdir.tr('/','\\') do
|
409
443
|
assert system("helloworld.exe")
|
410
444
|
end
|
@@ -412,11 +446,18 @@ class TestOcra < Test::Unit::TestCase
|
|
412
446
|
end
|
413
447
|
end
|
414
448
|
|
449
|
+
# Should be able to build executable when specifying absolute path
|
450
|
+
# to the script from somewhere else.
|
415
451
|
def test_abspath
|
416
452
|
with_fixture "helloworld" do
|
417
|
-
|
418
|
-
|
419
|
-
|
453
|
+
script_path = File.expand_path("helloworld.rb")
|
454
|
+
with_tmpdir do
|
455
|
+
assert system("ruby", ocra, script_path, *DefaultArgs)
|
456
|
+
assert File.exist?("helloworld.exe")
|
457
|
+
pristine_env "helloworld.exe" do
|
458
|
+
assert system("helloworld.exe")
|
459
|
+
end
|
460
|
+
end
|
420
461
|
end
|
421
462
|
end
|
422
463
|
|
@@ -426,7 +467,9 @@ class TestOcra < Test::Unit::TestCase
|
|
426
467
|
cd "build" do
|
427
468
|
assert system("ruby", ocra, File.expand_path("../helloworld.rb"), *DefaultArgs)
|
428
469
|
assert File.exist?("helloworld.exe")
|
429
|
-
|
470
|
+
pristine_env "helloworld.exe" do
|
471
|
+
assert system("helloworld.exe")
|
472
|
+
end
|
430
473
|
end
|
431
474
|
end
|
432
475
|
end
|
@@ -435,7 +478,9 @@ class TestOcra < Test::Unit::TestCase
|
|
435
478
|
with_fixture "helloworld" do
|
436
479
|
assert system("ruby", ocra, "./helloworld.rb", *DefaultArgs)
|
437
480
|
assert File.exist?("helloworld.exe")
|
438
|
-
|
481
|
+
pristine_env "helloworld.exe" do
|
482
|
+
assert system("helloworld.exe")
|
483
|
+
end
|
439
484
|
end
|
440
485
|
end
|
441
486
|
|
@@ -445,10 +490,39 @@ class TestOcra < Test::Unit::TestCase
|
|
445
490
|
cd "build" do
|
446
491
|
assert system("ruby", ocra, "../helloworld.rb", *DefaultArgs)
|
447
492
|
assert File.exist?("helloworld.exe")
|
448
|
-
|
493
|
+
pristine_env "helloworld.exe" do
|
494
|
+
assert system("helloworld.exe")
|
495
|
+
end
|
449
496
|
end
|
450
497
|
end
|
451
498
|
end
|
452
499
|
|
500
|
+
# Should accept hierachical source code layout
|
501
|
+
def test_srcroot
|
502
|
+
with_fixture "srcroot" do
|
503
|
+
assert system("ruby", ocra, "bin/srcroot.rb", "share/data.txt", *DefaultArgs)
|
504
|
+
assert File.exist?("srcroot.exe")
|
505
|
+
pristine_env "srcroot.exe" do
|
506
|
+
exe = File.expand_path("srcroot.exe")
|
507
|
+
cd ENV["SystemRoot"] do
|
508
|
+
assert system(exe)
|
509
|
+
end
|
510
|
+
end
|
511
|
+
end
|
512
|
+
end
|
513
|
+
|
514
|
+
# Should be able to build executables when script changes directory.
|
515
|
+
def test_chdir
|
516
|
+
with_fixture "chdir" do
|
517
|
+
assert system("ruby", ocra, "chdir.rb", *DefaultArgs)
|
518
|
+
assert File.exist?("chdir.exe")
|
519
|
+
pristine_env "chdir.exe" do
|
520
|
+
exe = File.expand_path("chdir.exe")
|
521
|
+
cd ENV["SystemRoot"] do
|
522
|
+
assert system(exe)
|
523
|
+
end
|
524
|
+
end
|
525
|
+
end
|
526
|
+
end
|
453
527
|
|
454
528
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ocra
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: -671420158
|
5
5
|
prerelease: true
|
6
6
|
segments:
|
7
7
|
- 1
|
8
8
|
- 1
|
9
9
|
- 5
|
10
|
-
-
|
11
|
-
version: 1.1.5.
|
10
|
+
- pre3
|
11
|
+
version: 1.1.5.pre3
|
12
12
|
platform: ruby
|
13
13
|
authors:
|
14
14
|
- Lars Christensen
|
@@ -16,7 +16,7 @@ autorequire:
|
|
16
16
|
bindir: bin
|
17
17
|
cert_chain: []
|
18
18
|
|
19
|
-
date: 2010-08-
|
19
|
+
date: 2010-08-20 00:00:00 +02:00
|
20
20
|
default_executable:
|
21
21
|
dependencies:
|
22
22
|
- !ruby/object:Gem::Dependency
|