ocra 1.3.0.rc1 → 1.3.0.rc2
Sign up to get free protection for your applications and to get access to all the features.
- data/.gemtest +0 -0
- data/History.txt +1 -1
- data/README.rdoc +132 -27
- data/bin/ocra +290 -54
- 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 +34 -0
- metadata +38 -73
data/.gemtest
ADDED
File without changes
|
data/History.txt
CHANGED
data/README.rdoc
CHANGED
@@ -47,23 +47,62 @@ dependencies (gems and DLLs) into an executable named
|
|
47
47
|
|
48
48
|
ocra --help
|
49
49
|
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
50
|
+
Ocra options:
|
51
|
+
|
52
|
+
--help Display this information.
|
53
|
+
--quiet Suppress output while building executable.
|
54
|
+
--verbose Show extra output while building executable.
|
55
|
+
--version Display version number and exit.
|
56
|
+
|
57
|
+
Packaging options:
|
58
|
+
|
59
|
+
--dll dllname Include additional DLLs from the Ruby bindir.
|
60
|
+
--add-all-core Add all core ruby libraries to the executable.
|
61
|
+
--gemfile <file> Add all gems and dependencies listed in a Bundler Gemfile.
|
62
|
+
--no-enc Exclude encoding support files
|
63
|
+
|
64
|
+
Gem content detection modes:
|
65
|
+
|
66
|
+
--gem-minimal[=gem1,..] Include only loaded scripts
|
67
|
+
--gem-guess=[gem1,...] Include loaded scripts & best guess (DEFAULT)
|
68
|
+
--gem-all[=gem1,..] Include all scripts & files
|
69
|
+
--gem-full[=gem1,..] Include EVERYTHING
|
70
|
+
--gem-spec[=gem1,..] Include files in gemspec (Does not work with Rubygems 1.7+)
|
71
|
+
|
72
|
+
minimal: loaded scripts
|
73
|
+
guess: loaded scripts and other files
|
74
|
+
all: loaded scripts, other scripts, other files (except extras)
|
75
|
+
full: Everything found in the gem directory
|
76
|
+
|
77
|
+
--[no-]gem-scripts[=..] Other script files than those loaded
|
78
|
+
--[no-]gem-files[=..] Other files (e.g. data files)
|
79
|
+
--[no-]gem-extras[=..] Extra files (README, etc.)
|
80
|
+
|
81
|
+
scripts: .rb/.rbw files
|
82
|
+
extras: C/C++ sources, object files, test, spec, README
|
83
|
+
files: all other files
|
84
|
+
|
85
|
+
Auto-detection options:
|
86
|
+
|
87
|
+
--no-dep-run Don't run script.rb to check for dependencies.
|
88
|
+
--no-autoload Don't load/include script.rb's autoloads.
|
89
|
+
--no-autodll Disable detection of runtime DLL dependencies.
|
90
|
+
|
91
|
+
Output options:
|
92
|
+
|
93
|
+
--output <file> Name the exe to generate. Defaults to ./<scriptname>.exe.
|
94
|
+
--no-lzma Disable LZMA compression of the executable.
|
95
|
+
--innosetup <file> Use given Inno Setup script (.iss) to create an installer.
|
96
|
+
|
97
|
+
Executable options:
|
98
|
+
|
99
|
+
--windows Force Windows application (rubyw.exe)
|
100
|
+
--console Force console application (ruby.exe)
|
101
|
+
--chdir-first When exe starts, change working directory to app dir.
|
102
|
+
--icon <ico> Replace icon with a custom one.
|
103
|
+
--debug Executable will be verbose.
|
104
|
+
--debug-extract Executable will unpack to local dir and not delete after.
|
105
|
+
|
67
106
|
|
68
107
|
=== Compilation:
|
69
108
|
|
@@ -167,11 +206,11 @@ your script. Otherwise, OCRA won't know about it and will not include
|
|
167
206
|
the source files.
|
168
207
|
|
169
208
|
RubyGems are handled specially. Whenever a file from a Gem is
|
170
|
-
detected, OCRA will attempt to include all the files from
|
171
|
-
specific Gem
|
172
|
-
|
173
|
-
|
174
|
-
|
209
|
+
detected, OCRA will attempt to include all the required files from
|
210
|
+
that specific Gem, expect some unlikely needed files such as readme's
|
211
|
+
and other documentation. This behaviour can be controlled by using the
|
212
|
+
--gem-* options. Behaviour can be changed for all gems or specific
|
213
|
+
gems using --gem-*=gemname.
|
175
214
|
|
176
215
|
Libraries found in non-standard path (for example, if you invoke OCRA
|
177
216
|
with "ruby -I some/path") will be placed into the site dir
|
@@ -201,7 +240,7 @@ build process. You will also probably need to use the --add-all-core
|
|
201
240
|
option to include the Ruby core libraries.
|
202
241
|
|
203
242
|
If your app uses gems, then you can specify them in a
|
204
|
-
Bundler (http://gembundler.com
|
243
|
+
Bundler (http://gembundler.com) Gemfile, then use the --gemfile
|
205
244
|
option to supply it to Ocra. Ocra will automatically include all
|
206
245
|
gems specified, and all their dependencies.
|
207
246
|
|
@@ -214,12 +253,74 @@ directory "someapp" and create an exe named "someapp.exe", without
|
|
214
253
|
actually running the app during the build, you could use the
|
215
254
|
following command:
|
216
255
|
|
217
|
-
ocra someapp/script/
|
256
|
+
ocra someapp/script/rails someapp --output someapp.exe --add-all-core \
|
257
|
+
--gemfile someapp/Gemfile --no-dep-run --chdir-first -- server
|
258
|
+
|
259
|
+
Note the space between "--" and "server"! It's important; "server" is an argument to be passed to rails when the script is ran.
|
218
260
|
|
219
261
|
Rails 2 apps can be packaged similarly, though you will have to
|
220
262
|
integrate them with Bundler (http://gembundler.com/rails23.html)
|
221
263
|
first.
|
222
264
|
|
265
|
+
=== Gem handling
|
266
|
+
|
267
|
+
By default, Ocra includes all scripts that are loaded by your script
|
268
|
+
when it is run before packaging. Ocra detects which gems are using and
|
269
|
+
includes any additional non-script files from those gems, except
|
270
|
+
trivial files such as C/C++ source code, object files, READMEs, unit
|
271
|
+
tests, specs, etc.
|
272
|
+
|
273
|
+
This behaviour can be changed by using the --gem-* options. There are
|
274
|
+
four possible modes:
|
275
|
+
|
276
|
+
minimal: Include only loaded scripts
|
277
|
+
guess: Include loaded scripts and important files (DEFAULT)
|
278
|
+
all: Include all scripts and important files
|
279
|
+
full: Include all files
|
280
|
+
|
281
|
+
If you find that files are missing from the resulting executable, try
|
282
|
+
first with --gem-all=gemname for the gem that is missing, and if that
|
283
|
+
does not work, try --gem-full=gemname. The paranoid can use --gem-full
|
284
|
+
to include all files for all required gems.
|
285
|
+
|
286
|
+
=== Creating an installer for your application
|
287
|
+
|
288
|
+
To make your application start up quicker, or to allow it to
|
289
|
+
keep files in its application directory between runs, or if
|
290
|
+
you just want to make your program seem more like a "regular"
|
291
|
+
Windows application, you can have Ocra generate an installer
|
292
|
+
for your app with the free Inno Setup software.
|
293
|
+
|
294
|
+
You will first have to download and install Inno Setup 5 or
|
295
|
+
later, and also add its directory to your PATH (so that Ocra
|
296
|
+
can find the ISCC compiler program). Once you've done that,
|
297
|
+
you can use the --innosetup option to Ocra to supply an
|
298
|
+
Inno Setup script. Do not add any [Files] or [Dirs] sections
|
299
|
+
to the script; Ocra will figure those out itself.
|
300
|
+
|
301
|
+
To continue the Rails example above, let's package the Rails 3
|
302
|
+
app into an installer. Save the following as "<tt>someapp.iss</tt>":
|
303
|
+
|
304
|
+
[Setup]
|
305
|
+
AppName=SomeApp
|
306
|
+
AppVersion=0.1
|
307
|
+
DefaultDirName={pf}\SomeApp
|
308
|
+
DefaultGroupName=SomeApp
|
309
|
+
OutputBaseFilename=SomeAppInstaller
|
310
|
+
|
311
|
+
[Icons]
|
312
|
+
Name: "{group}\SomeApp"; Filename: "{app}\someapp.exe"
|
313
|
+
Name: "{group}\Uninstall SomeApp"; Filename: "{uninstallexe}"
|
314
|
+
|
315
|
+
Then, run Ocra with this command:
|
316
|
+
|
317
|
+
ocra someapp/script/rails someapp --output someapp.exe --add-all-core \
|
318
|
+
--gemfile someapp/Gemfile --no-dep-run --chdir-first --no-lzma \
|
319
|
+
--innosetup someapp.iss -- server
|
320
|
+
|
321
|
+
If all goes well, a file named "SomeAppInstaller.exe" will be placed
|
322
|
+
into the Output directory.
|
323
|
+
|
223
324
|
=== Environment variables
|
224
325
|
|
225
326
|
OCRA executables clear the RUBYLIB environment variable before your
|
@@ -239,7 +340,7 @@ executable, for example
|
|
239
340
|
=== Working directory
|
240
341
|
|
241
342
|
The OCRA executable does not change the working directory when it is
|
242
|
-
launched.
|
343
|
+
launched, unless you use the "<tt>--chdir-first</tt>" option.
|
243
344
|
|
244
345
|
You should not assume that the current working directory when invoking
|
245
346
|
an executable built with .exe is the location of the source script. It
|
@@ -247,9 +348,13 @@ can be the directory where the executable is placed (when invoked
|
|
247
348
|
through the Windows Explorer), the users' current working directory
|
248
349
|
(when invoking from the Command Prompt), or even
|
249
350
|
<tt>C:\\WINDOWS\\SYSTEM32</tt> when the executable is invoked through
|
250
|
-
a file association.
|
351
|
+
a file association.
|
251
352
|
|
252
|
-
|
353
|
+
With the "<tt>--chdir-first</tt>" option, the working directory will
|
354
|
+
always be the common parent directory of your source files. This
|
355
|
+
should be fine for most applications. However, if your application
|
356
|
+
is designed to run from the command line and take filenames as
|
357
|
+
arguments, then you cannot use this option.
|
253
358
|
|
254
359
|
If you wish to maintain the user's working directory, but need to
|
255
360
|
'require' additional Ruby scripts from the source directory, you can
|
data/bin/ocra
CHANGED
@@ -54,8 +54,16 @@ module Ocra
|
|
54
54
|
src_normalized =~ /^#{Regexp.escape tgt_normalized}#{SEPARATOR_PAT}/i
|
55
55
|
end
|
56
56
|
|
57
|
+
# Join two pathnames together. Returns the right-hand side if it
|
58
|
+
# is an absolute path. Otherwise, returns the full path of the
|
59
|
+
# left + right.
|
57
60
|
def /(other)
|
58
|
-
|
61
|
+
other = Ocra.Pathname(other)
|
62
|
+
if other.absolute?
|
63
|
+
other
|
64
|
+
else
|
65
|
+
Ocra.Pathname(@path + '/' + other.path)
|
66
|
+
end
|
59
67
|
end
|
60
68
|
|
61
69
|
def append_to_filename!(s)
|
@@ -74,6 +82,30 @@ module Ocra
|
|
74
82
|
Pathname.pathequal(ext, expected_ext)
|
75
83
|
end
|
76
84
|
|
85
|
+
def entries
|
86
|
+
Dir.entries(@path).map { |e| self / e }
|
87
|
+
end
|
88
|
+
|
89
|
+
# Recursively find all files which match a specified regular
|
90
|
+
# expression.
|
91
|
+
def find_all_files(re)
|
92
|
+
entries.map do |pn|
|
93
|
+
if pn.directory?
|
94
|
+
if pn.basename =~ /^\.\.?$/
|
95
|
+
[]
|
96
|
+
else
|
97
|
+
pn.find_all_files(re)
|
98
|
+
end
|
99
|
+
elsif pn.file?
|
100
|
+
if pn.basename =~ re
|
101
|
+
pn
|
102
|
+
else
|
103
|
+
[]
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end.flatten
|
107
|
+
end
|
108
|
+
|
77
109
|
def ==(other); to_posix.downcase == other.to_posix.downcase; end
|
78
110
|
def =~(o); @path =~ o; end
|
79
111
|
def <=>(other); @path.casecmp(other.path); end
|
@@ -84,6 +116,7 @@ module Ocra
|
|
84
116
|
def dirname; Pathname.new(File.dirname(@path)); end
|
85
117
|
def basename; Pathname.new(File.basename(@path)); end
|
86
118
|
def expand(dir = nil); Pathname.new(File.expand_path(@path, dir && Ocra.Pathname(dir))); end
|
119
|
+
def size; File.size(@path); end
|
87
120
|
|
88
121
|
alias to_s to_posix
|
89
122
|
alias to_str to_posix
|
@@ -142,22 +175,25 @@ module Ocra
|
|
142
175
|
a.sort.inject([]) { |r, e| r.last == e ? r : r << e }
|
143
176
|
end
|
144
177
|
|
145
|
-
VERSION = "1.3.0.
|
178
|
+
VERSION = "1.3.0.rc2"
|
146
179
|
|
147
180
|
IGNORE_MODULES = /^enumerator.so$/
|
148
181
|
|
149
|
-
|
182
|
+
GEM_SCRIPT_RE = /\.rbw?$/
|
183
|
+
GEM_EXTRA_RE = %r{(
|
150
184
|
# Auxiliary files in the root of the gem
|
151
185
|
^(\.\/)?(History|Install|Manifest|README|Licen[sc]e|Contributors|ChangeLog|BSD|GPL).*$ |
|
152
186
|
# Installation files in the root of the gem
|
153
187
|
^(\.\/)?(Rakefile|setup.rb|extconf.rb)$ |
|
154
188
|
# Documentation/test directories in the root of the gem
|
155
|
-
^(\.\/)?(doc|ext|examples|test|tests|benchmarks)\/ |
|
189
|
+
^(\.\/)?(doc|ext|examples|test|tests|benchmarks|spec)\/ |
|
156
190
|
# Directories anywhere
|
157
191
|
(^|\/)(\.autotest|\.svn|\.cvs|\.git)(\/|$) |
|
158
192
|
# Unlikely extensions
|
159
|
-
\.(rdoc)$/
|
193
|
+
\.(rdoc|c|cpp|c++|cxx|h|hxx|hpp|obj|o|a)$/
|
160
194
|
)}xi
|
195
|
+
|
196
|
+
GEM_NON_FILE_RE = /(#{GEM_EXTRA_RE}|#{GEM_SCRIPT_RE})/
|
161
197
|
|
162
198
|
# Alias for the temporary directory where files are extracted.
|
163
199
|
TEMPDIR_ROOT = Pathname.new("\xFF")
|
@@ -176,18 +212,21 @@ module Ocra
|
|
176
212
|
:add_all_core => false,
|
177
213
|
:output_override => nil,
|
178
214
|
:load_autoload => true,
|
215
|
+
:chdir_first => false,
|
179
216
|
:force_windows => false,
|
180
217
|
:force_console => false,
|
181
218
|
:icon_filename => nil,
|
182
219
|
:gemfile => nil,
|
220
|
+
:inno_script => nil,
|
183
221
|
:quiet => false,
|
184
222
|
:verbose => false,
|
185
223
|
:autodll => true,
|
186
224
|
:show_warnings => true,
|
187
225
|
:debug => false,
|
188
226
|
:debug_extract => false,
|
189
|
-
:
|
190
|
-
:
|
227
|
+
:arg => [],
|
228
|
+
:enc => true,
|
229
|
+
:gem => []
|
191
230
|
}
|
192
231
|
|
193
232
|
@options.each_key { |opt| eval("def self.#{opt}; @options[:#{opt}]; end") }
|
@@ -256,23 +295,61 @@ module Ocra
|
|
256
295
|
usage = <<EOF
|
257
296
|
ocra [options] script.rb
|
258
297
|
|
259
|
-
|
260
|
-
|
261
|
-
--
|
262
|
-
--
|
263
|
-
--
|
264
|
-
--
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
--
|
269
|
-
--
|
270
|
-
--
|
271
|
-
--
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
--
|
298
|
+
Ocra options:
|
299
|
+
|
300
|
+
--help Display this information.
|
301
|
+
--quiet Suppress output while building executable.
|
302
|
+
--verbose Show extra output while building executable.
|
303
|
+
--version Display version number and exit.
|
304
|
+
|
305
|
+
Packaging options:
|
306
|
+
|
307
|
+
--dll dllname Include additional DLLs from the Ruby bindir.
|
308
|
+
--add-all-core Add all core ruby libraries to the executable.
|
309
|
+
--gemfile <file> Add all gems and dependencies listed in a Bundler Gemfile.
|
310
|
+
--no-enc Exclude encoding support files
|
311
|
+
|
312
|
+
Gem content detection modes:
|
313
|
+
|
314
|
+
--gem-minimal[=gem1,..] Include only loaded scripts
|
315
|
+
--gem-guess=[gem1,...] Include loaded scripts & best guess (DEFAULT)
|
316
|
+
--gem-all[=gem1,..] Include all scripts & files
|
317
|
+
--gem-full[=gem1,..] Include EVERYTHING
|
318
|
+
--gem-spec[=gem1,..] Include files in gemspec (Does not work with Rubygems 1.7+)
|
319
|
+
|
320
|
+
minimal: loaded scripts
|
321
|
+
guess: loaded scripts and other files
|
322
|
+
all: loaded scripts, other scripts, other files (except extras)
|
323
|
+
full: Everything found in the gem directory
|
324
|
+
|
325
|
+
--[no-]gem-scripts[=..] Other script files than those loaded
|
326
|
+
--[no-]gem-files[=..] Other files (e.g. data files)
|
327
|
+
--[no-]gem-extras[=..] Extra files (README, etc.)
|
328
|
+
|
329
|
+
scripts: .rb/.rbw files
|
330
|
+
extras: C/C++ sources, object files, test, spec, README
|
331
|
+
files: all other files
|
332
|
+
|
333
|
+
Auto-detection options:
|
334
|
+
|
335
|
+
--no-dep-run Don't run script.rb to check for dependencies.
|
336
|
+
--no-autoload Don't load/include script.rb's autoloads.
|
337
|
+
--no-autodll Disable detection of runtime DLL dependencies.
|
338
|
+
|
339
|
+
Output options:
|
340
|
+
|
341
|
+
--output <file> Name the exe to generate. Defaults to ./<scriptname>.exe.
|
342
|
+
--no-lzma Disable LZMA compression of the executable.
|
343
|
+
--innosetup <file> Use given Inno Setup script (.iss) to create an installer.
|
344
|
+
|
345
|
+
Executable options:
|
346
|
+
|
347
|
+
--windows Force Windows application (rubyw.exe)
|
348
|
+
--console Force console application (ruby.exe)
|
349
|
+
--chdir-first When exe starts, change working directory to app dir.
|
350
|
+
--icon <ico> Replace icon with a custom one.
|
351
|
+
--debug Executable will be verbose.
|
352
|
+
--debug-extract Executable will unpack to local dir and not delete after.
|
276
353
|
EOF
|
277
354
|
|
278
355
|
while arg = argv.shift
|
@@ -297,12 +374,17 @@ EOF
|
|
297
374
|
@options[:force_console] = true
|
298
375
|
when /\A--no-autoload\z/
|
299
376
|
@options[:load_autoload] = false
|
377
|
+
when /\A--chdir-first\z/
|
378
|
+
@options[:chdir_first] = true
|
300
379
|
when /\A--icon\z/
|
301
380
|
@options[:icon_filename] = Pathname(argv.shift)
|
302
381
|
Ocra.fatal_error "Icon file #{icon_filename} not found.\n" unless icon_filename.exist?
|
303
382
|
when /\A--gemfile\z/
|
304
383
|
@options[:gemfile] = Pathname(argv.shift)
|
305
384
|
Ocra.fatal_error "Gemfile #{gemfile} not found.\n" unless gemfile.exist?
|
385
|
+
when /\A--innosetup\z/
|
386
|
+
@options[:inno_script] = Pathname(argv.shift)
|
387
|
+
Ocra.fatal_error "Inno Script #{inno_script} not found.\n" unless inno_script.exist?
|
306
388
|
when /\A--no-autodll\z/
|
307
389
|
@options[:autodll] = false
|
308
390
|
when /\A--version\z/
|
@@ -314,11 +396,15 @@ EOF
|
|
314
396
|
@options[:debug] = true
|
315
397
|
when /\A--debug-extract\z/
|
316
398
|
@options[:debug_extract] = true
|
317
|
-
when /\A--no-gem-filter\z/
|
318
|
-
@options[:gem_filter] = false
|
319
399
|
when /\A--\z/
|
320
400
|
@options[:arg] = ARGV.dup
|
321
401
|
ARGV.clear
|
402
|
+
when /\A--(no-)?enc\z/
|
403
|
+
@options[:enc] = !$1
|
404
|
+
when /\A--(no-)?gem-(\w+)(?:=(.*))?$/
|
405
|
+
negate, group, list = $1, $2, $3
|
406
|
+
@options[:gem] ||= []
|
407
|
+
@options[:gem] << [negate, group.to_sym, list && list.split(",") ]
|
322
408
|
when /\A--help\z/, /\A--./
|
323
409
|
puts usage
|
324
410
|
exit 0
|
@@ -327,6 +413,18 @@ EOF
|
|
327
413
|
end
|
328
414
|
end
|
329
415
|
|
416
|
+
if Ocra.debug_extract && Ocra.inno_script
|
417
|
+
Ocra.fatal_error "The --debug-extract option conflicts with use of Inno Setup"
|
418
|
+
end
|
419
|
+
|
420
|
+
if Ocra.lzma_mode && Ocra.inno_script
|
421
|
+
Ocra.fatal_error "LZMA compression must be disabled (--no-lzma) when using Inno Setup"
|
422
|
+
end
|
423
|
+
|
424
|
+
if !Ocra.chdir_first && Ocra.inno_script
|
425
|
+
Ocra.fatal_error "Chdir-first mode must be enabled (--chdir-first) when using Inno Setup"
|
426
|
+
end
|
427
|
+
|
330
428
|
if files.empty?
|
331
429
|
puts usage
|
332
430
|
exit 1
|
@@ -422,7 +520,13 @@ EOF
|
|
422
520
|
srcroot
|
423
521
|
end
|
424
522
|
end
|
425
|
-
src_files = src_files.map
|
523
|
+
src_files = src_files.map do |file|
|
524
|
+
if file.subpath?(src_prefix)
|
525
|
+
file.relative_path_from(src_prefix)
|
526
|
+
else
|
527
|
+
file
|
528
|
+
end
|
529
|
+
end
|
426
530
|
return src_prefix, src_files
|
427
531
|
end
|
428
532
|
|
@@ -478,24 +582,86 @@ EOF
|
|
478
582
|
gemspecpath = gempath / 'specifications' / "#{fullgemname}.gemspec"
|
479
583
|
@gemspecs << gemspecpath
|
480
584
|
spec = Gem::Specification.load(gemspecpath)
|
481
|
-
|
482
|
-
|
483
|
-
|
484
|
-
|
485
|
-
|
486
|
-
|
487
|
-
|
488
|
-
|
489
|
-
|
490
|
-
|
491
|
-
|
492
|
-
|
585
|
+
|
586
|
+
# Determine which set of files to include for this particular gem
|
587
|
+
include = [ :loaded, :files ]
|
588
|
+
Ocra.gem.each do |negate, option, list|
|
589
|
+
if list.nil? or list.include?(spec.name)
|
590
|
+
case option
|
591
|
+
when :minimal
|
592
|
+
include = [ :loaded ]
|
593
|
+
when :guess
|
594
|
+
include = [ :loaded, :files ]
|
595
|
+
when :all
|
596
|
+
include = [ :scripts, :files ]
|
597
|
+
when :full
|
598
|
+
include = [ :scripts, :files, :extras ]
|
599
|
+
when :spec
|
600
|
+
include = [ :spec ]
|
601
|
+
when :scripts
|
602
|
+
if negate
|
603
|
+
include.delete(:scripts)
|
604
|
+
else
|
605
|
+
include.push(:scripts)
|
606
|
+
end
|
607
|
+
when :files
|
608
|
+
if negate
|
609
|
+
include.delete(:files)
|
610
|
+
else
|
611
|
+
include.push(:files)
|
612
|
+
end
|
613
|
+
when :extras
|
614
|
+
if negate
|
615
|
+
include.delete(:extras)
|
616
|
+
else
|
617
|
+
include.push(:extras)
|
618
|
+
end
|
619
|
+
end
|
620
|
+
end
|
621
|
+
end
|
622
|
+
|
623
|
+
Ocra.msg "Detected gem #{spec.full_name} (#{include.join(', ')})"
|
624
|
+
|
625
|
+
gem_root = gempath / "gems" / spec.full_name
|
626
|
+
gem_root_files = nil
|
627
|
+
files = []
|
628
|
+
|
629
|
+
# Find the selected files
|
630
|
+
include.each do |set|
|
631
|
+
case set
|
632
|
+
when :spec
|
633
|
+
files << Pathname(spec.files)
|
634
|
+
when :loaded
|
635
|
+
files << features_from_gems.select { |feature| feature.subpath?(gem_root) }
|
636
|
+
when :files
|
637
|
+
gem_root_files ||= gem_root.find_all_files(//)
|
638
|
+
files << gem_root_files.select { |path| path.relative_path_from(gem_root) !~ GEM_NON_FILE_RE }
|
639
|
+
when :extra
|
640
|
+
gem_root_files ||= gem_root.find_all_files(//)
|
641
|
+
files << gem_root_files.select { |path| path.relative_path_from(gem_root) =~ GEM_EXTRA_RE }
|
642
|
+
when :scripts
|
643
|
+
gem_root_files ||= gem_root.find_all_files(//)
|
644
|
+
files << gem_root_files.select { |path| path.relative_path_from(gem_root) =~ GEM_SCRIPT_RE }
|
645
|
+
end
|
646
|
+
end
|
647
|
+
|
648
|
+
files.flatten!
|
649
|
+
actual_files = files.select { |file| file.file? }
|
650
|
+
|
651
|
+
(files - actual_files).each do |missing_file|
|
652
|
+
Ocra.warn "#{missing_file} was not found"
|
653
|
+
end
|
654
|
+
|
655
|
+
total_size = actual_files.inject(0) { |size, path| size + path.size }
|
656
|
+
Ocra.msg "\t#{actual_files.size} files, #{total_size} bytes"
|
657
|
+
|
658
|
+
gem_files += actual_files
|
493
659
|
end
|
494
660
|
gem_files = sort_uniq(gem_files)
|
495
|
-
features -= features_from_gems # FIXME Isn't this duplicated by caller?
|
496
661
|
else
|
497
662
|
gem_files = []
|
498
663
|
end
|
664
|
+
features_from_gems -= gem_files
|
499
665
|
return gem_files, features_from_gems
|
500
666
|
end
|
501
667
|
|
@@ -538,6 +704,23 @@ EOF
|
|
538
704
|
# Find the source root and adjust paths
|
539
705
|
src_prefix, src_files = find_src_root(Ocra.files)
|
540
706
|
|
707
|
+
# Include encoding support files
|
708
|
+
if Ocra.enc
|
709
|
+
all_load_paths.each do |path|
|
710
|
+
if path.subpath?(Host.exec_prefix)
|
711
|
+
encpath = path / "enc"
|
712
|
+
if encpath.exist?
|
713
|
+
encfiles = encpath.find_all_files(/\.so$/)
|
714
|
+
size = encfiles.inject(0) { |sum,pn| sum + pn.size }
|
715
|
+
Ocra.msg "Including #{encfiles.size} encoding support files (#{size} bytes, use --no-enc to exclude)"
|
716
|
+
features.push(*encfiles)
|
717
|
+
end
|
718
|
+
end
|
719
|
+
end
|
720
|
+
else
|
721
|
+
Ocra.msg "Not including encoding support files"
|
722
|
+
end
|
723
|
+
|
541
724
|
# Find features and decide where to put them in the temporary
|
542
725
|
# directory layout.
|
543
726
|
libs = []
|
@@ -713,15 +896,16 @@ EOF
|
|
713
896
|
sb.setenv('GEM_PATH', (TEMPDIR_ROOT / GEMHOMEDIR).to_native)
|
714
897
|
|
715
898
|
# Add the opcode to launch the script
|
716
|
-
extra_arg = Ocra.arg.map { |arg| ' "' + arg.gsub(
|
899
|
+
extra_arg = Ocra.arg.map { |arg| ' "' + arg.gsub("\"","\\\"") + '"' }.join
|
717
900
|
installed_ruby_exe = TEMPDIR_ROOT / BINDIR / rubyexe
|
718
901
|
launch_script = (TEMPDIR_ROOT / target_script).to_native
|
719
902
|
sb.postcreateprocess(installed_ruby_exe,
|
720
903
|
"#{rubyexe} \"#{launch_script}\"#{extra_arg}")
|
721
|
-
|
722
|
-
Ocra.msg "Compressing" unless not Ocra.lzma_mode
|
723
904
|
end
|
724
|
-
|
905
|
+
|
906
|
+
unless Ocra.inno_script
|
907
|
+
Ocra.msg "Finished building #{executable} (#{File.size(executable)} bytes)"
|
908
|
+
end
|
725
909
|
end
|
726
910
|
|
727
911
|
module LibraryDetector
|
@@ -797,7 +981,6 @@ EOF
|
|
797
981
|
opcode_offset = File.size(path)
|
798
982
|
|
799
983
|
File.open(path, "ab") do |ocrafile|
|
800
|
-
|
801
984
|
if Ocra.lzma_mode
|
802
985
|
@of = ""
|
803
986
|
else
|
@@ -805,16 +988,18 @@ EOF
|
|
805
988
|
end
|
806
989
|
|
807
990
|
if Ocra.debug
|
991
|
+
Ocra.msg("Enabling debug mode in executable")
|
808
992
|
ocrafile.write([OP_ENABLE_DEBUG_MODE].pack("V"))
|
809
993
|
end
|
810
994
|
|
811
|
-
createinstdir Ocra.debug_extract, !Ocra.debug_extract
|
995
|
+
createinstdir Ocra.debug_extract, !Ocra.debug_extract, Ocra.chdir_first
|
812
996
|
|
813
997
|
yield(self)
|
814
998
|
|
815
|
-
if Ocra.lzma_mode
|
999
|
+
if Ocra.lzma_mode and not Ocra.inno_script
|
816
1000
|
begin
|
817
1001
|
File.open("tmpin", "wb") { |tmp| tmp.write(@of) }
|
1002
|
+
Ocra.msg "Compressing #{@of.size} bytes"
|
818
1003
|
system("\"#{Ocra.lzmapath}\" e tmpin tmpout 2>NUL") or fail
|
819
1004
|
compressed_data = File.open("tmpout", "rb") { |tmp| tmp.read }
|
820
1005
|
ocrafile.write([OP_DECOMPRESS_LZMA, compressed_data.size, compressed_data].pack("VVA*"))
|
@@ -822,21 +1007,68 @@ EOF
|
|
822
1007
|
File.unlink("tmpin") if File.exist?("tmpin")
|
823
1008
|
File.unlink("tmpout") if File.exist?("tmpout")
|
824
1009
|
end
|
825
|
-
else
|
826
|
-
ocrafile.write(@of) if Ocra.lzma_mode
|
827
1010
|
end
|
828
1011
|
|
829
1012
|
ocrafile.write([OP_END].pack("V"))
|
830
1013
|
ocrafile.write([opcode_offset].pack("V")) # Pointer to start of opcodes
|
831
1014
|
ocrafile.write(Signature.pack("C*"))
|
832
1015
|
end
|
1016
|
+
|
1017
|
+
if Ocra.inno_script
|
1018
|
+
begin
|
1019
|
+
iss = File.read(Ocra.inno_script) + "\n\n"
|
1020
|
+
|
1021
|
+
iss << "[Dirs]\n"
|
1022
|
+
@paths.each_key do |p|
|
1023
|
+
iss << "Name: \"{app}/#{p}\"\n"
|
1024
|
+
end
|
1025
|
+
iss << "\n"
|
1026
|
+
|
1027
|
+
iss << "[Files]\n"
|
1028
|
+
path_escaped = path.to_s.gsub('"', '""')
|
1029
|
+
iss << "Source: \"#{path_escaped}\"; DestDir: \"{app}\"\n"
|
1030
|
+
@files.each do |tgt, src|
|
1031
|
+
src_escaped = src.to_s.gsub('"', '""')
|
1032
|
+
target_dir_escaped = Pathname.new(tgt).dirname.to_s.gsub('"', '""')
|
1033
|
+
iss << "Source: \"#{src_escaped}\"; DestDir: \"{app}/#{target_dir_escaped}\"\n"
|
1034
|
+
end
|
1035
|
+
iss << "\n"
|
1036
|
+
|
1037
|
+
Ocra.verbose_msg "### INNOSETUP SCRIPT ###\n\n#{iss}\n\n"
|
1038
|
+
|
1039
|
+
f = File.open("ocratemp.iss", "w")
|
1040
|
+
f.write(iss)
|
1041
|
+
f.close()
|
1042
|
+
|
1043
|
+
iscc_cmd = ["iscc"]
|
1044
|
+
iscc_cmd << "/Q" unless Ocra.verbose
|
1045
|
+
iscc_cmd << "ocratemp.iss"
|
1046
|
+
Ocra.msg "Running InnoSetup compiler ISCC"
|
1047
|
+
result = system(*iscc_cmd)
|
1048
|
+
if not result
|
1049
|
+
case $?
|
1050
|
+
when 0 then raise RuntimeError.new("ISCC reported success, but system reported error?")
|
1051
|
+
when 1 then raise RuntimeError.new("ISCC reports invalid command line parameters")
|
1052
|
+
when 2 then raise RuntimeError.new("ISCC reports that compilation failed")
|
1053
|
+
else raise RuntimeError.new("ISCC failed to run. Is the InnoSetup directory in your PATH?")
|
1054
|
+
end
|
1055
|
+
end
|
1056
|
+
rescue Exception => e
|
1057
|
+
Ocra.fatal_error("InnoSetup installer creation failed: #{e.message}")
|
1058
|
+
ensure
|
1059
|
+
File.unlink("ocratemp.iss") if File.exist?("ocratemp.iss")
|
1060
|
+
File.unlink(path) if File.exist?(path)
|
1061
|
+
end
|
1062
|
+
end
|
833
1063
|
end
|
834
1064
|
|
835
1065
|
def mkdir(path)
|
836
1066
|
return if @paths[path.path.downcase]
|
837
1067
|
@paths[path.path.downcase] = true
|
838
1068
|
Ocra.verbose_msg "m #{showtempdir path}"
|
839
|
-
|
1069
|
+
unless Ocra.inno_script # The directory will be created by InnoSetup with a [Dirs] statement
|
1070
|
+
@of << [OP_CREATE_DIRECTORY, path.to_native].pack("VZ*")
|
1071
|
+
end
|
840
1072
|
end
|
841
1073
|
|
842
1074
|
def ensuremkdir(tgt)
|
@@ -848,18 +1080,22 @@ EOF
|
|
848
1080
|
end
|
849
1081
|
end
|
850
1082
|
|
851
|
-
def createinstdir(next_to_exe = false, delete_after = false)
|
852
|
-
|
1083
|
+
def createinstdir(next_to_exe = false, delete_after = false, chdir_before = false)
|
1084
|
+
unless Ocra.inno_script # Creation of installation directory will be handled by InnoSetup
|
1085
|
+
@of << [OP_CREATE_INST_DIRECTORY, next_to_exe ? 1 : 0, delete_after ? 1 : 0, chdir_before ? 1 : 0].pack("VVVV")
|
1086
|
+
end
|
853
1087
|
end
|
854
1088
|
|
855
1089
|
def createfile(src, tgt)
|
856
1090
|
return if @files[tgt]
|
857
|
-
@files[tgt] =
|
1091
|
+
@files[tgt] = src
|
858
1092
|
src, tgt = Ocra.Pathname(src), Ocra.Pathname(tgt)
|
859
1093
|
ensuremkdir(tgt.dirname)
|
860
1094
|
str = File.open(src, "rb") { |file| file.read }
|
861
1095
|
Ocra.verbose_msg "a #{showtempdir tgt}"
|
862
|
-
|
1096
|
+
unless Ocra.inno_script # InnoSetup will install the file with a [Files] statement
|
1097
|
+
@of << [OP_CREATE_FILE, tgt.to_native, str.size, str].pack("VZ*VA*")
|
1098
|
+
end
|
863
1099
|
end
|
864
1100
|
|
865
1101
|
def createprocess(image, cmdline)
|
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
@@ -682,6 +682,27 @@ class TestOcra < Test::Unit::TestCase
|
|
682
682
|
end
|
683
683
|
end
|
684
684
|
|
685
|
+
# Test that the --chdir-first option changes directory before exe starts script
|
686
|
+
def test_chdir_first
|
687
|
+
with_fixture 'writefile' do
|
688
|
+
# Control test; make sure the writefile script works as expected under default options
|
689
|
+
assert system("ruby", ocra, "writefile.rb", *(DefaultArgs))
|
690
|
+
pristine_env "writefile.exe" do
|
691
|
+
assert !File.exist?("output.txt")
|
692
|
+
assert system("writefile.exe")
|
693
|
+
assert File.exist?("output.txt")
|
694
|
+
end
|
695
|
+
|
696
|
+
assert system("ruby", ocra, "writefile.rb", *(DefaultArgs + ["--chdir-first"]))
|
697
|
+
pristine_env "writefile.exe" do
|
698
|
+
assert !File.exist?("output.txt")
|
699
|
+
assert system("writefile.exe")
|
700
|
+
# If the script ran in its inst directory, then our working dir still shouldn't have any output.txt
|
701
|
+
assert !File.exist?("output.txt")
|
702
|
+
end
|
703
|
+
end
|
704
|
+
end
|
705
|
+
|
685
706
|
# Would be nice if OCRA could build from source located beneath the
|
686
707
|
# Ruby installation too.
|
687
708
|
def test_exec_prefix
|
@@ -694,5 +715,18 @@ class TestOcra < Test::Unit::TestCase
|
|
694
715
|
end
|
695
716
|
end
|
696
717
|
end
|
718
|
+
|
719
|
+
def test_explicit_in_exec_prefix
|
720
|
+
path = File.join(RbConfig::CONFIG["exec_prefix"], "include", "**", "*.h")
|
721
|
+
number_of_files = Dir[path].size
|
722
|
+
assert number_of_files > 3
|
723
|
+
with_fixture "check_includes" do
|
724
|
+
assert system("ruby", ocra, "check_includes.rb", path, *DefaultArgs)
|
725
|
+
assert File.exist?("check_includes.exe")
|
726
|
+
pristine_env "check_includes.exe" do
|
727
|
+
assert system("check_includes.exe", number_of_files.to_s)
|
728
|
+
end
|
729
|
+
end
|
730
|
+
end
|
697
731
|
|
698
732
|
end
|
metadata
CHANGED
@@ -1,68 +1,40 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: ocra
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
|
6
|
-
- 1
|
7
|
-
- 3
|
8
|
-
- 0
|
9
|
-
- rc1
|
10
|
-
version: 1.3.0.rc1
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.3.0.rc2
|
5
|
+
prerelease: 6
|
11
6
|
platform: ruby
|
12
|
-
authors:
|
7
|
+
authors:
|
13
8
|
- Lars Christensen
|
14
9
|
autorequire:
|
15
10
|
bindir: bin
|
16
11
|
cert_chain: []
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
dependencies:
|
21
|
-
- !ruby/object:Gem::Dependency
|
22
|
-
name: rubyforge
|
23
|
-
prerelease: false
|
24
|
-
requirement: &id001 !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
|
-
requirements:
|
27
|
-
- - ">="
|
28
|
-
- !ruby/object:Gem::Version
|
29
|
-
segments:
|
30
|
-
- 2
|
31
|
-
- 0
|
32
|
-
- 4
|
33
|
-
version: 2.0.4
|
34
|
-
type: :development
|
35
|
-
version_requirements: *id001
|
36
|
-
- !ruby/object:Gem::Dependency
|
12
|
+
date: 2011-05-28 00:00:00.000000000Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
37
15
|
name: hoe
|
38
|
-
|
39
|
-
requirement: &id002 !ruby/object:Gem::Requirement
|
16
|
+
requirement: &7482744 !ruby/object:Gem::Requirement
|
40
17
|
none: false
|
41
|
-
requirements:
|
42
|
-
- -
|
43
|
-
- !ruby/object:Gem::Version
|
44
|
-
|
45
|
-
- 2
|
46
|
-
- 6
|
47
|
-
- 1
|
48
|
-
version: 2.6.1
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: 2.9.4
|
49
22
|
type: :development
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *7482744
|
25
|
+
description: ! "OCRA (One-Click Ruby Application) builds Windows executables from
|
26
|
+
Ruby\r\nsource code. The executable is a self-extracting, self-running\r\nexecutable
|
27
|
+
that contains the Ruby interpreter, your source code and\r\nany additionally needed
|
28
|
+
ruby libraries or DLL."
|
56
29
|
email: larsch@belunktum.dk
|
57
|
-
executables:
|
30
|
+
executables:
|
58
31
|
- ocra
|
59
32
|
extensions: []
|
60
|
-
|
61
|
-
extra_rdoc_files:
|
33
|
+
extra_rdoc_files:
|
62
34
|
- History.txt
|
63
35
|
- Manifest.txt
|
64
36
|
- README.rdoc
|
65
|
-
files:
|
37
|
+
files:
|
66
38
|
- History.txt
|
67
39
|
- Manifest.txt
|
68
40
|
- README.rdoc
|
@@ -74,40 +46,33 @@ files:
|
|
74
46
|
- share/ocra/edicon.exe
|
75
47
|
- test/test_ocra.rb
|
76
48
|
- lib/ocra.rb
|
77
|
-
|
49
|
+
- .gemtest
|
78
50
|
homepage: http://ocra.rubyforge.org/
|
79
51
|
licenses: []
|
80
|
-
|
81
52
|
post_install_message:
|
82
|
-
rdoc_options:
|
53
|
+
rdoc_options:
|
83
54
|
- --main
|
84
55
|
- README.rdoc
|
85
|
-
require_paths:
|
56
|
+
require_paths:
|
86
57
|
- lib
|
87
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
58
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
88
59
|
none: false
|
89
|
-
requirements:
|
90
|
-
- -
|
91
|
-
- !ruby/object:Gem::Version
|
92
|
-
|
93
|
-
|
94
|
-
version: "0"
|
95
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
60
|
+
requirements:
|
61
|
+
- - ! '>='
|
62
|
+
- !ruby/object:Gem::Version
|
63
|
+
version: '0'
|
64
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
96
65
|
none: false
|
97
|
-
requirements:
|
98
|
-
- -
|
99
|
-
- !ruby/object:Gem::Version
|
100
|
-
segments:
|
101
|
-
- 1
|
102
|
-
- 3
|
103
|
-
- 1
|
66
|
+
requirements:
|
67
|
+
- - ! '>'
|
68
|
+
- !ruby/object:Gem::Version
|
104
69
|
version: 1.3.1
|
105
70
|
requirements: []
|
106
|
-
|
107
71
|
rubyforge_project: ocra
|
108
|
-
rubygems_version: 1.
|
72
|
+
rubygems_version: 1.8.4
|
109
73
|
signing_key:
|
110
74
|
specification_version: 3
|
111
|
-
summary: OCRA (One-Click Ruby Application) builds Windows executables from Ruby
|
112
75
|
source code
|
113
|
-
|
76
|
+
summary: ! "OCRA (One-Click Ruby Application) builds Windows executables from Ruby\r
|
77
|
+
source code"
|
78
|
+
test_files:
|
114
79
|
- test/test_ocra.rb
|