ocra 1.3.10 → 1.3.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/History.txt +9 -0
- data/Manifest.txt +1 -1
- data/{README.rdoc → README.md} +109 -113
- data/Rakefile +24 -25
- data/bin/ocra +102 -74
- data/lib/ocra.rb +1 -1
- data/share/ocra/edicon.exe +0 -0
- data/share/ocra/lzma.exe +0 -0
- data/share/ocra/stub.exe +0 -0
- data/share/ocra/stubw.exe +0 -0
- data/test/test_ocra.rb +1 -1
- metadata +20 -14
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 33fd02398c27f8491311f8b7e3730c0fde066e5cd1dcc56345228356abef1745
|
4
|
+
data.tar.gz: 6fbd5d50421e8613cf94fa33533e578bbdb8fdd163fa9b99709ba202dfc9af78
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0f7d2a3bb8b879ba3d662152557f79a6f42798a50aa217cf23d1e6ee3cd46c791cf90e0c5fbcaf5b268700046f8f11c159421022f75116e209ca5b53401766f5
|
7
|
+
data.tar.gz: dd104a15c4dbb5e2cd8f96fbe174d24b381e4defd71b6f5c90f0d31feebbc0b46421ccc1e4170a98386b331b9b8d78d830720def9167d96c3d3c1fa02bfbfc25
|
data/History.txt
CHANGED
@@ -1,3 +1,12 @@
|
|
1
|
+
=== 1.3.11
|
2
|
+
|
3
|
+
* Support Ruby 2.2-2.7
|
4
|
+
* Add ruby2_keywords.rb to ignored modules
|
5
|
+
* Update lzma.exe to version 19.00
|
6
|
+
* Workaround for warning about deprecated Object#=~
|
7
|
+
* Use Fiddle instead of Win32API
|
8
|
+
* Fix for invalid argument to relative_path_from
|
9
|
+
|
1
10
|
=== 1.3.10
|
2
11
|
|
3
12
|
* Reduce memory usage while building & compressing (avoids out of
|
data/Manifest.txt
CHANGED
data/{README.rdoc → README.md}
RENAMED
@@ -1,24 +1,25 @@
|
|
1
|
-
|
1
|
+
# ocra
|
2
2
|
|
3
|
-
|
4
|
-
* Issue tracker: http://github.com/larsch/ocra/issues
|
5
|
-
* Google Group: http://groups.google.com/group/ruby-ocra
|
3
|
+
home :: https://github.com/larsch/ocra/
|
6
4
|
|
7
|
-
|
5
|
+
issues :: http://github.com/larsch/ocra/issues
|
6
|
+
|
7
|
+
forum :: http://groups.google.com/group/ruby-ocra
|
8
|
+
|
9
|
+
## Description
|
8
10
|
|
9
11
|
OCRA (One-Click Ruby Application) builds Windows executables from Ruby
|
10
12
|
source code. The executable is a self-extracting, self-running
|
11
13
|
executable that contains the Ruby interpreter, your source code and
|
12
14
|
any additionally needed ruby libraries or DLL.
|
13
15
|
|
14
|
-
|
16
|
+
## Features
|
15
17
|
|
16
18
|
* LZMA Compression (optional, default on)
|
17
|
-
* Ruby 1.8.7, 1.9.3, 2.0.0 and 2.1.5 support
|
18
19
|
* Both windowed/console mode supported
|
19
20
|
* Includes gems based on usage, or from a Bundler Gemfile
|
20
21
|
|
21
|
-
|
22
|
+
## Problems & Bug Reporiting
|
22
23
|
|
23
24
|
* Windows support only
|
24
25
|
|
@@ -27,11 +28,11 @@ the issue tracker on GitHub (http://github.com/larsch/ocra/issues).
|
|
27
28
|
You can also join the Google Group discussion forum to ask questions
|
28
29
|
and get help (http://groups.google.com/group/ruby-ocra).
|
29
30
|
|
30
|
-
|
31
|
+
## Installation
|
31
32
|
|
32
33
|
Gem:
|
33
34
|
|
34
|
-
|
35
|
+
gem install ocra
|
35
36
|
|
36
37
|
Alternatively you can download the gem at either
|
37
38
|
http://rubygems.org/gems/ocra or
|
@@ -41,23 +42,23 @@ Stand-alone Version: Get ocrasa.rb from
|
|
41
42
|
https://github.com/larsch/ocra/releases/. Requires nothing but a
|
42
43
|
working Ruby installation on Windows.
|
43
44
|
|
44
|
-
|
45
|
+
## Synopsis
|
45
46
|
|
46
|
-
|
47
|
+
### Building an executable:
|
47
48
|
|
48
|
-
|
49
|
+
ocra script.rb
|
49
50
|
|
50
|
-
Will package
|
51
|
+
Will package `script.rb`, the Ruby interpreter and all
|
51
52
|
dependencies (gems and DLLs) into an executable named
|
52
|
-
|
53
|
+
`script.exe`.
|
53
54
|
|
54
|
-
|
55
|
+
### Command line:
|
55
56
|
|
56
|
-
|
57
|
+
ocra [options] script.rb [<other files> ...] [-- <script arguments> ...]
|
57
58
|
|
58
|
-
|
59
|
+
### Options:
|
59
60
|
|
60
|
-
|
61
|
+
ocra --help
|
61
62
|
|
62
63
|
Ocra options:
|
63
64
|
|
@@ -81,23 +82,27 @@ Gem content detection modes:
|
|
81
82
|
--gem-full[=gem1,..] Include EVERYTHING
|
82
83
|
--gem-spec[=gem1,..] Include files in gemspec (Does not work with Rubygems 1.7+)
|
83
84
|
|
84
|
-
minimal: loaded scripts
|
85
|
-
guess: loaded scripts and other files
|
86
|
-
all: loaded scripts, other scripts, other files (except extras)
|
87
|
-
full: Everything found in the gem directory
|
88
|
-
|
89
85
|
--[no-]gem-scripts[=..] Other script files than those loaded
|
90
86
|
--[no-]gem-files[=..] Other files (e.g. data files)
|
91
87
|
--[no-]gem-extras[=..] Extra files (README, etc.)
|
92
88
|
|
93
|
-
|
94
|
-
|
95
|
-
|
89
|
+
Gem modes:
|
90
|
+
|
91
|
+
* *minimal*: loaded scripts
|
92
|
+
* *guess*: loaded scripts and other files
|
93
|
+
* *all*: loaded scripts, other scripts, other files (except extras)
|
94
|
+
* *full*: Everything found in the gem directory
|
95
|
+
|
96
|
+
File groups:
|
97
|
+
|
98
|
+
* *scripts*: .rb/.rbw files
|
99
|
+
* *extras*: C/C++ sources, object files, test, spec, README
|
100
|
+
* *files*: all other files
|
96
101
|
|
97
102
|
Auto-detection options:
|
98
103
|
|
99
104
|
--no-dep-run Don't run script.rb to check for dependencies.
|
100
|
-
|
105
|
+
--no-autoload Don't load/include script.rb's autoloads.
|
101
106
|
--no-autodll Disable detection of runtime DLL dependencies.
|
102
107
|
|
103
108
|
Output options:
|
@@ -116,9 +121,9 @@ Executable options:
|
|
116
121
|
--debug-extract Executable will unpack to local dir and not delete after.
|
117
122
|
|
118
123
|
|
119
|
-
|
124
|
+
### Compilation:
|
120
125
|
|
121
|
-
* OCRA will load your script (using
|
126
|
+
* OCRA will load your script (using `Kernel#load`) and build
|
122
127
|
the executable when it exits.
|
123
128
|
|
124
129
|
* Your program should 'require' all necessary files when invoked without
|
@@ -129,57 +134,49 @@ Executable options:
|
|
129
134
|
|
130
135
|
* .rb files will become console applications. .rbw files will become
|
131
136
|
windowed application (without a console window popping
|
132
|
-
up). Alternatively, use the
|
133
|
-
|
137
|
+
up). Alternatively, use the `--console` or
|
138
|
+
`--windows` options.
|
134
139
|
|
135
|
-
|
140
|
+
### Running your application:
|
136
141
|
|
137
142
|
* The 'current working directory' is not changed by OCRA when running
|
138
143
|
your application. You must change to the installation or temporary
|
139
144
|
directory yourself. See also below.
|
140
|
-
|
141
145
|
* When the application is running, the OCRA_EXECUTABLE environment
|
142
146
|
variable points to the .exe (with full path).
|
143
|
-
|
144
147
|
* The temporary location of the script can be obtained by inspected
|
145
148
|
the $0 variable.
|
146
|
-
|
147
|
-
|
148
|
-
File.dirname($0)</tt> at the start of your script if you need to
|
149
|
+
* OCRA does not set up the include path. Use `$:.unshift
|
150
|
+
File.dirname($0)` at the start of your script if you need to
|
149
151
|
'require' additional source files from the same directory as your
|
150
152
|
main script.
|
151
153
|
|
152
|
-
|
154
|
+
### Pitfalls:
|
153
155
|
|
154
156
|
* Avoid modifying load paths at run time. Specify load paths using -I
|
155
157
|
or RUBYLIB if you must, but don't expect OCRA to preserve them for
|
156
158
|
runtime. OCRA may pack sources into other directories than you
|
157
159
|
expect.
|
158
|
-
|
159
|
-
* If you use .rbw files or the <tt>--windows</tt> option, then check
|
160
|
+
* If you use .rbw files or the `--windows` option, then check
|
160
161
|
that your application works with rubyw.exe before trying with OCRA.
|
161
|
-
|
162
162
|
* Avoid absolute paths in your code and when invoking OCRA.
|
163
163
|
|
164
|
-
|
164
|
+
## REQUIREMENTS:
|
165
165
|
|
166
166
|
* Windows
|
167
|
-
|
168
|
-
* Working Ruby installation. Ocra is tested with RubyInstaller
|
169
|
-
1.8.7p374, 1.9.3p545, and 2.0.0p481 (32 and 64 bit).
|
170
|
-
|
167
|
+
* Working Ruby installation.
|
171
168
|
* MinGW Installation (when working with the source code only)
|
172
169
|
|
173
|
-
|
170
|
+
### Stand-alone version
|
174
171
|
|
175
172
|
Get ocrasa.rb from http://rubyforge.org/frs/?group_id=8185. Requires
|
176
173
|
nothing but a working Ruby installation on Windows.
|
177
174
|
|
178
|
-
|
175
|
+
## Technical details
|
179
176
|
|
180
177
|
OCRA first runs the target script in order to detect any files that
|
181
|
-
are loaded and used at runtime (Using
|
182
|
-
|
178
|
+
are loaded and used at runtime (Using `Kernel#require` and
|
179
|
+
`Kernel#load`).
|
183
180
|
|
184
181
|
OCRA embeds everything needed to run a Ruby script into a single
|
185
182
|
executable file. The file contains the .exe stub which is compiled
|
@@ -193,9 +190,9 @@ scripts into a temporary directory. The directory will contains the
|
|
193
190
|
same directory layout as your Ruby installlation. The source files for
|
194
191
|
your application will be put in the 'src' subdirectory.
|
195
192
|
|
196
|
-
|
193
|
+
### Libraries
|
197
194
|
|
198
|
-
Any code that is loaded through
|
195
|
+
Any code that is loaded through `Kernel#require` when your
|
199
196
|
script is executed will be included in the OCRA
|
200
197
|
executable. Conditionally loaded code will not be loaded and included
|
201
198
|
in the executable unless the code is actually run when OCRA invokes
|
@@ -211,13 +208,13 @@ gems using --gem-*=gemname.
|
|
211
208
|
|
212
209
|
Libraries found in non-standard path (for example, if you invoke OCRA
|
213
210
|
with "ruby -I some/path") will be placed into the site dir
|
214
|
-
(lib/ruby/site_ruby). Avoid changing
|
215
|
-
|
211
|
+
(lib/ruby/site_ruby). Avoid changing `$LOAD_PATH` or
|
212
|
+
`$:` from your script to include paths outside your source
|
216
213
|
tree, since OCRA may place the files elsewhere when extracted into the
|
217
214
|
temporary directory.
|
218
215
|
|
219
216
|
In case your script (or any of its dependencies) sets up autoloaded
|
220
|
-
module using
|
217
|
+
module using `Kernel#autoload`, OCRA will automatically try to
|
221
218
|
load them to ensure that they are all included in the
|
222
219
|
executable. Modules that doesn't exist will be ignored (a warning will
|
223
220
|
be logged).
|
@@ -225,19 +222,19 @@ be logged).
|
|
225
222
|
Dynamic link libraries (.dll files, for example WxWidgets, or other
|
226
223
|
source files) will be detected and included by OCRA.
|
227
224
|
|
228
|
-
|
225
|
+
### Including libraries non-automatically
|
229
226
|
|
230
227
|
If an application or framework is complicated enough that it tends
|
231
228
|
to confuse Ocra's automatic dependency resolution, then you can
|
232
229
|
use other means to specify what needs to be packaged with your app.
|
233
230
|
|
234
|
-
To disable automatic dependency resolution, use the
|
231
|
+
To disable automatic dependency resolution, use the `--no-dep-run`
|
235
232
|
option; with it, Ocra will skip executing your program during the
|
236
|
-
build process. This on the other hand requires using
|
233
|
+
build process. This on the other hand requires using `--gem-full` option
|
237
234
|
(see more below); otherwise Ocra will not include all the necessary
|
238
235
|
files for the gems.
|
239
236
|
|
240
|
-
You will also probably need to use the
|
237
|
+
You will also probably need to use the `--add-all-core` option to
|
241
238
|
include the Ruby core libraries.
|
242
239
|
|
243
240
|
If your app uses gems, then you can specify them in a
|
@@ -254,16 +251,17 @@ directory "someapp" and create an exe named "someapp.exe", without
|
|
254
251
|
actually running the app during the build, you could use the
|
255
252
|
following command:
|
256
253
|
|
257
|
-
|
258
|
-
|
254
|
+
ocra someapp/script/rails someapp --output someapp.exe --add-all-core \
|
255
|
+
--gemfile someapp/Gemfile --no-dep-run --gem-full --chdir-first -- server
|
259
256
|
|
260
|
-
Note the space between
|
257
|
+
Note the space between `--` and `server`! It's important; `server` is
|
258
|
+
an argument to be passed to rails when the script is ran.
|
261
259
|
|
262
260
|
Rails 2 apps can be packaged similarly, though you will have to
|
263
261
|
integrate them with Bundler (http://gembundler.com/rails23.html)
|
264
262
|
first.
|
265
263
|
|
266
|
-
|
264
|
+
### Gem handling
|
267
265
|
|
268
266
|
By default, Ocra includes all scripts that are loaded by your script
|
269
267
|
when it is run before packaging. Ocra detects which gems are using and
|
@@ -274,17 +272,17 @@ tests, specs, etc.
|
|
274
272
|
This behaviour can be changed by using the --gem-* options. There are
|
275
273
|
four possible modes:
|
276
274
|
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
275
|
+
* *minimal*: Include only loaded scripts
|
276
|
+
* *guess*: Include loaded scripts and important files (DEFAULT)
|
277
|
+
* *all*: Include all scripts and important files
|
278
|
+
* *full*: Include all files
|
281
279
|
|
282
280
|
If you find that files are missing from the resulting executable, try
|
283
281
|
first with --gem-all=gemname for the gem that is missing, and if that
|
284
282
|
does not work, try --gem-full=gemname. The paranoid can use --gem-full
|
285
283
|
to include all files for all required gems.
|
286
284
|
|
287
|
-
|
285
|
+
### Creating an installer for your application
|
288
286
|
|
289
287
|
To make your application start up quicker, or to allow it to
|
290
288
|
keep files in its application directory between runs, or if
|
@@ -295,12 +293,12 @@ for your app with the free Inno Setup software.
|
|
295
293
|
You will first have to download and install Inno Setup 5 or
|
296
294
|
later, and also add its directory to your PATH (so that Ocra
|
297
295
|
can find the ISCC compiler program). Once you've done that,
|
298
|
-
you can use the
|
296
|
+
you can use the `--innosetup` option to Ocra to supply an
|
299
297
|
Inno Setup script. Do not add any [Files] or [Dirs] sections
|
300
298
|
to the script; Ocra will figure those out itself.
|
301
299
|
|
302
300
|
To continue the Rails example above, let's package the Rails 3
|
303
|
-
app into an installer. Save the following as
|
301
|
+
app into an installer. Save the following as `someapp.iss`:
|
304
302
|
|
305
303
|
[Setup]
|
306
304
|
AppName=SomeApp
|
@@ -315,14 +313,14 @@ app into an installer. Save the following as "<tt>someapp.iss</tt>":
|
|
315
313
|
|
316
314
|
Then, run Ocra with this command:
|
317
315
|
|
318
|
-
|
319
|
-
|
320
|
-
|
316
|
+
ocra someapp/script/rails someapp --output someapp.exe --add-all-core \
|
317
|
+
--gemfile someapp/Gemfile --no-dep-run --gem-full --chdir-first --no-lzma \
|
318
|
+
--innosetup someapp.iss -- server
|
321
319
|
|
322
320
|
If all goes well, a file named "SomeAppInstaller.exe" will be placed
|
323
321
|
into the Output directory.
|
324
322
|
|
325
|
-
|
323
|
+
### Environment variables
|
326
324
|
|
327
325
|
OCRA executables clear the RUBYLIB environment variable before your
|
328
326
|
script is launched. This is done to ensure that your script does not
|
@@ -336,69 +334,67 @@ executables.
|
|
336
334
|
OCRA executables set OCRA_EXECUTABLE to the full path of the
|
337
335
|
executable, for example
|
338
336
|
|
339
|
-
|
337
|
+
ENV["OCRA_EXECUTABLE"] # => C:\Program Files\MyApp\MyApp.exe
|
340
338
|
|
341
|
-
|
339
|
+
### Working directory
|
342
340
|
|
343
341
|
The OCRA executable does not change the working directory when it is
|
344
|
-
launched, unless you use the
|
342
|
+
launched, unless you use the `--chdir-first` option.
|
345
343
|
|
346
344
|
You should not assume that the current working directory when invoking
|
347
345
|
an executable built with .exe is the location of the source script. It
|
348
346
|
can be the directory where the executable is placed (when invoked
|
349
347
|
through the Windows Explorer), the users' current working directory
|
350
348
|
(when invoking from the Command Prompt), or even
|
351
|
-
|
349
|
+
`C:\\WINDOWS\\SYSTEM32` when the executable is invoked through
|
352
350
|
a file association.
|
353
351
|
|
354
|
-
With the
|
352
|
+
With the `--chdir-first` option, the working directory will
|
355
353
|
always be the common parent directory of your source files. This
|
356
354
|
should be fine for most applications. However, if your application
|
357
355
|
is designed to run from the command line and take filenames as
|
358
356
|
arguments, then you cannot use this option.
|
359
357
|
|
360
358
|
If you wish to maintain the user's working directory, but need to
|
361
|
-
|
359
|
+
`require` additional Ruby scripts from the source directory, you can
|
362
360
|
add the following line to your script:
|
363
361
|
|
364
|
-
|
362
|
+
$LOAD_PATH.unshift File.dirname($0)
|
365
363
|
|
366
|
-
|
364
|
+
### Load path mangling
|
367
365
|
|
368
|
-
Adding paths to
|
366
|
+
Adding paths to `$LOAD_PATH` or `$:` at runtime is not
|
369
367
|
recommended. Adding relative load paths depends on the working
|
370
368
|
directory being the same as where the script is located (See
|
371
369
|
above). If you have additional library files in directories below the
|
372
370
|
directory containing your source script you can use this idiom:
|
373
371
|
|
374
|
-
|
372
|
+
$LOAD_PATH.unshift File.join(File.dirname($0), 'path/to/script')
|
375
373
|
|
376
|
-
|
374
|
+
### Detecting
|
377
375
|
|
378
376
|
You can detect whether OCRA is currently building your script by
|
379
377
|
looking for the 'Ocra' constant. If it is defined, OCRA is currenly
|
380
378
|
building the executable from your script. For example, you can use
|
381
379
|
this to avoid opening a GUI window when compiling executables:
|
382
380
|
|
383
|
-
|
384
|
-
|
385
|
-
app.main_loop
|
386
|
-
end
|
381
|
+
app = MyApp.new
|
382
|
+
app.main_loop unless defined?(Ocra)
|
387
383
|
|
388
|
-
|
384
|
+
### Additional files and resources
|
389
385
|
|
390
386
|
You can add additional files to the OCRA executable (for example
|
391
387
|
images) by appending them to the command line. They should be placed
|
392
388
|
in the source directory with your main script (or a subdirectory).
|
393
389
|
|
394
|
-
|
390
|
+
ocra mainscript.rb someimage.jpeg docs/document.txt
|
395
391
|
|
396
392
|
This will create the following layout in the temporary directory when
|
397
393
|
your program is executed:
|
398
394
|
|
399
|
-
|
400
|
-
|
401
|
-
|
395
|
+
src/mainscript.rb
|
396
|
+
src/someimage.jpeg
|
397
|
+
src/docs/document.txt
|
402
398
|
|
403
399
|
Both files, directoriess and glob patterns can be specified on the
|
404
400
|
command line. Files will be added as-is. If a directory is specified,
|
@@ -406,22 +402,22 @@ OCRA will include all files found below that directory. Glob patterns
|
|
406
402
|
(See Dir.glob) can be used to specify a specific set of files, for
|
407
403
|
example:
|
408
404
|
|
409
|
-
|
405
|
+
ocra script.rb assets/**/*.png
|
410
406
|
|
411
|
-
|
407
|
+
### Command Line Arguments
|
412
408
|
|
413
409
|
To pass command line argument to your script (both while building and
|
414
410
|
when run from the resulting executable), specify them after a
|
415
|
-
|
411
|
+
`--` marker. For example:
|
416
412
|
|
417
|
-
|
413
|
+
ocra script.rb -- --some-options=value
|
418
414
|
|
419
|
-
This will pass
|
415
|
+
This will pass `--some-options=value` to the script when
|
420
416
|
build and when running the executable. Any extra argument specified by
|
421
417
|
the user when invoking the executable will be appended after the
|
422
418
|
compile-time arguments.
|
423
419
|
|
424
|
-
|
420
|
+
### Window/Console
|
425
421
|
|
426
422
|
By default, OCRA builds console application from .rb-files and
|
427
423
|
windowed applications (without console window) from .rbw-files.
|
@@ -429,10 +425,10 @@ windowed applications (without console window) from .rbw-files.
|
|
429
425
|
Ruby on Windows provides two executables: ruby.exe is a console mode
|
430
426
|
application and rubyw.exe is a windowed application which does not
|
431
427
|
bring up a console window when launched using the Windows Explorer.
|
432
|
-
By default, or if the
|
428
|
+
By default, or if the `--console` option is used, OCRA will
|
433
429
|
use the console runtime (ruby.exe). OCRA will automatically select the
|
434
430
|
windowed runtime when your script has the ".rbw" extension, or if you
|
435
|
-
specify the
|
431
|
+
specify the `--windows` command line option.
|
436
432
|
|
437
433
|
If your application works in console mode but not in windowed mode,
|
438
434
|
first check if your script works without OCRA using rubyw.exe. A
|
@@ -443,16 +439,16 @@ buffers run full).
|
|
443
439
|
You can also try wrapping your script in an exception handler that
|
444
440
|
logs any errors to a file:
|
445
441
|
|
446
|
-
|
447
|
-
|
448
|
-
|
449
|
-
|
450
|
-
|
451
|
-
|
442
|
+
begin
|
443
|
+
# your script here
|
444
|
+
rescue Exception => e
|
445
|
+
File.open("except.log") do |f|
|
446
|
+
f.puts e.inspect
|
447
|
+
f.puts e.backtrace
|
448
|
+
end
|
452
449
|
end
|
453
|
-
end
|
454
450
|
|
455
|
-
|
451
|
+
## CREDITS:
|
456
452
|
|
457
453
|
Thanks for Igor Pavlov for the LZMA compressor and decompressor. The
|
458
454
|
source code used was place into Public Domain by Igor Pavlov.
|
@@ -462,11 +458,11 @@ Erik Veenstra for rubyscript2exe which provided inspiration.
|
|
462
458
|
Dice for the default .exe icon (vit-ruby.ico,
|
463
459
|
http://ruby.morphball.net/vit-ruby-ico_en.html)
|
464
460
|
|
465
|
-
|
461
|
+
## LICENSE:
|
466
462
|
|
467
463
|
(The MIT License)
|
468
464
|
|
469
|
-
Copyright (c) 2009-
|
465
|
+
Copyright (c) 2009-2020 Lars Christensen
|
470
466
|
|
471
467
|
Permission is hereby granted, free of charge, to any person obtaining
|
472
468
|
a copy of this software and associated documentation files (the
|
data/Rakefile
CHANGED
@@ -1,66 +1,66 @@
|
|
1
1
|
# -*- ruby -*-
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
3
|
+
require "rubygems"
|
4
|
+
require "hoe"
|
5
5
|
|
6
6
|
Hoe.plugin :minitest
|
7
7
|
|
8
|
-
spec = Hoe.spec
|
8
|
+
spec = Hoe.spec "ocra" do
|
9
9
|
developer "Lars Christensen", "larsch@belunktum.dk"
|
10
10
|
license "MIT"
|
11
11
|
end
|
12
12
|
|
13
|
-
spec.urls.each { |url| url.chomp! }
|
13
|
+
spec.urls.each { |key, url| url.chomp! }
|
14
14
|
|
15
15
|
task :build_stub do
|
16
16
|
sh "mingw32-make -C src"
|
17
|
-
cp
|
18
|
-
cp
|
19
|
-
cp
|
17
|
+
cp "src/stub.exe", "share/ocra/stub.exe"
|
18
|
+
cp "src/stubw.exe", "share/ocra/stubw.exe"
|
19
|
+
cp "src/edicon.exe", "share/ocra/edicon.exe"
|
20
20
|
end
|
21
21
|
|
22
|
-
file
|
23
|
-
file
|
24
|
-
file
|
22
|
+
file "share/ocra/stub.exe" => :build_stub
|
23
|
+
file "share/ocra/stubw.exe" => :build_stub
|
24
|
+
file "share/ocra/edicon.exe" => :build_stub
|
25
25
|
|
26
26
|
task :test => :build_stub
|
27
27
|
|
28
|
-
task :standalone => [
|
28
|
+
task :standalone => ["bin/ocrasa.rb"]
|
29
29
|
|
30
|
-
standalone_zip = "bin/ocrasa-#{ENV[
|
30
|
+
standalone_zip = "bin/ocrasa-#{ENV["VERSION"]}.zip"
|
31
31
|
|
32
|
-
file standalone_zip =>
|
33
|
-
chdir
|
34
|
-
sh "zip", "ocrasa-#{ENV[
|
32
|
+
file standalone_zip => "bin/ocrasa.rb" do
|
33
|
+
chdir "bin" do
|
34
|
+
sh "zip", "ocrasa-#{ENV["VERSION"]}.zip", "ocrasa.rb"
|
35
35
|
end
|
36
36
|
end
|
37
37
|
|
38
38
|
task :release_standalone => standalone_zip do
|
39
|
-
load
|
39
|
+
load "bin/ocra"
|
40
40
|
sh "rubyforge add_release ocra ocra-standalone #{Ocra::VERSION} #{standalone_zip}"
|
41
41
|
end
|
42
42
|
|
43
|
-
file
|
44
|
-
cp
|
43
|
+
file "bin/ocrasa.rb" => ["bin/ocra", "share/ocra/stub.exe", "share/ocra/stubw.exe", "share/ocra/lzma.exe", "share/ocra/edicon.exe"] do
|
44
|
+
cp "bin/ocra", "bin/ocrasa.rb"
|
45
45
|
File.open("bin/ocrasa.rb", "a") do |f|
|
46
46
|
f.puts "__END__"
|
47
47
|
|
48
|
-
stub = File.open("share/ocra/stub.exe", "rb") {|g| g.read}
|
48
|
+
stub = File.open("share/ocra/stub.exe", "rb") { |g| g.read }
|
49
49
|
stub64 = [stub].pack("m")
|
50
50
|
f.puts stub64.size
|
51
51
|
f.puts stub64
|
52
52
|
|
53
|
-
stub = File.open("share/ocra/stubw.exe", "rb") {|g| g.read}
|
53
|
+
stub = File.open("share/ocra/stubw.exe", "rb") { |g| g.read }
|
54
54
|
stub64 = [stub].pack("m")
|
55
55
|
f.puts stub64.size
|
56
56
|
f.puts stub64
|
57
57
|
|
58
|
-
lzma = File.open("share/ocra/lzma.exe", "rb") {|g| g.read}
|
58
|
+
lzma = File.open("share/ocra/lzma.exe", "rb") { |g| g.read }
|
59
59
|
lzma64 = [lzma].pack("m")
|
60
60
|
f.puts lzma64.size
|
61
61
|
f.puts lzma64
|
62
62
|
|
63
|
-
lzma = File.open("share/ocra/edicon.exe", "rb") {|g| g.read}
|
63
|
+
lzma = File.open("share/ocra/edicon.exe", "rb") { |g| g.read }
|
64
64
|
lzma64 = [lzma].pack("m")
|
65
65
|
f.puts lzma64.size
|
66
66
|
f.puts lzma64
|
@@ -74,14 +74,13 @@ task :clean do
|
|
74
74
|
end
|
75
75
|
|
76
76
|
task :test_standalone => :standalone do
|
77
|
-
ENV[
|
77
|
+
ENV["TESTED_OCRA"] = "ocrasa.rb"
|
78
78
|
system("rake test")
|
79
|
-
ENV[
|
79
|
+
ENV["TESTED_OCRA"] = nil
|
80
80
|
end
|
81
81
|
|
82
82
|
task :release_docs => :redocs do
|
83
83
|
sh "pscp -r doc/* larsch@ocra.rubyforge.org:/var/www/gforge-projects/ocra"
|
84
84
|
end
|
85
85
|
|
86
|
-
|
87
86
|
# vim: syntax=Ruby
|
data/bin/ocra
CHANGED
@@ -8,7 +8,7 @@ module Ocra
|
|
8
8
|
# separators.
|
9
9
|
class Pathname
|
10
10
|
def Pathname.pwd
|
11
|
-
Pathname.new(Dir.pwd.encode(
|
11
|
+
Pathname.new(Dir.pwd.encode("UTF-8"))
|
12
12
|
end
|
13
13
|
|
14
14
|
def Pathname.pathequal(a, b)
|
@@ -23,7 +23,7 @@ module Ocra
|
|
23
23
|
ABSOLUTE_PAT = /\A([A-Z]:)?#{SEPARATOR_PAT}/i
|
24
24
|
|
25
25
|
def initialize(path)
|
26
|
-
@path = path && path.encode(
|
26
|
+
@path = path && path.encode("UTF-8")
|
27
27
|
end
|
28
28
|
|
29
29
|
def to_native
|
@@ -45,8 +45,8 @@ module Ocra
|
|
45
45
|
b.shift
|
46
46
|
end
|
47
47
|
return other if Pathname.new(b.first).absolute?
|
48
|
-
b.size.times { a.unshift
|
49
|
-
return Pathname.new(a.join(
|
48
|
+
b.size.times { a.unshift ".." }
|
49
|
+
return Pathname.new(a.join("/"))
|
50
50
|
end
|
51
51
|
|
52
52
|
# Determines if 'src' is contained in 'tgt' (i.e. it is a subpath of
|
@@ -66,7 +66,7 @@ module Ocra
|
|
66
66
|
if other.absolute?
|
67
67
|
other
|
68
68
|
else
|
69
|
-
Ocra.Pathname(@path +
|
69
|
+
Ocra.Pathname(@path + "/" + other.path)
|
70
70
|
end
|
71
71
|
end
|
72
72
|
|
@@ -87,7 +87,7 @@ module Ocra
|
|
87
87
|
end
|
88
88
|
|
89
89
|
def entries
|
90
|
-
Dir.entries(@path).map { |e| self / e.encode(
|
90
|
+
Dir.entries(@path).map { |e| self / e.encode("UTF-8") }
|
91
91
|
end
|
92
92
|
|
93
93
|
# Recursively find all files which match a specified regular
|
@@ -147,28 +147,35 @@ module Ocra
|
|
147
147
|
module Host
|
148
148
|
class << self
|
149
149
|
def exec_prefix
|
150
|
-
@exec_prefix ||= Ocra.Pathname(RbConfig::CONFIG[
|
150
|
+
@exec_prefix ||= Ocra.Pathname(RbConfig::CONFIG["exec_prefix"])
|
151
151
|
end
|
152
|
+
|
152
153
|
def sitelibdir
|
153
|
-
@sitelibdir ||= Ocra.Pathname(RbConfig::CONFIG[
|
154
|
+
@sitelibdir ||= Ocra.Pathname(RbConfig::CONFIG["sitelibdir"])
|
154
155
|
end
|
156
|
+
|
155
157
|
def bindir
|
156
|
-
@bindir ||= Ocra.Pathname(RbConfig::CONFIG[
|
158
|
+
@bindir ||= Ocra.Pathname(RbConfig::CONFIG["bindir"])
|
157
159
|
end
|
160
|
+
|
158
161
|
def libruby_so
|
159
|
-
@libruby_so ||= Ocra.Pathname(RbConfig::CONFIG[
|
162
|
+
@libruby_so ||= Ocra.Pathname(RbConfig::CONFIG["LIBRUBY_SO"])
|
160
163
|
end
|
164
|
+
|
161
165
|
def exeext
|
162
|
-
RbConfig::CONFIG[
|
166
|
+
RbConfig::CONFIG["EXEEXT"] || ".exe"
|
163
167
|
end
|
168
|
+
|
164
169
|
def rubyw_exe
|
165
|
-
@rubyw_exe ||= (RbConfig::CONFIG[
|
170
|
+
@rubyw_exe ||= (RbConfig::CONFIG["rubyw_install_name"] || "rubyw") + exeext
|
166
171
|
end
|
172
|
+
|
167
173
|
def ruby_exe
|
168
|
-
@ruby_exe ||= (RbConfig::CONFIG[
|
174
|
+
@ruby_exe ||= (RbConfig::CONFIG["ruby_install_name"] || "ruby") + exeext
|
169
175
|
end
|
176
|
+
|
170
177
|
def tempdir
|
171
|
-
@tempdir ||= Ocra.Pathname(ENV[
|
178
|
+
@tempdir ||= Ocra.Pathname(ENV["TEMP"])
|
172
179
|
end
|
173
180
|
end
|
174
181
|
end
|
@@ -179,9 +186,9 @@ module Ocra
|
|
179
186
|
a.sort.inject([]) { |r, e| r.last == e ? r : r << e }
|
180
187
|
end
|
181
188
|
|
182
|
-
VERSION = "1.3.
|
189
|
+
VERSION = "1.3.11"
|
183
190
|
|
184
|
-
|
191
|
+
IGNORE_MODULE_NAMES = /\/(enumerator.so|rational.so|complex.so|thread.rb|ruby2_keywords.rb)$/
|
185
192
|
|
186
193
|
GEM_SCRIPT_RE = /\.rbw?$/
|
187
194
|
GEM_EXTRA_RE = %r{(
|
@@ -202,11 +209,13 @@ module Ocra
|
|
202
209
|
# Alias for the temporary directory where files are extracted.
|
203
210
|
TEMPDIR_ROOT = Pathname.new("|")
|
204
211
|
# Directory for source files in temporary directory.
|
205
|
-
SRCDIR = Pathname.new(
|
212
|
+
SRCDIR = Pathname.new("src")
|
206
213
|
# Directory for Ruby binaries in temporary directory.
|
207
|
-
BINDIR = Pathname.new(
|
214
|
+
BINDIR = Pathname.new("bin")
|
208
215
|
# Directory for GEMHOME files in temporary directory.
|
209
|
-
GEMHOMEDIR = Pathname.new(
|
216
|
+
GEMHOMEDIR = Pathname.new("gemhome")
|
217
|
+
|
218
|
+
IGNORE_MODULES = []
|
210
219
|
|
211
220
|
@options = {
|
212
221
|
:lzma_mode => true,
|
@@ -230,7 +239,7 @@ module Ocra
|
|
230
239
|
:debug_extract => false,
|
231
240
|
:arg => [],
|
232
241
|
:enc => true,
|
233
|
-
:gem => []
|
242
|
+
:gem => [],
|
234
243
|
}
|
235
244
|
|
236
245
|
@options.each_key { |opt| eval("def self.#{opt}; @options[:#{opt}]; end") }
|
@@ -281,17 +290,17 @@ module Ocra
|
|
281
290
|
@stubimage = get_next_embedded_image
|
282
291
|
@stubwimage = get_next_embedded_image
|
283
292
|
lzmaimage = get_next_embedded_image
|
284
|
-
@lzmapath = Host.tempdir /
|
293
|
+
@lzmapath = Host.tempdir / "lzma.exe"
|
285
294
|
File.open(@lzmapath, "wb") { |file| file << lzmaimage }
|
286
295
|
ediconimage = get_next_embedded_image
|
287
|
-
@ediconpath = Host.tempdir /
|
296
|
+
@ediconpath = Host.tempdir / "edicon.exe"
|
288
297
|
File.open(@ediconpath, "wb") { |file| file << ediconimage }
|
289
298
|
else
|
290
299
|
ocrapath = Pathname(File.dirname(__FILE__))
|
291
|
-
@stubimage = File.open(ocrapath /
|
292
|
-
@stubwimage = File.open(ocrapath /
|
293
|
-
@lzmapath = (ocrapath /
|
294
|
-
@ediconpath = (ocrapath /
|
300
|
+
@stubimage = File.open(ocrapath / "../share/ocra/stub.exe", "rb") { |file| file.read }
|
301
|
+
@stubwimage = File.open(ocrapath / "../share/ocra/stubw.exe", "rb") { |file| file.read }
|
302
|
+
@lzmapath = (ocrapath / "../share/ocra/lzma.exe").expand
|
303
|
+
@ediconpath = (ocrapath / "../share/ocra/edicon.exe").expand
|
295
304
|
end
|
296
305
|
end
|
297
306
|
|
@@ -408,7 +417,7 @@ EOF
|
|
408
417
|
when /\A--(no-)?gem-(\w+)(?:=(.*))?$/
|
409
418
|
negate, group, list = $1, $2, $3
|
410
419
|
@options[:gem] ||= []
|
411
|
-
@options[:gem] << [negate, group.to_sym, list && list.split(",")
|
420
|
+
@options[:gem] << [negate, group.to_sym, list && list.split(",")]
|
412
421
|
when /\A--help\z/, /\A--./
|
413
422
|
puts usage
|
414
423
|
exit 0
|
@@ -439,7 +448,7 @@ EOF
|
|
439
448
|
end
|
440
449
|
|
441
450
|
@options[:files].map! { |path|
|
442
|
-
path = path.encode(
|
451
|
+
path = path.encode("UTF-8").tr('\\', "/")
|
443
452
|
if File.directory?(path)
|
444
453
|
# If a directory is passed, we want all files under that directory
|
445
454
|
path = "#{path}/**/*"
|
@@ -454,6 +463,7 @@ EOF
|
|
454
463
|
save_environment
|
455
464
|
parseargs(argv)
|
456
465
|
find_stubs
|
466
|
+
IGNORE_MODULES.push(*ObjectSpace.each_object(Module).to_a)
|
457
467
|
end
|
458
468
|
|
459
469
|
# Force loading autoloaded constants. Searches through all modules
|
@@ -461,6 +471,7 @@ EOF
|
|
461
471
|
# ones, then attempts to load them.
|
462
472
|
def Ocra.attempt_load_autoload
|
463
473
|
modules_checked = {}
|
474
|
+
IGNORE_MODULES.each { |m| modules_checked[m] = true }
|
464
475
|
loop do
|
465
476
|
modules_to_check = []
|
466
477
|
ObjectSpace.each_object(Module) do |mod|
|
@@ -555,7 +566,7 @@ EOF
|
|
555
566
|
if Ocra.gemfile
|
556
567
|
Ocra.msg "Scanning Gemfile"
|
557
568
|
# Load Rubygems and Bundler so we can scan the Gemfile
|
558
|
-
[
|
569
|
+
["rubygems", "bundler"].each do |lib|
|
559
570
|
begin
|
560
571
|
require lib
|
561
572
|
rescue LoadError
|
@@ -563,13 +574,13 @@ EOF
|
|
563
574
|
end
|
564
575
|
end
|
565
576
|
|
566
|
-
ENV[
|
577
|
+
ENV["BUNDLE_GEMFILE"] = Ocra.gemfile
|
567
578
|
Bundler.load.specs.each do |spec|
|
568
579
|
Ocra.verbose_msg "From Gemfile, adding gem #{spec.full_name}"
|
569
580
|
gems[spec.name] ||= spec
|
570
581
|
end
|
571
582
|
|
572
|
-
unless gems.any?{|
|
583
|
+
unless gems.any? { |name, spec| name == "bundler" }
|
573
584
|
# Bundler itself wasn't added for some reason, let's put it in directly
|
574
585
|
Ocra.verbose_msg "From Gemfile, forcing inclusion of bundler gem itself"
|
575
586
|
bundler_spec = Gem.loaded_specs["bundler"]
|
@@ -599,8 +610,8 @@ EOF
|
|
599
610
|
geminstallpath = Pathname(gempath) / "gems"
|
600
611
|
if feature.subpath?(geminstallpath)
|
601
612
|
gemlocalpath = feature.relative_path_from(geminstallpath)
|
602
|
-
fullgemname = gemlocalpath.path.split(
|
603
|
-
gemspecpath = gempath /
|
613
|
+
fullgemname = gemlocalpath.path.split("/").first
|
614
|
+
gemspecpath = gempath / "specifications" / "#{fullgemname}.gemspec"
|
604
615
|
if spec = Gem::Specification.load(gemspecpath)
|
605
616
|
gems[spec.name] ||= spec
|
606
617
|
features_from_gems << feature
|
@@ -617,20 +628,20 @@ EOF
|
|
617
628
|
@gemspecs << Pathname(spec.spec_file) if File.exist?(spec.spec_file)
|
618
629
|
|
619
630
|
# Determine which set of files to include for this particular gem
|
620
|
-
include = [
|
631
|
+
include = [:loaded, :files]
|
621
632
|
Ocra.gem.each do |negate, option, list|
|
622
633
|
if list.nil? or list.include?(spec.name)
|
623
634
|
case option
|
624
635
|
when :minimal
|
625
|
-
include = [
|
636
|
+
include = [:loaded]
|
626
637
|
when :guess
|
627
|
-
include = [
|
638
|
+
include = [:loaded, :files]
|
628
639
|
when :all
|
629
|
-
include = [
|
640
|
+
include = [:scripts, :files]
|
630
641
|
when :full
|
631
|
-
include = [
|
642
|
+
include = [:scripts, :files, :extras]
|
632
643
|
when :spec
|
633
|
-
include = [
|
644
|
+
include = [:spec]
|
634
645
|
when :scripts
|
635
646
|
if negate
|
636
647
|
include.delete(:scripts)
|
@@ -653,12 +664,12 @@ EOF
|
|
653
664
|
end
|
654
665
|
end
|
655
666
|
|
656
|
-
Ocra.msg "Detected gem #{spec.full_name} (#{include.join(
|
667
|
+
Ocra.msg "Detected gem #{spec.full_name} (#{include.join(", ")})"
|
657
668
|
|
658
669
|
gem_root = Pathname(spec.gem_dir)
|
659
|
-
gem_extension = (gem_root /
|
670
|
+
gem_extension = (gem_root / ".." / ".." / "extensions").expand
|
660
671
|
if gem_extension.exist?
|
661
|
-
build_complete = gem_extension.find_all_files(/gem.build_complete/).select{|p| p.dirname.basename.to_s == spec.full_name}
|
672
|
+
build_complete = gem_extension.find_all_files(/gem.build_complete/).select { |p| p.dirname.basename.to_s == spec.full_name }
|
662
673
|
else
|
663
674
|
build_complete = nil
|
664
675
|
end
|
@@ -729,12 +740,12 @@ EOF
|
|
729
740
|
|
730
741
|
# Find gemspecs to include
|
731
742
|
if defined?(Gem)
|
732
|
-
@gemspecs = Gem.loaded_specs.map { |name,info| Pathname(info.loaded_from) }
|
743
|
+
@gemspecs = Gem.loaded_specs.map { |name, info| Pathname(info.loaded_from) }
|
733
744
|
else
|
734
745
|
@gemspecs = []
|
735
746
|
end
|
736
747
|
|
737
|
-
require
|
748
|
+
require "rbconfig"
|
738
749
|
instsitelibdir = Host.sitelibdir.relative_path_from(Host.exec_prefix)
|
739
750
|
|
740
751
|
load_path = []
|
@@ -754,7 +765,7 @@ EOF
|
|
754
765
|
encpath = path / "enc"
|
755
766
|
if encpath.exist?
|
756
767
|
encfiles = encpath.find_all_files(/\.so$/)
|
757
|
-
size = encfiles.inject(0) { |sum,pn| sum + pn.size }
|
768
|
+
size = encfiles.inject(0) { |sum, pn| sum + pn.size }
|
758
769
|
Ocra.msg "Including #{encfiles.size} encoding support files (#{size} bytes, use --no-enc to exclude)"
|
759
770
|
features.push(*encfiles)
|
760
771
|
end
|
@@ -780,12 +791,12 @@ EOF
|
|
780
791
|
if fullpath.subpath?(Host.exec_prefix)
|
781
792
|
# Features found in the Ruby installation are put in the
|
782
793
|
# temporary Ruby installation.
|
783
|
-
libs << [
|
794
|
+
libs << [fullpath, fullpath.relative_path_from(Host.exec_prefix)]
|
784
795
|
elsif defined?(Gem) and gemhome = Gem.path.find { |pth| fullpath.subpath?(pth) }
|
785
796
|
# Features found in any other Gem path (e.g. ~/.gems) is put
|
786
797
|
# in a special 'gemhome' folder.
|
787
|
-
targetpath = GEMHOMEDIR / fullpath.relative_path_from(gemhome)
|
788
|
-
libs << [
|
798
|
+
targetpath = GEMHOMEDIR / fullpath.relative_path_from(Pathname(gemhome))
|
799
|
+
libs << [fullpath, targetpath]
|
789
800
|
elsif fullpath.subpath?(src_prefix) || path == working_directory
|
790
801
|
# Any feature found inside the src_prefix automatically gets
|
791
802
|
# added as a source file (to go in 'src').
|
@@ -803,7 +814,7 @@ EOF
|
|
803
814
|
# All other feature that can not be resolved go in the the
|
804
815
|
# Ruby sitelibdir. This is automatically in the load path
|
805
816
|
# when Ruby starts.
|
806
|
-
libs << [
|
817
|
+
libs << [fullpath, instsitelibdir / feature]
|
807
818
|
end
|
808
819
|
end
|
809
820
|
end
|
@@ -821,10 +832,10 @@ EOF
|
|
821
832
|
# GEMHOME.
|
822
833
|
gem_files.each do |gemfile|
|
823
834
|
if gemfile.subpath?(Host.exec_prefix)
|
824
|
-
libs << [
|
835
|
+
libs << [gemfile, gemfile.relative_path_from(Host.exec_prefix)]
|
825
836
|
elsif defined?(Gem) and gemhome = Gem.path.find { |pth| gemfile.subpath?(pth) }
|
826
837
|
targetpath = GEMHOMEDIR / gemfile.relative_path_from(Pathname(gemhome))
|
827
|
-
libs << [
|
838
|
+
libs << [gemfile, targetpath]
|
828
839
|
else
|
829
840
|
Ocra.fatal_error "Don't know where to put gemfile #{gemfile}"
|
830
841
|
end
|
@@ -836,7 +847,7 @@ EOF
|
|
836
847
|
@load_path_before.each do |lp|
|
837
848
|
path = Pathname.new(lp)
|
838
849
|
next unless path.to_posix =~
|
839
|
-
|
850
|
+
/\/(ruby\/(?:site_ruby\/|vendor_ruby\/)?[0-9.]+)\/?$/i
|
840
851
|
subdir = $1
|
841
852
|
Dir["#{lp}/**/*"].each do |f|
|
842
853
|
fpath = Pathname.new(f)
|
@@ -857,11 +868,11 @@ EOF
|
|
857
868
|
if Ocra.output_override
|
858
869
|
executable = Ocra.output_override
|
859
870
|
else
|
860
|
-
executable = Ocra.files.first.basename.ext(
|
871
|
+
executable = Ocra.files.first.basename.ext(".exe")
|
861
872
|
executable.append_to_filename!("-debug") if Ocra.debug
|
862
873
|
end
|
863
874
|
|
864
|
-
windowed = (Ocra.files.first.ext?(
|
875
|
+
windowed = (Ocra.files.first.ext?(".rbw") || Ocra.force_windows) && !Ocra.force_console
|
865
876
|
|
866
877
|
Ocra.msg "Building #{executable}"
|
867
878
|
target_script = nil
|
@@ -886,7 +897,7 @@ EOF
|
|
886
897
|
begin
|
887
898
|
sb.createfile(file, target)
|
888
899
|
rescue Errno::ENOENT
|
889
|
-
raise unless file =~
|
900
|
+
raise unless file =~ IGNORE_MODULE_NAMES
|
890
901
|
end
|
891
902
|
end
|
892
903
|
end
|
@@ -948,16 +959,16 @@ EOF
|
|
948
959
|
end
|
949
960
|
|
950
961
|
# Set environment variable
|
951
|
-
sb.setenv(
|
952
|
-
sb.setenv(
|
953
|
-
sb.setenv(
|
962
|
+
sb.setenv("RUBYOPT", ENV["RUBYOPT"] || "")
|
963
|
+
sb.setenv("RUBYLIB", load_path.map { |path| path.to_native }.uniq.join(";"))
|
964
|
+
sb.setenv("GEM_PATH", (TEMPDIR_ROOT / GEMHOMEDIR).to_native)
|
954
965
|
|
955
966
|
# Add the opcode to launch the script
|
956
|
-
extra_arg = Ocra.arg.map { |arg| ' "' + arg.gsub("\"","\\\"") + '"' }.join
|
967
|
+
extra_arg = Ocra.arg.map { |arg| ' "' + arg.gsub("\"", "\\\"") + '"' }.join
|
957
968
|
installed_ruby_exe = TEMPDIR_ROOT / BINDIR / rubyexe
|
958
969
|
launch_script = (TEMPDIR_ROOT / target_script).to_native
|
959
970
|
sb.postcreateprocess(installed_ruby_exe,
|
960
|
-
|
971
|
+
"#{rubyexe} \"#{launch_script}\"#{extra_arg}")
|
961
972
|
end
|
962
973
|
|
963
974
|
unless Ocra.inno_script
|
@@ -966,12 +977,31 @@ EOF
|
|
966
977
|
end
|
967
978
|
|
968
979
|
module LibraryDetector
|
969
|
-
def LibraryDetector.
|
970
|
-
require
|
980
|
+
def LibraryDetector.init_fiddle
|
981
|
+
require "fiddle"
|
982
|
+
require "fiddle/types"
|
983
|
+
module_eval {
|
984
|
+
extend Fiddle::Importer
|
985
|
+
dlload "psapi.dll"
|
986
|
+
include Fiddle::Win32Types
|
987
|
+
extern "BOOL EnumProcessModules(HANDLE, HMODULE*, DWORD, DWORD*)"
|
988
|
+
extend Fiddle::Importer
|
989
|
+
dlload "kernel32.dll"
|
990
|
+
include Fiddle::Win32Types
|
991
|
+
typealias "HMODULE", "uintptr_t"
|
992
|
+
typealias "LPWSTR", "char*"
|
993
|
+
extern "DWORD GetModuleFileNameW(HMODULE, LPWSTR, DWORD)"
|
994
|
+
extern "HANDLE GetCurrentProcess(void)"
|
995
|
+
}
|
996
|
+
end
|
971
997
|
|
972
|
-
|
973
|
-
|
974
|
-
|
998
|
+
def LibraryDetector.loaded_dlls
|
999
|
+
require "fiddle"
|
1000
|
+
psapi = Fiddle.dlopen("psapi")
|
1001
|
+
enumprocessmodules = Fiddle::Function.new(psapi["EnumProcessModules"], [Fiddle::TYPE_UINTPTR_T, Fiddle::TYPE_VOIDP, Fiddle::TYPE_LONG, Fiddle::TYPE_VOIDP], Fiddle::TYPE_LONG)
|
1002
|
+
kernel32 = Fiddle.dlopen("kernel32")
|
1003
|
+
getcurrentprocess = Fiddle::Function.new(kernel32["GetCurrentProcess"], [], Fiddle::TYPE_LONG)
|
1004
|
+
getmodulefilename = Fiddle::Function.new(kernel32["GetModuleFileNameW"], [Fiddle::TYPE_UINTPTR_T, Fiddle::TYPE_VOIDP, Fiddle::TYPE_LONG], Fiddle::TYPE_LONG)
|
975
1005
|
|
976
1006
|
bytes_needed = 4 * 32
|
977
1007
|
module_handle_buffer = nil
|
@@ -988,7 +1018,7 @@ EOF
|
|
988
1018
|
handles.select { |handle| handle > 0 }.map do |handle|
|
989
1019
|
str = "\x00\x00" * 256
|
990
1020
|
modulefilename_length = getmodulefilename.call(handle, str, str.size)
|
991
|
-
modulefilename = str[0, modulefilename_length * 2].force_encoding(
|
1021
|
+
modulefilename = str[0, modulefilename_length * 2].force_encoding("UTF-16LE").encode("UTF-8")
|
992
1022
|
Ocra.Pathname(modulefilename)
|
993
1023
|
end
|
994
1024
|
end
|
@@ -996,7 +1026,7 @@ EOF
|
|
996
1026
|
def LibraryDetector.detect_dlls
|
997
1027
|
loaded = loaded_dlls
|
998
1028
|
exec_prefix = Host.exec_prefix
|
999
|
-
loaded.select { |path| path.subpath?(exec_prefix) && path.basename.ext?(
|
1029
|
+
loaded.select { |path| path.subpath?(exec_prefix) && path.basename.ext?(".dll") && path.basename != Host.libruby_so }
|
1000
1030
|
end
|
1001
1031
|
end
|
1002
1032
|
|
@@ -1039,10 +1069,10 @@ EOF
|
|
1039
1069
|
opcode_offset = File.size(path)
|
1040
1070
|
|
1041
1071
|
File.open(path, "ab") do |ocrafile|
|
1042
|
-
tmpinpath =
|
1072
|
+
tmpinpath = "tmpin"
|
1043
1073
|
|
1044
1074
|
if Ocra.lzma_mode
|
1045
|
-
@of = File.open(tmpinpath,
|
1075
|
+
@of = File.open(tmpinpath, "wb")
|
1046
1076
|
else
|
1047
1077
|
@of = ocrafile
|
1048
1078
|
end
|
@@ -1059,11 +1089,11 @@ EOF
|
|
1059
1089
|
@of.close if Ocra.lzma_mode
|
1060
1090
|
|
1061
1091
|
if Ocra.lzma_mode and not Ocra.inno_script
|
1062
|
-
tmpoutpath =
|
1092
|
+
tmpoutpath = "tmpout"
|
1063
1093
|
begin
|
1064
1094
|
data_size = File.size(tmpinpath)
|
1065
1095
|
Ocra.msg "Compressing #{data_size} bytes"
|
1066
|
-
system(Ocra.lzmapath,
|
1096
|
+
system(Ocra.lzmapath, "e", tmpinpath, tmpoutpath) or fail
|
1067
1097
|
compressed_data_size = File.size?(tmpoutpath)
|
1068
1098
|
ocrafile.write([OP_DECOMPRESS_LZMA, compressed_data_size].pack("VV"))
|
1069
1099
|
IO.copy_stream(tmpoutpath, ocrafile)
|
@@ -1094,7 +1124,7 @@ EOF
|
|
1094
1124
|
@files.each do |tgt, src|
|
1095
1125
|
src_escaped = src.to_s.gsub('"', '""')
|
1096
1126
|
target_dir_escaped = Pathname.new(tgt).dirname.to_s.gsub('"', '""')
|
1097
|
-
iss << "Source: \"#{src_escaped}\"; DestDir: \"{app}/#{target_dir_escaped}\"\n" unless src_escaped =~
|
1127
|
+
iss << "Source: \"#{src_escaped}\"; DestDir: \"{app}/#{target_dir_escaped}\"\n" unless src_escaped =~ IGNORE_MODULE_NAMES
|
1098
1128
|
end
|
1099
1129
|
iss << "\n"
|
1100
1130
|
|
@@ -1185,9 +1215,7 @@ EOF
|
|
1185
1215
|
def showtempdir(x)
|
1186
1216
|
x.to_s.gsub(TEMPDIR_ROOT, "<tempdir>")
|
1187
1217
|
end
|
1188
|
-
|
1189
1218
|
end # class OcraBuilder
|
1190
|
-
|
1191
1219
|
end # module Ocra
|
1192
1220
|
|
1193
1221
|
if File.basename(__FILE__) == File.basename($0)
|
data/lib/ocra.rb
CHANGED
data/share/ocra/edicon.exe
CHANGED
Binary file
|
data/share/ocra/lzma.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
@@ -513,7 +513,7 @@ class TestOcra < MiniTest::Test
|
|
513
513
|
|
514
514
|
# Test that ocra.rb accepts --version and outputs the version number.
|
515
515
|
def test_version
|
516
|
-
assert_match(/^Ocra \d+(\.\d)+(.[a-z]
|
516
|
+
assert_match(/^Ocra \d+(\.\d)+(.(:?[a-z]+)?\d+)?\n$/, `ruby \"#{ocra}\" --version`)
|
517
517
|
end
|
518
518
|
|
519
519
|
# Test that ocra.rb accepts --icon.
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ocra
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.3.
|
4
|
+
version: 1.3.11
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Lars Christensen
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-03-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: minitest
|
@@ -16,42 +16,48 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '5.
|
19
|
+
version: '5.14'
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '5.
|
26
|
+
version: '5.14'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rdoc
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- - "
|
31
|
+
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: '4.0'
|
34
|
+
- - "<"
|
35
|
+
- !ruby/object:Gem::Version
|
36
|
+
version: '7'
|
34
37
|
type: :development
|
35
38
|
prerelease: false
|
36
39
|
version_requirements: !ruby/object:Gem::Requirement
|
37
40
|
requirements:
|
38
|
-
- - "
|
41
|
+
- - ">="
|
39
42
|
- !ruby/object:Gem::Version
|
40
43
|
version: '4.0'
|
44
|
+
- - "<"
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: '7'
|
41
47
|
- !ruby/object:Gem::Dependency
|
42
48
|
name: hoe
|
43
49
|
requirement: !ruby/object:Gem::Requirement
|
44
50
|
requirements:
|
45
51
|
- - "~>"
|
46
52
|
- !ruby/object:Gem::Version
|
47
|
-
version: '3.
|
53
|
+
version: '3.22'
|
48
54
|
type: :development
|
49
55
|
prerelease: false
|
50
56
|
version_requirements: !ruby/object:Gem::Requirement
|
51
57
|
requirements:
|
52
58
|
- - "~>"
|
53
59
|
- !ruby/object:Gem::Version
|
54
|
-
version: '3.
|
60
|
+
version: '3.22'
|
55
61
|
description: |-
|
56
62
|
OCRA (One-Click Ruby Application) builds Windows executables from Ruby
|
57
63
|
source code. The executable is a self-extracting, self-running
|
@@ -65,11 +71,11 @@ extensions: []
|
|
65
71
|
extra_rdoc_files:
|
66
72
|
- History.txt
|
67
73
|
- Manifest.txt
|
68
|
-
- README.
|
74
|
+
- README.md
|
69
75
|
files:
|
70
76
|
- History.txt
|
71
77
|
- Manifest.txt
|
72
|
-
- README.
|
78
|
+
- README.md
|
73
79
|
- Rakefile
|
74
80
|
- bin/ocra
|
75
81
|
- lib/ocra.rb
|
@@ -81,11 +87,12 @@ files:
|
|
81
87
|
homepage: https://github.com/larsch/ocra/
|
82
88
|
licenses:
|
83
89
|
- MIT
|
84
|
-
metadata:
|
90
|
+
metadata:
|
91
|
+
homepage_uri: https://github.com/larsch/ocra/
|
85
92
|
post_install_message:
|
86
93
|
rdoc_options:
|
87
94
|
- "--main"
|
88
|
-
- README.
|
95
|
+
- README.md
|
89
96
|
require_paths:
|
90
97
|
- lib
|
91
98
|
required_ruby_version: !ruby/object:Gem::Requirement
|
@@ -99,8 +106,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
99
106
|
- !ruby/object:Gem::Version
|
100
107
|
version: '0'
|
101
108
|
requirements: []
|
102
|
-
|
103
|
-
rubygems_version: 2.6.13
|
109
|
+
rubygems_version: 3.1.2
|
104
110
|
signing_key:
|
105
111
|
specification_version: 4
|
106
112
|
summary: OCRA (One-Click Ruby Application) builds Windows executables from Ruby source
|