neri 0.9.4 → 1.0.0

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