neri 0.9.6 → 1.1.0
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 +4 -4
- data/README.ja.md +53 -72
- data/README.md +202 -61
- data/exe/neri +1 -2
- data/lib/neri/build.rb +285 -421
- data/lib/neri/runtime.rb +1 -0
- data/lib/neri/version.rb +1 -1
- metadata +2 -2
data/lib/neri/build.rb
CHANGED
@@ -2,12 +2,11 @@
|
|
2
2
|
|
3
3
|
require "neri"
|
4
4
|
|
5
|
-
module
|
5
|
+
module NeriBuild
|
6
6
|
@data_files = []
|
7
7
|
|
8
8
|
@options = {
|
9
9
|
quiet: false,
|
10
|
-
verbose: false,
|
11
10
|
|
12
11
|
external_encoding: nil,
|
13
12
|
|
@@ -16,7 +15,7 @@ module Neri
|
|
16
15
|
gems: [],
|
17
16
|
encoding: "*",
|
18
17
|
|
19
|
-
enable_gems:
|
18
|
+
enable_gems: true,
|
20
19
|
enable_did_you_mean: false,
|
21
20
|
chdir_first: true,
|
22
21
|
pause_last: nil,
|
@@ -30,39 +29,22 @@ module Neri
|
|
30
29
|
virtual_directory: nil,
|
31
30
|
|
32
31
|
no_exe: false,
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
trademarks: nil,
|
48
|
-
copyright: nil,
|
49
|
-
privatebuild: nil,
|
50
|
-
specialbuild: nil,
|
51
|
-
comments: nil
|
52
|
-
},
|
53
|
-
|
54
|
-
use_upx: false,
|
55
|
-
upx_path: "upx",
|
56
|
-
upx_targets: ["bin/**/*.dll"],
|
57
|
-
upx_options: "",
|
58
|
-
|
59
|
-
zipfile: nil,
|
60
|
-
sevenzip_path: "7z",
|
61
|
-
|
62
|
-
inno_script: nil,
|
63
|
-
iscc_path: "iscc"
|
32
|
+
icon: File.expand_path("#{File.dirname(__FILE__)}/../../share/default.ico"),
|
33
|
+
invisible: nil,
|
34
|
+
fileversion: nil,
|
35
|
+
productversion: nil,
|
36
|
+
productname: nil,
|
37
|
+
originalfilename: nil,
|
38
|
+
internalname: nil,
|
39
|
+
description: nil,
|
40
|
+
company: nil,
|
41
|
+
trademarks: nil,
|
42
|
+
copyright: nil,
|
43
|
+
privatebuild: nil,
|
44
|
+
specialbuild: nil,
|
45
|
+
comments: nil
|
64
46
|
}
|
65
|
-
@rubyopt = ENV["RUBYOPT"].to_s
|
47
|
+
@rubyopt = ENV["RUBYOPT"].to_s.encode(Encoding::UTF_8)
|
66
48
|
@args = ""
|
67
49
|
@encryption_key = nil
|
68
50
|
|
@@ -70,8 +52,33 @@ module Neri
|
|
70
52
|
@use_dxruby_tiled = false
|
71
53
|
@use_ayame = false
|
72
54
|
|
55
|
+
@require_paths = {}
|
56
|
+
|
73
57
|
class << self
|
74
|
-
|
58
|
+
def gemspec_path(file)
|
59
|
+
return nil unless file.match?(%r{/gems/\d+\.\d+\.\d+/gems/(.+?-[^/]+)/})
|
60
|
+
|
61
|
+
file.sub(%r{(/gems/\d+\.\d+\.\d+)/gems/(.+?-[^/]+)/.+\z}) do
|
62
|
+
"#{Regexp.last_match(1)}/specifications/#{Regexp.last_match(2)}.gemspec"
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
def gem_require_paths(file)
|
67
|
+
path = gemspec_path(file)
|
68
|
+
return nil unless path
|
69
|
+
return @require_paths[path] if @require_paths.key?(path)
|
70
|
+
|
71
|
+
@require_paths[path] = ["lib/"]
|
72
|
+
if File.exist?(path)
|
73
|
+
gemspec = File.binread(path)
|
74
|
+
if gemspec.match(/\.require_paths\s*=\s*\[([^\]]+)\]/)
|
75
|
+
@require_paths[path] = Regexp.last_match(1).scan(/['"]([^'"]+)['"]/).flatten.map do |p|
|
76
|
+
"#{p.delete_suffix('/')}/"
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
@require_paths[path]
|
81
|
+
end
|
75
82
|
|
76
83
|
def relative_path(path, basedir = rubydir, prepath = "")
|
77
84
|
basedir.concat(File::SEPARATOR) unless basedir.end_with?(File::SEPARATOR)
|
@@ -87,8 +94,8 @@ module Neri
|
|
87
94
|
def rubyexe ; RbConfig.ruby; end
|
88
95
|
def scriptfile; @data_files.first; end
|
89
96
|
def basename ; File.basename(scriptfile, ".*"); end
|
90
|
-
def basepath ; File.join(options[:output_dir], basename); end
|
91
|
-
def datafile ; File.join(options[:output_dir], options[:system_dir], options[:datafile]); end
|
97
|
+
def basepath ; File.join(@options[:output_dir], basename); end
|
98
|
+
def datafile ; File.join(@options[:output_dir], @options[:system_dir], @options[:datafile]); end
|
92
99
|
|
93
100
|
# --help
|
94
101
|
def output_help
|
@@ -99,7 +106,6 @@ options:
|
|
99
106
|
--help or -h
|
100
107
|
--version or -v
|
101
108
|
--quiet
|
102
|
-
--verbose
|
103
109
|
|
104
110
|
--external-encoding <encoding>
|
105
111
|
|
@@ -110,8 +116,8 @@ options:
|
|
110
116
|
--no-enc
|
111
117
|
--encoding <enc1>,<enc2>,...
|
112
118
|
|
113
|
-
--enable-gems
|
114
|
-
--enable-did-you-mean
|
119
|
+
--enable-gems / --disable-gems
|
120
|
+
--enable-did-you-mean / --disable-did-you-mean
|
115
121
|
--no-chdir
|
116
122
|
--pause-last
|
117
123
|
--no-pause-last
|
@@ -121,15 +127,12 @@ options:
|
|
121
127
|
--system-dir <dirname>
|
122
128
|
--datafile <filename>
|
123
129
|
--encryption-key <key>
|
130
|
+
--virtual-directory <string>
|
124
131
|
|
125
|
-
--no-exe
|
126
|
-
--use-b2ec
|
127
|
-
--b2ec-path <bat_to_exe_converter_path>
|
132
|
+
--no-exe or --bat
|
128
133
|
--icon <iconfile>
|
129
134
|
--windows or --invisible
|
130
135
|
--console or --visible
|
131
|
-
--x64
|
132
|
-
--uac-admin
|
133
136
|
--fileversion <string> # ex) 1,2,3,4
|
134
137
|
--productversion <string> # ex) 1,2,3,4
|
135
138
|
--productname <string>
|
@@ -142,21 +145,6 @@ options:
|
|
142
145
|
--privatebuild <string>
|
143
146
|
--specialbuild <string>
|
144
147
|
--comments <string>
|
145
|
-
|
146
|
-
--use-upx
|
147
|
-
--upx-path <upx path>
|
148
|
-
--upx_targets '<glob>' # ex) 'bin/**/*.dll'
|
149
|
-
--upx-options <options>
|
150
|
-
|
151
|
-
--zipfile <filename>
|
152
|
-
--7zip-path <7-zip path>
|
153
|
-
|
154
|
-
--innosetup <inno_script>
|
155
|
-
--iscc-path <iscc path>
|
156
|
-
|
157
|
-
--create-recipe <recipefile>
|
158
|
-
--recipe <recipefile>
|
159
|
-
--virtual-directory <string>
|
160
148
|
HELP_MESSAGE
|
161
149
|
end
|
162
150
|
|
@@ -165,25 +153,9 @@ options:
|
|
165
153
|
puts "Neri #{Neri::VERSION}"
|
166
154
|
end
|
167
155
|
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
case value
|
172
|
-
when Hash
|
173
|
-
create_recipe(file, value, pre + "[:#{key}]")
|
174
|
-
when Numeric, TrueClass, FalseClass
|
175
|
-
file.puts "#{pre}[:#{key}] = #{value}"
|
176
|
-
when NilClass
|
177
|
-
file.puts "#{pre}[:#{key}] = nil"
|
178
|
-
when String, Array
|
179
|
-
file.puts "#{pre}[:#{key}] = " + JSON.generate(value)
|
180
|
-
end
|
181
|
-
end
|
182
|
-
end
|
183
|
-
|
184
|
-
def check_options
|
185
|
-
nputs_v "Checking Neri options."
|
186
|
-
while arg = ARGV.shift
|
156
|
+
def load_options(argv)
|
157
|
+
until argv.empty?
|
158
|
+
arg = argv.shift
|
187
159
|
case arg
|
188
160
|
when "--help", "-h"
|
189
161
|
output_help
|
@@ -192,112 +164,80 @@ options:
|
|
192
164
|
output_version
|
193
165
|
exit
|
194
166
|
when "--quiet", "-q"
|
195
|
-
options[:quiet] = true
|
196
|
-
when "--
|
197
|
-
options[:
|
198
|
-
when "--external_encoding"
|
199
|
-
options[:external_encoding] = ARGV.shift
|
167
|
+
@options[:quiet] = true
|
168
|
+
when "--external-encoding"
|
169
|
+
@options[:external_encoding] = argv.shift
|
200
170
|
when "--dll"
|
201
|
-
options[:dlls] +=
|
171
|
+
@options[:dlls] += argv.shift.split(",").map(&:strip)
|
202
172
|
when "--lib"
|
203
|
-
options[:libs] +=
|
173
|
+
@options[:libs] += argv.shift.split(",").map(&:strip)
|
204
174
|
when "--gem"
|
205
|
-
options[:gems] +=
|
175
|
+
@options[:gems] += argv.shift.split(",").map(&:strip)
|
206
176
|
when "--no-enc"
|
207
|
-
options[:encoding] = nil
|
177
|
+
@options[:encoding] = nil
|
208
178
|
when "--encoding"
|
209
|
-
options[:encoding] =
|
179
|
+
@options[:encoding] = argv.shift
|
210
180
|
when "--enable-gems"
|
211
|
-
options[:enable_gems] = true
|
181
|
+
@options[:enable_gems] = true
|
182
|
+
when "--disale-gems"
|
183
|
+
@options[:enable_gems] = false
|
212
184
|
when "--enable-did-you-mean"
|
213
|
-
options[:enable_did_you_mean] = true
|
185
|
+
@options[:enable_did_you_mean] = true
|
186
|
+
when "--disale-did-you-mean"
|
187
|
+
@options[:enable_did_you_mean] = false
|
214
188
|
when "--no-chdir"
|
215
|
-
options[:chdir_first] = false
|
189
|
+
@options[:chdir_first] = false
|
216
190
|
when "--chdir-first" # deprecated
|
217
|
-
options[:chdir_first] = true
|
191
|
+
@options[:chdir_first] = true
|
218
192
|
when "--pause-last"
|
219
|
-
options[:pause_last] = true
|
193
|
+
@options[:pause_last] = true
|
220
194
|
when "--no-pause-last"
|
221
|
-
options[:pause_last] = false
|
195
|
+
@options[:pause_last] = false
|
222
196
|
when "--pause-text"
|
223
|
-
options[:pause_text] =
|
224
|
-
options[:pause_last] = true
|
197
|
+
@options[:pause_text] = argv.shift
|
198
|
+
@options[:pause_last] = true
|
225
199
|
when "--output-dir"
|
226
|
-
options[:output_dir] =
|
200
|
+
@options[:output_dir] = argv.shift
|
227
201
|
when "--system-dir"
|
228
|
-
options[:system_dir] =
|
202
|
+
@options[:system_dir] = argv.shift
|
229
203
|
when "--datafile"
|
230
|
-
options[:datafile] =
|
204
|
+
@options[:datafile] = argv.shift
|
231
205
|
when "--encryption-key"
|
232
|
-
options[:encryption_key] =
|
233
|
-
when "--
|
234
|
-
options[:
|
235
|
-
when "--
|
236
|
-
options[:
|
237
|
-
when "--b2ec-path"
|
238
|
-
options[:b2ec_path] = ARGV.shift.encode("utf-8")
|
206
|
+
@options[:encryption_key] = argv.shift
|
207
|
+
when "--virtual-directory"
|
208
|
+
@options[:virtual_directory] = argv.shift
|
209
|
+
when "--no-exe", "--bat"
|
210
|
+
@options[:no_exe] = true
|
239
211
|
when "--icon"
|
240
|
-
options[:
|
212
|
+
@options[:icon] = argv.shift
|
241
213
|
when "--windows", "--invisible"
|
242
|
-
options[:
|
214
|
+
@options[:invisible] = true
|
243
215
|
when "--console", "--visible"
|
244
|
-
options[:
|
245
|
-
when "--x64"
|
246
|
-
options[:b2ec][:x64] = true
|
247
|
-
when "--uac-admin"
|
248
|
-
options[:b2ec][:uac_admin] = true
|
216
|
+
@options[:invisible] = false
|
249
217
|
when "--fileversion"
|
250
|
-
options[:
|
218
|
+
@options[:fileversion] = argv.shift
|
251
219
|
when "--productversion"
|
252
|
-
options[:
|
220
|
+
@options[:productversion] = argv.shift
|
253
221
|
when "--productname"
|
254
|
-
options[:
|
222
|
+
@options[:productname] = argv.shift
|
255
223
|
when "--originalfilename"
|
256
|
-
options[:
|
224
|
+
@options[:originalfilename] = argv.shift
|
257
225
|
when "--internalname"
|
258
|
-
options[:
|
226
|
+
@options[:internalname] = argv.shift
|
259
227
|
when "--description"
|
260
|
-
options[:
|
228
|
+
@options[:description] = argv.shift
|
261
229
|
when "--company"
|
262
|
-
options[:
|
230
|
+
@options[:company] = argv.shift
|
263
231
|
when "--trademarks"
|
264
|
-
options[:
|
232
|
+
@options[:trademarks] = argv.shift
|
265
233
|
when "--copyright"
|
266
|
-
options[:
|
234
|
+
@options[:copyright] = argv.shift
|
267
235
|
when "--privatebuild"
|
268
|
-
options[:
|
236
|
+
@options[:privatebuild] = argv.shift
|
269
237
|
when "--specialbuild"
|
270
|
-
options[:
|
238
|
+
@options[:specialbuild] = argv.shift
|
271
239
|
when "--comments"
|
272
|
-
options[:
|
273
|
-
when "--use-upx"
|
274
|
-
options[:use_upx] = true
|
275
|
-
when "--upx-path"
|
276
|
-
options[:upx_path] = ARGV.shift.encode("utf-8")
|
277
|
-
when "--upx-targets"
|
278
|
-
options[:upx_targets] += ARGV.shift.split(",").map(&:strip)
|
279
|
-
when "--upx-options"
|
280
|
-
options[:upx_options] = ARGV.shift
|
281
|
-
when "--zipfile"
|
282
|
-
options[:zipfile] = "#{ARGV.shift.encode('utf-8').sub(/\.zip$/, '')}.zip"
|
283
|
-
when "--7zip-path"
|
284
|
-
options[:sevenzip_path] = ARGV.shift.encode("utf-8")
|
285
|
-
when "--innosetup"
|
286
|
-
options[:inno_script] = ARGV.shift.encode("utf-8")
|
287
|
-
when "--iscc-path"
|
288
|
-
options[:iscc_path] = ARGV.shift.encode("utf-8")
|
289
|
-
when "--create-recipe"
|
290
|
-
require "json"
|
291
|
-
filename = ARGV.shift.encode("utf-8")
|
292
|
-
nputs "Creating recipe_file '#{filename}'."
|
293
|
-
File.open(filename, "w:utf-8") { |file| create_recipe(file) }
|
294
|
-
exit
|
295
|
-
when "--recipe"
|
296
|
-
filename = ARGV.shift.encode("utf-8")
|
297
|
-
nputs_v "Loading recipe_file '#{filename}'."
|
298
|
-
load File.expand_path(filename)
|
299
|
-
when "--virtual-directory"
|
300
|
-
options[:virtual_directory] = ARGV.shift.encode("utf-8")
|
240
|
+
@options[:comments] = argv.shift
|
301
241
|
when "--"
|
302
242
|
break
|
303
243
|
when /^(--.+)/
|
@@ -305,26 +245,88 @@ options:
|
|
305
245
|
output_help
|
306
246
|
exit
|
307
247
|
else
|
308
|
-
|
248
|
+
if File.exist?(arg)
|
249
|
+
@data_files.push(arg)
|
250
|
+
else
|
251
|
+
error "File '#{arg}' not found!"
|
252
|
+
exit
|
253
|
+
end
|
309
254
|
end
|
310
255
|
end
|
311
256
|
|
257
|
+
@args += argv.map { |a| %( "#{a}") }.join("")
|
258
|
+
end
|
259
|
+
|
260
|
+
def load_options_from_file(file)
|
261
|
+
fullpath = File.expand_path(file)
|
262
|
+
return unless File.exist?(fullpath)
|
263
|
+
|
264
|
+
argv = File.read(fullpath, encoding: Encoding::UTF_8).lines.flat_map do |line|
|
265
|
+
line.strip.split(" ", 2)
|
266
|
+
end
|
267
|
+
load_options(argv)
|
268
|
+
end
|
269
|
+
|
270
|
+
def check_options
|
271
|
+
load_options_from_file("~/neri.config")
|
272
|
+
load_options_from_file("./neri.config")
|
273
|
+
tmp_data_files = @data_files
|
274
|
+
@data_files = []
|
275
|
+
load_options(ARGV.map { |arg| arg.encode(Encoding::UTF_8) })
|
276
|
+
until ARGV.empty?
|
277
|
+
break if ARGV.shift == "--"
|
278
|
+
end
|
279
|
+
@data_files += tmp_data_files
|
312
280
|
if @data_files.empty?
|
313
281
|
error "No Script File!"
|
314
282
|
output_help
|
315
283
|
exit
|
316
284
|
end
|
317
285
|
|
318
|
-
@args = ARGV.map { |a| %( "#{a}") }.join("")
|
319
286
|
@options[:external_encoding] ||= Encoding.default_external.name
|
320
|
-
unless options[:enable_gems] || @rubyopt.index("--disable-gems")
|
287
|
+
unless @options[:enable_gems] || @rubyopt.index("--disable-gems")
|
321
288
|
@rubyopt += " --disable-gems"
|
322
289
|
end
|
323
|
-
unless options[:enable_did_you_mean] || @rubyopt.index("--disable-did_you_mean")
|
290
|
+
unless @options[:enable_did_you_mean] || @rubyopt.index("--disable-did_you_mean")
|
324
291
|
@rubyopt += " --disable-did_you_mean"
|
325
292
|
end
|
326
|
-
|
327
|
-
|
293
|
+
@rubyopt.sub!(%r{-r\S+/bundler/setup}, "")
|
294
|
+
if @data_files.size > 1 || @options[:encryption_key]
|
295
|
+
@options[:datafile] ||= "#{basename}.dat"
|
296
|
+
end
|
297
|
+
end
|
298
|
+
|
299
|
+
def run_script
|
300
|
+
nputs "Running script '#{scriptfile}' to check dependencies."
|
301
|
+
begin
|
302
|
+
load File.expand_path(scriptfile)
|
303
|
+
rescue SystemExit, Interrupt
|
304
|
+
end
|
305
|
+
nputs "Script '#{scriptfile}' end."
|
306
|
+
|
307
|
+
if defined? DXRuby
|
308
|
+
require "neri/dxruby"
|
309
|
+
@use_dxruby = true
|
310
|
+
end
|
311
|
+
if defined? DXRuby::Tiled
|
312
|
+
require "neri/dxruby_tiled"
|
313
|
+
@use_dxruby_tiled = true
|
314
|
+
end
|
315
|
+
if defined? Ayame
|
316
|
+
require "neri/ayame"
|
317
|
+
@use_ayame = true
|
318
|
+
end
|
319
|
+
|
320
|
+
if @options[:invisible].nil?
|
321
|
+
if File.extname(scriptfile) == ".rbw" ||
|
322
|
+
defined?(DXRuby) ||
|
323
|
+
defined?(Gosu) ||
|
324
|
+
defined?(LibUI)
|
325
|
+
@options[:invisible] = true
|
326
|
+
end
|
327
|
+
end
|
328
|
+
if @options[:pause_last].nil? && !@options[:invisible]
|
329
|
+
@options[:pause_last] = true
|
328
330
|
end
|
329
331
|
end
|
330
332
|
|
@@ -336,18 +338,17 @@ options:
|
|
336
338
|
def dll_dependencies
|
337
339
|
require "fiddle/import"
|
338
340
|
|
339
|
-
pointer_type = Fiddle::SIZEOF_VOIDP == Fiddle::SIZEOF_LONG_LONG ? 'q*' : 'l!*'
|
340
341
|
psapi = Fiddle.dlopen("psapi.dll")
|
341
342
|
kernel32 = Fiddle.dlopen("kernel32.dll")
|
342
343
|
enumprocessmodules = Fiddle::Function.new(
|
343
344
|
psapi["EnumProcessModules"],
|
344
|
-
[Fiddle::
|
345
|
+
[Fiddle::TYPE_UINTPTR_T, Fiddle::TYPE_VOIDP, Fiddle::TYPE_LONG, Fiddle::TYPE_VOIDP],
|
345
346
|
Fiddle::TYPE_LONG,
|
346
347
|
Fiddle::Importer.const_get(:CALL_TYPE_TO_ABI)[:stdcall]
|
347
348
|
)
|
348
349
|
getmodulefilename = Fiddle::Function.new(
|
349
350
|
kernel32["GetModuleFileNameW"],
|
350
|
-
[Fiddle::
|
351
|
+
[Fiddle::TYPE_UINTPTR_T, Fiddle::TYPE_VOIDP, Fiddle::TYPE_LONG],
|
351
352
|
Fiddle::TYPE_LONG,
|
352
353
|
Fiddle::Importer.const_get(:CALL_TYPE_TO_ABI)[:stdcall]
|
353
354
|
)
|
@@ -357,7 +358,7 @@ options:
|
|
357
358
|
Fiddle::TYPE_LONG,
|
358
359
|
Fiddle::Importer.const_get(:CALL_TYPE_TO_ABI)[:stdcall]
|
359
360
|
)
|
360
|
-
|
361
|
+
|
361
362
|
bytes_needed = 4 * 32
|
362
363
|
module_handle_buffer = nil
|
363
364
|
process_handle = getcurrentprocess.call
|
@@ -365,28 +366,24 @@ options:
|
|
365
366
|
module_handle_buffer = "\x00" * bytes_needed
|
366
367
|
bytes_needed_buffer = [0].pack("I")
|
367
368
|
enumprocessmodules.call(
|
368
|
-
|
369
|
-
|
370
|
-
|
371
|
-
|
369
|
+
process_handle,
|
370
|
+
module_handle_buffer,
|
371
|
+
module_handle_buffer.size,
|
372
|
+
bytes_needed_buffer
|
372
373
|
)
|
373
374
|
bytes_needed = bytes_needed_buffer.unpack1("I")
|
374
375
|
break if bytes_needed <= module_handle_buffer.size
|
375
376
|
end
|
376
|
-
|
377
|
+
|
377
378
|
handles = module_handle_buffer.unpack("I*")
|
378
379
|
dependencies = handles.select { |handle| handle > 0 }.map do |handle|
|
379
380
|
str = "\x00\x00" * 256
|
380
|
-
modulefilename_length = getmodulefilename.call(
|
381
|
-
[handle].pack("I").unpack1("i"),
|
382
|
-
[str].pack("p").unpack1(pointer_type),
|
383
|
-
[str.size].pack("I").unpack1("i")
|
384
|
-
)
|
381
|
+
modulefilename_length = getmodulefilename.call(handle, str, str.size)
|
385
382
|
str[0, modulefilename_length * 2].force_encoding("UTF-16LE").encode("UTF-8")
|
386
383
|
end
|
387
384
|
|
388
385
|
dependencies.map! { |dep| dep.sub(/^\\\\\?\\/, "") }
|
389
|
-
dependencies.map! { |dep| dep.tr(
|
386
|
+
dependencies.map! { |dep| dep.tr("\\", "/") }
|
390
387
|
dependencies.delete(rubyexe)
|
391
388
|
|
392
389
|
dependencies.uniq
|
@@ -400,7 +397,8 @@ options:
|
|
400
397
|
|
401
398
|
def additional_dlls_dependencies
|
402
399
|
dependencies = []
|
403
|
-
options[:dlls].
|
400
|
+
@options[:dlls].push("*.dll") if RbConfig::CONFIG["arch"].include?("x64")
|
401
|
+
@options[:dlls].each do |dll|
|
404
402
|
dependencies += Dir.glob(File.join(bindir, "**", dll))
|
405
403
|
dependencies += Dir.glob(File.join(bindir, "**", "#{dll}.*"))
|
406
404
|
end
|
@@ -409,7 +407,7 @@ options:
|
|
409
407
|
|
410
408
|
def additional_libs_dependencies
|
411
409
|
dependencies = []
|
412
|
-
options[:libs].each do |lib|
|
410
|
+
@options[:libs].each do |lib|
|
413
411
|
$LOAD_PATH.each do |path|
|
414
412
|
dependencies += Dir.glob(File.join(path, lib))
|
415
413
|
dependencies += Dir.glob(File.join(path, "#{lib}.*"))
|
@@ -420,10 +418,9 @@ options:
|
|
420
418
|
end
|
421
419
|
|
422
420
|
def additional_gems_dependencies
|
423
|
-
require "rubygems"
|
424
421
|
dependencies = []
|
425
422
|
rubygems_dir = File.join(Gem.dir, "gems")
|
426
|
-
options[:gems].each do |gem|
|
423
|
+
@options[:gems].each do |gem|
|
427
424
|
gem.sub!(/:(.+)/, "")
|
428
425
|
targets = Regexp.last_match(1).to_s.split("|")
|
429
426
|
targets.push("lib/**/*")
|
@@ -439,12 +436,12 @@ options:
|
|
439
436
|
end
|
440
437
|
|
441
438
|
def encoding_dependencies
|
442
|
-
return [] unless options[:encoding]
|
439
|
+
return [] unless @options[:encoding]
|
443
440
|
|
444
441
|
dependencies = []
|
445
442
|
enc_dir = Dir.glob(File.join(RbConfig::CONFIG["archdir"] || RbConfig::TOPDIR, "**", "enc")).first
|
446
443
|
|
447
|
-
options[:encoding].split(",").map(&:strip).each do |enc|
|
444
|
+
@options[:encoding].split(",").map(&:strip).each do |enc|
|
448
445
|
case enc
|
449
446
|
when "ja"
|
450
447
|
%w[windows_31j.so japanese_sjis.so encdb.so].each do |enc_name|
|
@@ -459,35 +456,41 @@ options:
|
|
459
456
|
dependencies.uniq
|
460
457
|
end
|
461
458
|
|
462
|
-
def
|
463
|
-
|
464
|
-
|
465
|
-
load File.expand_path(scriptfile)
|
466
|
-
rescue SystemExit, Interrupt
|
459
|
+
def select_dependencies(dependencies)
|
460
|
+
dependencies.select! do |dependency|
|
461
|
+
dependency.start_with?(rubydir)
|
467
462
|
end
|
468
|
-
nputs "Script '#{scriptfile}' end."
|
469
463
|
|
470
|
-
|
471
|
-
|
472
|
-
@use_dxruby = true
|
473
|
-
end
|
474
|
-
if defined? DXRuby::Tiled
|
475
|
-
require "neri/dxruby_tiled"
|
476
|
-
@use_dxruby_tiled = true
|
477
|
-
end
|
478
|
-
if defined? Ayame
|
479
|
-
require "neri/ayame"
|
480
|
-
@use_ayame = true
|
464
|
+
@data_files.each do |file|
|
465
|
+
dependencies.delete(File.expand_path(file))
|
481
466
|
end
|
482
467
|
|
483
|
-
|
484
|
-
|
485
|
-
|
468
|
+
unless @options[:enable_gems]
|
469
|
+
dependencies.delete_if do |dependency|
|
470
|
+
File.basename(dependency) == "rubygems.rb" ||
|
471
|
+
dependency.split(File::SEPARATOR).index("rubygems")
|
472
|
+
end
|
486
473
|
end
|
487
|
-
|
488
|
-
|
474
|
+
unless @options[:enable_did_you_mean]
|
475
|
+
dependencies.delete_if do |dependency|
|
476
|
+
File.basename(dependency) == "did_you_mean.rb" ||
|
477
|
+
dependency.split(File::SEPARATOR).index("did_you_mean")
|
478
|
+
end
|
489
479
|
end
|
490
480
|
|
481
|
+
dependencies.uniq
|
482
|
+
end
|
483
|
+
|
484
|
+
def gemspec_dependencies(dependencies)
|
485
|
+
default_gemspec_dir = Gem.default_specifications_dir.encode(Encoding::UTF_8)
|
486
|
+
gemspecs = Dir.glob("#{default_gemspec_dir}/**/*")
|
487
|
+
gemspecs += dependencies.map { |depend| gemspec_path(depend) }
|
488
|
+
gemspecs.compact.uniq
|
489
|
+
end
|
490
|
+
|
491
|
+
def check_dependencies
|
492
|
+
run_script
|
493
|
+
|
491
494
|
require "rbconfig"
|
492
495
|
dependencies = []
|
493
496
|
dependencies += rb_dependencies
|
@@ -498,70 +501,50 @@ options:
|
|
498
501
|
dependencies += additional_gems_dependencies
|
499
502
|
dependencies += encoding_dependencies
|
500
503
|
dependencies = select_dependencies(dependencies)
|
504
|
+
dependencies += gemspec_dependencies(dependencies) if @options[:enable_gems]
|
505
|
+
if dependencies.find { |dep| dep.end_with?("/net/https.rb") }
|
506
|
+
dependencies.push("#{rubydir}ssl/cert.pem")
|
507
|
+
end
|
501
508
|
|
502
509
|
size = dependencies.map { |d| File.size(d) }.inject(&:+)
|
503
510
|
nputs "#{dependencies.size} files, #{size} bytes dependencies."
|
504
|
-
if options[:verbose]
|
505
|
-
dependencies.each do |dependency|
|
506
|
-
nputs_v " - #{dependency}"
|
507
|
-
end
|
508
|
-
end
|
509
511
|
|
510
512
|
dependencies
|
511
513
|
end
|
512
514
|
|
513
|
-
def select_dependencies(dependencies)
|
514
|
-
dependencies.select! do |dependency|
|
515
|
-
dependency.start_with?(rubydir)
|
516
|
-
end
|
517
|
-
|
518
|
-
@data_files.each do |file|
|
519
|
-
dependencies.delete(File.expand_path(file))
|
520
|
-
end
|
521
|
-
|
522
|
-
unless options[:enable_gems]
|
523
|
-
dependencies.delete_if do |dependency|
|
524
|
-
File.basename(dependency) == "rubygems.rb" ||
|
525
|
-
dependency.split(File::SEPARATOR).index("rubygems")
|
526
|
-
end
|
527
|
-
end
|
528
|
-
unless options[:enable_did_you_mean]
|
529
|
-
dependencies.delete_if do |dependency|
|
530
|
-
File.basename(dependency) == "did_you_mean.rb" ||
|
531
|
-
dependency.split(File::SEPARATOR).index("did_you_mean")
|
532
|
-
end
|
533
|
-
end
|
534
|
-
|
535
|
-
dependencies.uniq
|
536
|
-
end
|
537
|
-
|
538
515
|
def copy_files(dependencies)
|
539
516
|
nputs "Copying dependencies."
|
540
517
|
require "fileutils"
|
541
518
|
src_dir = rubydir
|
542
|
-
desc_dir = File.join(options[:output_dir], options[:system_dir], "")
|
519
|
+
desc_dir = File.join(@options[:output_dir], @options[:system_dir], "")
|
543
520
|
|
544
521
|
system_files = dependencies.map do |file|
|
545
522
|
[file, file.sub(src_dir, desc_dir)]
|
546
523
|
end
|
547
|
-
unless options[:enable_gems]
|
548
|
-
system_files.each do |
|
549
|
-
|
524
|
+
unless @options[:enable_gems]
|
525
|
+
system_files.each do |src, desc|
|
526
|
+
paths = gem_require_paths(src)
|
527
|
+
next unless paths
|
528
|
+
|
529
|
+
desc.sub!(%r{/gems/(\d+\.\d+\.\d+)/gems/.+?-[^/]+/(.+)\z}) do
|
530
|
+
version, file = Regexp.last_match(1), Regexp.last_match(2)
|
531
|
+
paths.each do |path|
|
532
|
+
file = file.sub(path, "#{version}/") if file.start_with?(path)
|
533
|
+
end
|
534
|
+
"/vendor_ruby/#{file}"
|
535
|
+
end
|
550
536
|
end
|
551
537
|
end
|
552
538
|
|
553
539
|
system_files.each do |src, desc|
|
554
540
|
FileUtils.makedirs(File.dirname(desc))
|
555
|
-
if File.file?(src)
|
556
|
-
FileUtils.copy(src, desc)
|
557
|
-
nputs_v " #{src}\n -> #{desc}"
|
558
|
-
end
|
541
|
+
FileUtils.copy(src, desc) if File.file?(src)
|
559
542
|
end
|
560
|
-
FileUtils.copy(scriptfile, desc_dir) unless options[:datafile]
|
543
|
+
FileUtils.copy(scriptfile, desc_dir) unless @options[:datafile]
|
561
544
|
end
|
562
545
|
|
563
546
|
def create_datafile
|
564
|
-
return unless options[:datafile]
|
547
|
+
return unless @options[:datafile]
|
565
548
|
|
566
549
|
nputs "Creating datafile '#{datafile}'."
|
567
550
|
data_files = @data_files.select { |file| File.file? file }
|
@@ -570,21 +553,22 @@ options:
|
|
570
553
|
end
|
571
554
|
data_files.uniq! { |file| File.expand_path(file) }
|
572
555
|
|
573
|
-
unless options[:virtual_directory]
|
556
|
+
unless @options[:virtual_directory]
|
574
557
|
dir_pwd = Dir.pwd.encode(Encoding::UTF_8)
|
575
558
|
virtual_directories = Pathname.new(dir_pwd).ascend.to_a.map(&:to_s)
|
576
559
|
data_files.each do |file|
|
577
560
|
fullpath = File.expand_path(file)
|
578
561
|
next if fullpath.start_with?(rubydir) || Pathname.new(file).absolute?
|
562
|
+
|
579
563
|
virtual_directories.shift until fullpath.start_with?(virtual_directories.first)
|
580
564
|
end
|
581
|
-
options[:virtual_directory] = relative_path(dir_pwd, virtual_directories.first, "/_neri_virtual_directory_/")
|
582
|
-
nputs "virtual_directory: #{options[:virtual_directory]}"
|
565
|
+
@options[:virtual_directory] = relative_path(dir_pwd, virtual_directories.first, "/_neri_virtual_directory_/")
|
566
|
+
nputs "virtual_directory: #{@options[:virtual_directory]}"
|
583
567
|
end
|
584
568
|
|
585
|
-
if options[:encryption_key]
|
569
|
+
if @options[:encryption_key]
|
586
570
|
require "digest/sha2"
|
587
|
-
@encryption_key = Digest::SHA2.hexdigest(options[:encryption_key])
|
571
|
+
@encryption_key = Digest::SHA2.hexdigest(@options[:encryption_key])
|
588
572
|
end
|
589
573
|
Neri.key = @encryption_key || "0" * 64
|
590
574
|
File.open(datafile, "wb") do |f|
|
@@ -592,19 +576,18 @@ options:
|
|
592
576
|
file_informations = data_files.map do |file|
|
593
577
|
fullpath = File.expand_path(file)
|
594
578
|
filename = if fullpath.start_with?(rubydir)
|
595
|
-
relative_path(fullpath, rubydir, "#{options[:system_dir]}#{File::SEPARATOR}")
|
579
|
+
relative_path(fullpath, rubydir, "#{@options[:system_dir]}#{File::SEPARATOR}")
|
596
580
|
else
|
597
581
|
file
|
598
582
|
end
|
599
583
|
filedata = [filename, File.size(file), pos].join("\t")
|
600
|
-
nputs_v " - #{filename}:#{File.size(file)} bytes"
|
601
584
|
pos += File.size(file)
|
602
|
-
pos += BLOCK_LENGTH - pos % BLOCK_LENGTH unless pos % BLOCK_LENGTH == 0
|
585
|
+
pos += Neri::BLOCK_LENGTH - pos % Neri::BLOCK_LENGTH unless pos % Neri::BLOCK_LENGTH == 0
|
603
586
|
filedata
|
604
587
|
end
|
605
588
|
files_str = file_informations.join("\n").encode(Encoding::UTF_8)
|
606
589
|
|
607
|
-
f.write(format("%#{BLOCK_LENGTH}d", files_str.bytesize))
|
590
|
+
f.write(format("%#{Neri::BLOCK_LENGTH}d", files_str.bytesize))
|
608
591
|
f.write(xor(files_str))
|
609
592
|
data_files.each do |file|
|
610
593
|
f.write(xor(File.binread(file)))
|
@@ -616,26 +599,26 @@ options:
|
|
616
599
|
nputs "Creating batch_file '#{basepath}.bat'."
|
617
600
|
|
618
601
|
pause_command = ""
|
619
|
-
if options[:pause_last]
|
602
|
+
if @options[:pause_last]
|
620
603
|
pause_command += "echo.\n"
|
621
|
-
|
622
|
-
|
623
|
-
|
624
|
-
|
625
|
-
|
626
|
-
|
604
|
+
pause_command +=
|
605
|
+
if @options[:pause_text]
|
606
|
+
"echo #{@options[:pause_text]}\npause > nul"
|
607
|
+
else
|
608
|
+
"pause"
|
609
|
+
end
|
627
610
|
end
|
628
|
-
chdir = options[:chdir_first] ? 'cd /d "%~dp0"' : ""
|
611
|
+
chdir = @options[:chdir_first] ? 'cd /d "%~dp0"' : ""
|
629
612
|
|
630
|
-
File.open("#{basepath}.bat", "w:#{options[:external_encoding]}") do |f|
|
613
|
+
File.open("#{basepath}.bat", "w:#{@options[:external_encoding]}") do |f|
|
631
614
|
f.puts <<-BATCH
|
632
615
|
@echo off
|
633
616
|
setlocal
|
634
|
-
set PATH=%~dp0#{options[:system_dir]}\\#{relative_path(bindir)};%PATH%
|
617
|
+
set PATH=%~dp0#{@options[:system_dir]}\\#{relative_path(bindir)};%PATH%
|
635
618
|
set NERI_EXECUTABLE=%~0
|
636
619
|
#{chdir}
|
637
620
|
if %~x0 == .exe ( shift )
|
638
|
-
#{ruby_command(options[:chdir_first] ? '' : '%~dp0')} %1 %2 %3 %4 %5 %6 %7 %8 %9
|
621
|
+
#{ruby_command(@options[:chdir_first] ? '' : '%~dp0')} %1 %2 %3 %4 %5 %6 %7 %8 %9
|
639
622
|
#{pause_command}
|
640
623
|
endlocal
|
641
624
|
BATCH
|
@@ -653,9 +636,9 @@ endlocal
|
|
653
636
|
c_file = to_winpath("#{basepath}_tmp.c" )
|
654
637
|
o_file = to_winpath("#{basepath}_tmp.o" )
|
655
638
|
rc_file = to_winpath("#{basepath}_tmp.rc")
|
656
|
-
system_dir = escape_cstr(to_winpath(File.join(options[:system_dir], "")))
|
639
|
+
system_dir = escape_cstr(to_winpath(File.join(@options[:system_dir], "")))
|
657
640
|
nputs "Creating exe_file '#{exe_file}'."
|
658
|
-
File.open(c_file, "w:#{options[:external_encoding]}") do |f|
|
641
|
+
File.open(c_file, "w:#{@options[:external_encoding]}") do |f|
|
659
642
|
f.puts <<-CFILE
|
660
643
|
#include <stdio.h>
|
661
644
|
#include <stdlib.h>
|
@@ -684,9 +667,9 @@ int main(int argc, char *argv[])
|
|
684
667
|
putenv(paths);
|
685
668
|
snprintf(paths, sizeof(paths), "PATH=%s%s#{system_dir}bin;%s", drive, dir, getenv("PATH"));
|
686
669
|
putenv(paths);
|
687
|
-
#{options[:chdir_first] ? 'snprintf(paths, sizeof(paths), "%s%s", drive, dir);chdir(paths);' : ''}
|
688
|
-
snprintf(runruby, sizeof(runruby), "#{escape_cstr(ruby_command(options[:chdir_first] ? '' : '%s%s'))} %s %s %s %s %s %s %s %s %s",
|
689
|
-
#{options[:chdir_first] ? '' : 'drive, dir,'}
|
670
|
+
#{@options[:chdir_first] ? 'snprintf(paths, sizeof(paths), "%s%s", drive, dir);chdir(paths);' : ''}
|
671
|
+
snprintf(runruby, sizeof(runruby), "#{escape_cstr(ruby_command(@options[:chdir_first] ? '' : '%s%s'))} %s %s %s %s %s %s %s %s %s",
|
672
|
+
#{@options[:chdir_first] ? '' : 'drive, dir,'}
|
690
673
|
argc > 1 ? argv[1] : "",
|
691
674
|
argc > 2 ? argv[2] : "",
|
692
675
|
argc > 3 ? argv[3] : "",
|
@@ -698,15 +681,15 @@ int main(int argc, char *argv[])
|
|
698
681
|
argc > 9 ? argv[9] : ""
|
699
682
|
);
|
700
683
|
CFILE
|
701
|
-
if options[:
|
684
|
+
if @options[:invisible]
|
702
685
|
f.puts %[ CreateProcess(NULL, runruby, NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS | CREATE_NO_WINDOW, NULL, NULL, &si, &pi);]
|
703
686
|
else
|
704
687
|
f.puts %[ system(runruby);]
|
705
688
|
end
|
706
|
-
if options[:pause_last]
|
689
|
+
if @options[:pause_last]
|
707
690
|
f.puts %[ system("echo.");]
|
708
|
-
if options[:pause_text]
|
709
|
-
f.puts %[ system("echo #{escape_cstr(options[:pause_text])}");]
|
691
|
+
if @options[:pause_text]
|
692
|
+
f.puts %[ system("echo #{escape_cstr(@options[:pause_text])}");]
|
710
693
|
f.puts %[ system("pause >nul");]
|
711
694
|
else
|
712
695
|
f.puts %[ system("pause");]
|
@@ -715,31 +698,31 @@ int main(int argc, char *argv[])
|
|
715
698
|
f.puts " return 0;\n}"
|
716
699
|
end
|
717
700
|
|
718
|
-
File.open(rc_file, "w:#{options[:external_encoding]}") do |f|
|
701
|
+
File.open(rc_file, "w:#{@options[:external_encoding]}") do |f|
|
719
702
|
f.puts <<-RCFILE
|
720
703
|
#include <winver.h>
|
721
704
|
|
722
705
|
1 VERSIONINFO
|
723
|
-
#{options[:
|
724
|
-
#{options[:
|
706
|
+
#{@options[:fileversion ] ? "FILEVERSION #{escape_cstr(@options[:fileversion ])}" : ''}
|
707
|
+
#{@options[:productversion] ? "PRODUCTVERSION #{escape_cstr(@options[:productversion])}" : ''}
|
725
708
|
FILETYPE VFT_APP
|
726
709
|
BEGIN
|
727
710
|
BLOCK "StringFileInfo"
|
728
711
|
BEGIN
|
729
712
|
BLOCK "000004b0"
|
730
713
|
BEGIN
|
731
|
-
#{options[:
|
732
|
-
#{options[:
|
733
|
-
#{options[:
|
734
|
-
#{options[:
|
735
|
-
#{options[:
|
736
|
-
#{options[:
|
737
|
-
#{options[:
|
738
|
-
#{options[:
|
739
|
-
#{options[:
|
740
|
-
#{options[:
|
741
|
-
#{options[:
|
742
|
-
#{options[:
|
714
|
+
#{@options[:fileversion ] ? 'VALUE "FileVersion", "' + escape_cstr(@options[:fileversion ]) + '\0"' : ''}
|
715
|
+
#{@options[:productversion ] ? 'VALUE "ProductVersion", "' + escape_cstr(@options[:productversion ]) + '\0"' : ''}
|
716
|
+
#{@options[:productname ] ? 'VALUE "ProductName", "' + escape_cstr(@options[:productname ]) + '\0"' : ''}
|
717
|
+
#{@options[:originalfilename] ? 'VALUE "OriginalFileName", "' + escape_cstr(@options[:originalfilename]) + '\0"' : ''}
|
718
|
+
#{@options[:internalname ] ? 'VALUE "InternalName", "' + escape_cstr(@options[:internalname ]) + '\0"' : ''}
|
719
|
+
#{@options[:description ] ? 'VALUE "FileDescription", "' + escape_cstr(@options[:description ]) + '\0"' : ''}
|
720
|
+
#{@options[:company ] ? 'VALUE "CompanyName", "' + escape_cstr(@options[:company ]) + '\0"' : ''}
|
721
|
+
#{@options[:trademarks ] ? 'VALUE "LegalTrademarks", "' + escape_cstr(@options[:trademarks ]) + '\0"' : ''}
|
722
|
+
#{@options[:copyright ] ? 'VALUE "LegalCopyright", "' + escape_cstr(@options[:copyright ]) + '\0"' : ''}
|
723
|
+
#{@options[:privatebuild ] ? 'VALUE "PrivateBuild", "' + escape_cstr(@options[:privatebuild ]) + '\0"' : ''}
|
724
|
+
#{@options[:specialbuild ] ? 'VALUE "SpecialBuild", "' + escape_cstr(@options[:specialbuild ]) + '\0"' : ''}
|
725
|
+
#{@options[:comments ] ? 'VALUE "Comments", "' + escape_cstr(@options[:comments ]) + '\0"' : ''}
|
743
726
|
END
|
744
727
|
END
|
745
728
|
|
@@ -749,23 +732,23 @@ BEGIN
|
|
749
732
|
END
|
750
733
|
END
|
751
734
|
|
752
|
-
2 ICON "#{escape_cstr(options[:
|
735
|
+
2 ICON "#{escape_cstr(@options[:icon])}"
|
753
736
|
RCFILE
|
754
737
|
end
|
755
738
|
nsystem(%(windres -o "#{o_file}" "#{rc_file}"))
|
756
|
-
nsystem(%(gcc#{options[:
|
739
|
+
nsystem(%(gcc#{@options[:invisible] ? ' -mwindows' : ''} -o "#{exe_file}" "#{c_file}" "#{o_file}"))
|
757
740
|
nsystem(%(strip "#{exe_file}"))
|
758
741
|
File.delete(c_file, rc_file, o_file)
|
759
742
|
end
|
760
743
|
|
761
744
|
def ruby_command(path)
|
762
|
-
system_dir = "#{path}#{File.join(options[:system_dir], '')}"
|
745
|
+
system_dir = "#{path}#{File.join(@options[:system_dir], '')}"
|
763
746
|
ruby_code = ""
|
764
747
|
ruby_code = "Neri.key='#{@encryption_key}';" if @encryption_key
|
765
|
-
if options[:datafile]
|
766
|
-
ruby_code += "Neri.datafile='#{system_dir}' + #{unpack_filename(options[:datafile])};"
|
767
|
-
if options[:virtual_directory]
|
768
|
-
ruby_code += "Neri.virtual_directory=#{unpack_filename(options[:virtual_directory])};"
|
748
|
+
if @options[:datafile]
|
749
|
+
ruby_code += "Neri.datafile='#{system_dir}' + #{unpack_filename(@options[:datafile])};"
|
750
|
+
if @options[:virtual_directory]
|
751
|
+
ruby_code += "Neri.virtual_directory=#{unpack_filename(@options[:virtual_directory])};"
|
769
752
|
end
|
770
753
|
ruby_code += "load #{unpack_filename(File.basename(scriptfile))}"
|
771
754
|
else
|
@@ -781,141 +764,23 @@ END
|
|
781
764
|
%(#{ruby}#{r} #{@rubyopt} -e "# coding:utf-8" -e "#{ruby_code}" #{@args})
|
782
765
|
end
|
783
766
|
|
784
|
-
def bat_to_exe_converter
|
785
|
-
create_batfile
|
786
|
-
begin
|
787
|
-
`#{options[:b2ec_path]} /help`
|
788
|
-
rescue
|
789
|
-
error "Bat To Exe Converter not found !"
|
790
|
-
return
|
791
|
-
end
|
792
|
-
|
793
|
-
batch_file = "#{basepath}.bat"
|
794
|
-
exe_file = "#{basepath}.exe"
|
795
|
-
nputs "Creating exe_file '#{exe_file}' with Bat To Exe Converter."
|
796
|
-
File.delete(exe_file) if File.exist?(exe_file)
|
797
|
-
if options[:b2ec][:x64].nil? && RbConfig::CONFIG["target"].to_s.index("64")
|
798
|
-
options[:b2ec][:x64] = true
|
799
|
-
end
|
800
|
-
args = %( /bat "#{batch_file}" /exe "#{exe_file}")
|
801
|
-
args += options[:b2ec].map { |key, value|
|
802
|
-
case value
|
803
|
-
when String then %( /#{key.to_s.tr('_', '-')} "#{value}")
|
804
|
-
when true then %( /#{key.to_s.tr('_', '-')})
|
805
|
-
else; %()
|
806
|
-
end
|
807
|
-
}.join("")
|
808
|
-
|
809
|
-
error "Failed to create exe_file !" unless nsystem "#{options[:b2ec_path]}#{args}"
|
810
|
-
end
|
811
|
-
|
812
|
-
def upx
|
813
|
-
unless system("#{options[:upx_path]} --version >nul 2>&1")
|
814
|
-
error "UPX not found !"
|
815
|
-
return
|
816
|
-
end
|
817
|
-
|
818
|
-
nputs "Compressing with UPX."
|
819
|
-
options[:upx_targets].each do |target|
|
820
|
-
Dir.glob(File.join(options[:output_dir], options[:system_dir], target)).each do |target_path|
|
821
|
-
command = %("#{options[:upx_path]}" #{options[:upx_options]} "#{target_path}")
|
822
|
-
nsystem command
|
823
|
-
end
|
824
|
-
end
|
825
|
-
end
|
826
|
-
|
827
|
-
def create_zipfile
|
828
|
-
unless system("#{options[:sevenzip_path]} >nul 2>&1")
|
829
|
-
error "7-Zip not found !"
|
830
|
-
return
|
831
|
-
end
|
832
|
-
|
833
|
-
nputs "Creating zip_file '#{options[:zipfile]}'."
|
834
|
-
File.delete(options[:zipfile]) if File.exist?(options[:zipfile])
|
835
|
-
files = []
|
836
|
-
if options[:output_dir] == "./"
|
837
|
-
files.push(options[:system_dir])
|
838
|
-
files.push(File.exist?("#{basepath}.exe") ? "#{basepath}.exe" : "#{basepath}.bat")
|
839
|
-
else
|
840
|
-
files.push(options[:output_dir])
|
841
|
-
end
|
842
|
-
command = %("#{options[:sevenzip_path]}" a "#{options[:zipfile]}" "#{files.join('" "')}")
|
843
|
-
nsystem command
|
844
|
-
end
|
845
|
-
|
846
|
-
def inno_setup
|
847
|
-
unless system("#{options[:iscc_path]} /? >nul 2>&1")
|
848
|
-
error("Inno Setup not found !")
|
849
|
-
return
|
850
|
-
end
|
851
|
-
|
852
|
-
filename = options[:inno_script]
|
853
|
-
nputs "Creating Installer '#{filename}'."
|
854
|
-
script = "[Setup]\n"
|
855
|
-
if File.exist?(filename)
|
856
|
-
script = File.read(filename, encoding: Encoding::UTF_8)
|
857
|
-
filename = "#{File.basename(filename, '.*')}_tmp#{File.extname(filename)}"
|
858
|
-
end
|
859
|
-
|
860
|
-
version = options[:b2ec][:productversion] || options[:b2ec][:fileversion]
|
861
|
-
if !script.match(/^AppName=/) && options[:b2ec][:productname]
|
862
|
-
script.sub!(/^(\[Setup\])(\s+)/i) { "#{$1}\nAppName=#{options[:b2ec][:productname]}#{$2}" }
|
863
|
-
end
|
864
|
-
if !script.match(/^AppVersion=/) && version
|
865
|
-
script.sub!(/^(\[Setup\])(\s+)/i) { "#{$1}\nAppVersion=#{version}#{$2}" }
|
866
|
-
end
|
867
|
-
if !script.match(/^AppVerName=/) && options[:b2ec][:productname] && version
|
868
|
-
script.sub!(/^(\[Setup\])(\s+)/i) { "#{$1}\nAppVerName=#{options[:b2ec][:productname]} #{version}#{$2}" }
|
869
|
-
end
|
870
|
-
if !script.match(/^AppPublisher=/) && options[:b2ec][:company]
|
871
|
-
script.sub!(/^(\[Setup\])(\s+)/i) { "#{$1}\nAppPublisher=#{options[:b2ec][:company]}#{$2}" }
|
872
|
-
end
|
873
|
-
if !script.match(/^AppCopyright=/) && options[:b2ec][:copyright]
|
874
|
-
script.sub!(/^(\[Setup\])(\s+)/i) { "#{$1}\nAppCopyright=#{options[:b2ec][:copyright]}#{$2}" }
|
875
|
-
end
|
876
|
-
|
877
|
-
script += "\n[Files]\n" unless script.match(/^\[Files\]/)
|
878
|
-
dir = File.expand_path(options[:output_dir])
|
879
|
-
files_str = ""
|
880
|
-
Dir.glob(File.join(dir, "**", "*")).each do |file|
|
881
|
-
next unless File.file? file
|
882
|
-
|
883
|
-
dist_dir = to_winpath(File::SEPARATOR + File.dirname(relative_path(file, dir)))
|
884
|
-
dist_dir = "" if dist_dir == "\\."
|
885
|
-
files_str += "\nSource: \"#{to_winpath(file)}\"; DistDir: \"{app}#{dist_dir}"
|
886
|
-
files_str += "; Flags: isreadme" if File.basename(file).match(/^readme/i)
|
887
|
-
end
|
888
|
-
script.sub!(/^(\[Files\])(\s*)/i) { "#{$1}#{files_str}#{$2}" }
|
889
|
-
|
890
|
-
File.write(filename, script)
|
891
|
-
command = %(#{options[:iscc_path]} "#{filename}")
|
892
|
-
nsystem command
|
893
|
-
end
|
894
|
-
|
895
767
|
def run
|
896
768
|
check_options
|
897
769
|
dependencies = check_dependencies
|
898
770
|
copy_files(dependencies)
|
899
771
|
create_datafile
|
900
|
-
|
901
|
-
create_batfile
|
902
|
-
else
|
903
|
-
options[:use_b2ec] ? bat_to_exe_converter : create_exefile
|
904
|
-
end
|
905
|
-
upx if options[:use_upx]
|
906
|
-
create_zipfile if options[:zipfile]
|
907
|
-
inno_setup if options[:inno_script]
|
772
|
+
@options[:no_exe] ? create_batfile : create_exefile
|
908
773
|
nputs "Neri Finished."
|
909
774
|
end
|
910
775
|
|
911
776
|
private
|
912
777
|
|
913
|
-
def
|
914
|
-
|
778
|
+
def xor(str)
|
779
|
+
Neri.__send__(:xor, str)
|
915
780
|
end
|
916
781
|
|
917
|
-
def
|
918
|
-
puts str
|
782
|
+
def nputs(str)
|
783
|
+
puts "=== #{str}" unless @options[:quiet]
|
919
784
|
end
|
920
785
|
|
921
786
|
def error(str)
|
@@ -931,9 +796,8 @@ END
|
|
931
796
|
end
|
932
797
|
|
933
798
|
def nsystem(str)
|
934
|
-
|
935
|
-
command
|
936
|
-
system(command + (options[:quiet] ? " >nul 2>&1" : ""))
|
799
|
+
command = str.encode(@options[:external_encoding])
|
800
|
+
system(command + (@options[:quiet] ? " >nul 2>&1" : ""))
|
937
801
|
end
|
938
802
|
end
|
939
803
|
end
|