standalone-ruby 1.3 → 1.4
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/CHANGELOG.md +27 -19
- data/bin/standalone-ruby +3 -3
- data/lib/data/exe_template/launcher_stub.c +35 -0
- data/lib/data/exe_template/launcher_stub.cpp +9 -0
- data/lib/data/tcc/include/_mingw.h +54 -0
- data/lib/data/tcc/include/assert.h +71 -0
- data/lib/data/tcc/include/conio.h +159 -0
- data/lib/data/tcc/include/ctype.h +232 -0
- data/lib/data/tcc/include/dir.h +26 -0
- data/lib/data/tcc/include/direct.h +95 -0
- data/lib/data/tcc/include/dirent.h +96 -0
- data/lib/data/tcc/include/dos.h +110 -0
- data/lib/data/tcc/include/errno.h +117 -0
- data/lib/data/tcc/include/excpt.h +20 -0
- data/lib/data/tcc/include/fcntl.h +135 -0
- data/lib/data/tcc/include/fenv.h +85 -0
- data/lib/data/tcc/include/float.h +224 -0
- data/lib/data/tcc/include/inttypes.h +275 -0
- data/lib/data/tcc/include/io.h +296 -0
- data/lib/data/tcc/include/limits.h +115 -0
- data/lib/data/tcc/include/locale.h +100 -0
- data/lib/data/tcc/include/malloc.h +87 -0
- data/lib/data/tcc/include/math.h +438 -0
- data/lib/data/tcc/include/mem.h +8 -0
- data/lib/data/tcc/include/memory.h +9 -0
- data/lib/data/tcc/include/process.h +158 -0
- data/lib/data/tcc/include/setjmp.h +72 -0
- data/lib/data/tcc/include/share.h +44 -0
- data/lib/data/tcc/include/signal.h +111 -0
- data/lib/data/tcc/include/stdarg.h +16 -0
- data/lib/data/tcc/include/stdbool.h +10 -0
- data/lib/data/tcc/include/stddef.h +26 -0
- data/lib/data/tcc/include/stdint.h +184 -0
- data/lib/data/tcc/include/stdio.h +413 -0
- data/lib/data/tcc/include/stdlib.h +482 -0
- data/lib/data/tcc/include/string.h +206 -0
- data/lib/data/tcc/include/sys/fcntl.h +8 -0
- data/lib/data/tcc/include/sys/file.h +9 -0
- data/lib/data/tcc/include/sys/locking.h +52 -0
- data/lib/data/tcc/include/sys/stat.h +190 -0
- data/lib/data/tcc/include/sys/time.h +3 -0
- data/lib/data/tcc/include/sys/timeb.h +82 -0
- data/lib/data/tcc/include/sys/types.h +118 -0
- data/lib/data/tcc/include/sys/unistd.h +9 -0
- data/lib/data/tcc/include/sys/utime.h +89 -0
- data/lib/data/tcc/include/tchar.h +367 -0
- data/lib/data/tcc/include/time.h +219 -0
- data/lib/data/tcc/include/unistd.h +10 -0
- data/lib/data/tcc/include/values.h +4 -0
- data/lib/data/tcc/include/varargs.h +11 -0
- data/lib/data/tcc/include/wchar.h +318 -0
- data/lib/data/tcc/include/wctype.h +127 -0
- data/lib/data/tcc/include/winapi/basetsd.h +119 -0
- data/lib/data/tcc/include/winapi/basetyps.h +144 -0
- data/lib/data/tcc/include/winapi/winbase.h +1852 -0
- data/lib/data/tcc/include/winapi/wincon.h +207 -0
- data/lib/data/tcc/include/winapi/windef.h +240 -0
- data/lib/data/tcc/include/winapi/windows.h +176 -0
- data/lib/data/tcc/include/winapi/winerror.h +1054 -0
- data/lib/data/tcc/include/winapi/wingdi.h +2843 -0
- data/lib/data/tcc/include/winapi/winnetwk.h +346 -0
- data/lib/data/tcc/include/winapi/winnls.h +651 -0
- data/lib/data/tcc/include/winapi/winnt.h +2667 -0
- data/lib/data/tcc/include/winapi/winreg.h +159 -0
- data/lib/data/tcc/include/winapi/winsvc.h +309 -0
- data/lib/data/tcc/include/winapi/winuser.h +3472 -0
- data/lib/data/tcc/include/winapi/winver.h +133 -0
- data/lib/data/tcc/lib/gdi32.def +337 -0
- data/lib/data/tcc/lib/kernel32.def +763 -0
- data/lib/data/tcc/lib/libtcc1.a +0 -0
- data/lib/data/tcc/lib/msvcrt.def +782 -0
- data/lib/data/tcc/lib/user32.def +654 -0
- data/lib/data/tcc/tcc.exe +0 -0
- data/lib/data/tcc/tiny_impdef.exe +0 -0
- data/lib/data/tcc/tiny_libmaker.exe +0 -0
- data/lib/data/vbs/default_vbs.txt +1 -1
- data/lib/data/vbs/vbs_gui.txt +1 -1
- data/lib/standalone_ruby.rb +6 -6
- data/lib/utils/config_generator.rb +5 -0
- data/lib/utils/displayer.rb +61 -56
- data/lib/utils/exe_packer.rb +68 -0
- data/lib/utils/launcher.rb +55 -14
- data/lib/utils/launcher_handler.rb +27 -4
- data/lib/utils/logger_helper.rb +24 -22
- data/lib/utils/parameter_parser.rb +206 -189
- data/lib/utils/ruby_copy.rb +26 -20
- metadata +77 -3
- data/lib/data/bat/default_bat.txt +0 -9
data/lib/utils/displayer.rb
CHANGED
@@ -1,57 +1,62 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
display_text
|
12
|
-
|
13
|
-
display_text << "
|
14
|
-
display_text << "
|
15
|
-
display_text << "
|
16
|
-
display_text << "
|
17
|
-
display_text << "
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
BANNER
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
1
|
+
require_relative 'logger_helper'
|
2
|
+
|
3
|
+
class Displayer
|
4
|
+
def initialize(params)
|
5
|
+
@params = params
|
6
|
+
@logger = LoggerHelper.instance
|
7
|
+
end
|
8
|
+
|
9
|
+
def display_params
|
10
|
+
begin
|
11
|
+
display_text = []
|
12
|
+
|
13
|
+
display_text << "Platform: #{@params[:platform]}" if @params[:platform]
|
14
|
+
display_text << "Project Path: #{@params[:project_path]}" if @params[:project_path]
|
15
|
+
display_text << "Exe File: #{@params[:exe]}" if @params[:exe]
|
16
|
+
display_text << "Ruby Path: #{@params[:ruby_path]}" if @params[:ruby_path]
|
17
|
+
display_text << "Compiler: TCC (Thanks! Credit: https://bellard.org/tcc/)"
|
18
|
+
display_text << "Ruby Folder: #{File.basename(@params[:ruby_path])}" if @params[:ruby_path]
|
19
|
+
display_text << "Main File: #{@params[:main_file]}" if @params[:main_file]
|
20
|
+
display_text << "Launcher: #{@params[:launcher]}" if @params[:launcher]
|
21
|
+
display_text << "Launcher Type: #{@params[:launcher_type]}" if @params[:launcher_type]
|
22
|
+
display_text << "Template: #{@params[:template]}" if @params[:template]
|
23
|
+
display_text << "Template: Default Template" unless @params[:template]
|
24
|
+
display_text << "Log Path: Users Documents Directory"
|
25
|
+
|
26
|
+
puts display_text.join("\n") unless display_text.empty?
|
27
|
+
|
28
|
+
rescue Exception => e
|
29
|
+
print("Display Error: ".red); puts("#{e.message}".red)
|
30
|
+
@logger.error("Display Error: #{e.message}")
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def banner
|
35
|
+
banner = -<<'BANNER'
|
36
|
+
Standalone-Ruby v1.4 - Package your Ruby projects as exe!
|
37
|
+
# Github: https://github.com/ardatetikbey/Standalone-Ruby
|
38
|
+
# RubyGems: https://rubygems.org/gems/standalone-ruby
|
39
|
+
|
40
|
+
BANNER
|
41
|
+
|
42
|
+
puts banner
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
class String
|
47
|
+
def red
|
48
|
+
"\e[31m#{self}\e[0m"
|
49
|
+
end
|
50
|
+
|
51
|
+
def green
|
52
|
+
"\e[32m#{self}\e[0m"
|
53
|
+
end
|
54
|
+
|
55
|
+
def magenta
|
56
|
+
"\e[35m#{self}\e[0m"
|
57
|
+
end
|
58
|
+
|
59
|
+
def yellow
|
60
|
+
"\e[33m#{self}\e[0m"
|
61
|
+
end
|
57
62
|
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
require_relative 'logger_helper'
|
2
|
+
|
3
|
+
class ExePacker
|
4
|
+
def initialize(params)
|
5
|
+
@params = params
|
6
|
+
@logger = LoggerHelper.instance
|
7
|
+
end
|
8
|
+
|
9
|
+
def pack
|
10
|
+
begin
|
11
|
+
stub_path = File.join(File.expand_path("../data/exe_template", __dir__), "launcher_stub.c")
|
12
|
+
@logger.info("Reading stub template from: #{stub_path}")
|
13
|
+
|
14
|
+
stub_content = File.read(stub_path)
|
15
|
+
stub_content.gsub!("LAUNCHER_FILE", "#{File.basename(@params[:launcher])}")
|
16
|
+
|
17
|
+
stub_output = "#{File.join(@params[:project_path].to_s, "launcher_stub.c")}"
|
18
|
+
exe_path = "#{File.join(@params[:project_path].to_s, @params[:exe].to_s)}"
|
19
|
+
|
20
|
+
File.open(stub_output, 'w') { |f| f.write(stub_content) }
|
21
|
+
|
22
|
+
if @params[:use_gcc]
|
23
|
+
puts "\nChecking GCC..."
|
24
|
+
output = `where gcc`
|
25
|
+
|
26
|
+
if File.exist?(output.strip)
|
27
|
+
gcc_path = output.strip
|
28
|
+
puts "GCC Path: #{gcc_path}"
|
29
|
+
|
30
|
+
command = "#{gcc_path} -o #{exe_path} #{stub_output}"
|
31
|
+
@logger.info("Running command: #{command}")
|
32
|
+
`#{command}`
|
33
|
+
else
|
34
|
+
print("Error: ".red); puts("GCC could not be found!");
|
35
|
+
exit!
|
36
|
+
end
|
37
|
+
else
|
38
|
+
puts "\nUsing TCC..."
|
39
|
+
|
40
|
+
tcc_path = File.join(File.expand_path("../data/tcc", __dir__), "tcc.exe")
|
41
|
+
@logger.info("TCC Path: #{tcc_path}")
|
42
|
+
|
43
|
+
command = "#{tcc_path} -o #{exe_path} #{stub_output} -lkernel32"
|
44
|
+
@logger.info("Running command: #{command}")
|
45
|
+
`#{command}`
|
46
|
+
end
|
47
|
+
|
48
|
+
File.delete(stub_output)
|
49
|
+
@logger.info("Stub file deleted successfully")
|
50
|
+
|
51
|
+
puts("\nExe file has been generated!")
|
52
|
+
@logger.info("Exe file generated successfully at: #{exe_path}")
|
53
|
+
rescue Exception => err
|
54
|
+
@logger.error("Error occurred: #{err.message}")
|
55
|
+
print("Error: ".red); puts(err.message)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
class String
|
61
|
+
def red
|
62
|
+
"\e[31m#{self}\e[0m"
|
63
|
+
end
|
64
|
+
|
65
|
+
def yellow
|
66
|
+
"\e[33m#{self}\e[0m"
|
67
|
+
end
|
68
|
+
end
|
data/lib/utils/launcher.rb
CHANGED
@@ -1,36 +1,77 @@
|
|
1
1
|
require 'optparse'
|
2
2
|
|
3
3
|
class Launcher
|
4
|
-
|
5
4
|
require_relative 'displayer'
|
6
5
|
require_relative 'parameter_parser'
|
7
6
|
require_relative 'ruby_copy'
|
7
|
+
require_relative 'logger_helper'
|
8
|
+
require_relative 'exe_packer'
|
8
9
|
require_relative 'launcher_handler'
|
9
|
-
# require_relative '
|
10
|
+
# require_relative 'config_generator'
|
10
11
|
|
11
12
|
def initialize
|
12
13
|
@parser = ParameterParser.new
|
13
14
|
@parser.parse
|
14
|
-
|
15
15
|
@params = @parser.params
|
16
|
+
|
16
17
|
@displayer = Displayer.new(@params)
|
17
18
|
@ruby_copy = RubyCopy.new(@params)
|
19
|
+
@logger = LoggerHelper.instance
|
20
|
+
@exe_packer = ExePacker.new(@params)
|
18
21
|
@launcher_handler = LauncherHandler.new(@params)
|
19
22
|
end
|
20
23
|
|
21
|
-
def
|
22
|
-
|
23
|
-
|
24
|
-
|
24
|
+
def platform_analysis
|
25
|
+
case RUBY_PLATFORM
|
26
|
+
when /win32|mingw|cygwin/
|
27
|
+
@params[:platform] = 'Windows'
|
28
|
+
@logger.info("Working on windows platform.")
|
29
|
+
else
|
30
|
+
print("Error: ".red); puts("This platform is not supported! Exiting...")
|
31
|
+
@logger.error("This platform is not supported! Exiting...")
|
32
|
+
exit!
|
25
33
|
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def run
|
37
|
+
begin
|
38
|
+
Signal.trap("INT") do
|
39
|
+
@logger.info("The program was closed because an interrupt command was detected.")
|
40
|
+
puts "\nProgram interrupted. Shutting down..."
|
41
|
+
exit(0)
|
42
|
+
end
|
26
43
|
|
27
|
-
|
28
|
-
@displayer.display_params
|
44
|
+
platform_analysis
|
29
45
|
|
30
|
-
|
31
|
-
|
46
|
+
@logger.info("the executor function is started.")
|
47
|
+
@displayer.banner
|
48
|
+
@logger.info("Banner display was made.")
|
49
|
+
@displayer.display_params
|
50
|
+
@logger.info("The parameters entered by the user are reflected on the screen.")
|
51
|
+
@ruby_copy.robocopy_interpreter
|
52
|
+
@logger.info("Ruby interpreter copy function completed.")
|
53
|
+
@launcher_handler.handle
|
54
|
+
@logger.info("Launcher handler finished.")
|
55
|
+
@exe_packer.pack
|
56
|
+
@logger.info("Exe pack finished.")
|
57
|
+
|
58
|
+
puts "\nThanks for using Standalone-Ruby!"
|
59
|
+
|
60
|
+
print("\nWARNING: ".yellow); puts("Instead of changing the path of the created exe file, create a shortcut. The same applies here as in every application.")
|
61
|
+
@logger.info("Program finished.")
|
62
|
+
rescue Exception => e
|
63
|
+
@logger.error("Launcher Error: #{e.message}")
|
64
|
+
print("Launcher Error: "); puts("#{e.message}".red)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
class String
|
70
|
+
def red
|
71
|
+
"\e[31m#{self}\e[0m"
|
72
|
+
end
|
32
73
|
|
33
|
-
|
34
|
-
|
74
|
+
def yellow
|
75
|
+
"\e[33m#{self}\e[0m"
|
35
76
|
end
|
36
|
-
end
|
77
|
+
end
|
@@ -1,14 +1,19 @@
|
|
1
1
|
require 'fileutils'
|
2
2
|
|
3
|
+
require_relative 'logger_helper'
|
4
|
+
|
3
5
|
class LauncherHandler
|
4
6
|
def initialize(params)
|
5
7
|
@params = params
|
8
|
+
@logger = LoggerHelper.instance
|
6
9
|
end
|
7
10
|
|
8
11
|
def handle
|
9
12
|
begin
|
10
13
|
puts("\nThe template creation process has been started.")
|
11
14
|
|
15
|
+
# FileUtils.mkdir(File.join(@params[:project_path], "sRb_files"))
|
16
|
+
|
12
17
|
if @params[:template]
|
13
18
|
if @params[:gui] == true
|
14
19
|
ruby_file = "rubyw.exe"
|
@@ -18,15 +23,20 @@ class LauncherHandler
|
|
18
23
|
|
19
24
|
user_template = @params[:template].to_s
|
20
25
|
content = File.read(user_template)
|
26
|
+
@logger.info("The content of the user template has been read.")
|
21
27
|
|
22
28
|
content.gsub!("STANDALONE_RUBY_PATH", "#{File.join(File.basename(@params[:ruby_path].to_s), "bin", "#{ruby_file}")}")
|
29
|
+
@logger.info("Placed the defined Ruby interpreter path in the template.")
|
30
|
+
|
23
31
|
content.gsub!("STANDALONE_MAIN_FILE", "#{File.basename(@params[:main_file].to_s)}")
|
32
|
+
@logger.info("The main project file path defined in the template is placed.")
|
24
33
|
|
25
34
|
new_launcher_path = File.join(@params[:project_path].to_s, @params[:launcher_name].to_s)
|
26
|
-
|
27
35
|
File.open(new_launcher_path, "w") do |f_man|
|
28
36
|
f_man.puts content
|
29
37
|
end
|
38
|
+
|
39
|
+
@logger.info("New launcher file directory created as #{new_launcher_path.to_s}")
|
30
40
|
else
|
31
41
|
if @params[:launcher_type] == "vbs"
|
32
42
|
if @params[:gui] == true
|
@@ -41,17 +51,23 @@ class LauncherHandler
|
|
41
51
|
|
42
52
|
if File.exist?(vbs_template)
|
43
53
|
content = File.read(vbs_template)
|
54
|
+
@logger.info("The content of the template has been read.")
|
44
55
|
|
45
56
|
content.gsub!("STANDALONE_RUBY_PATH", "#{File.join(File.basename(@params[:ruby_path].to_s), "bin", "#{ruby_file}")}")
|
57
|
+
@logger.info("Placed the defined Ruby interpreter path in the template.")
|
58
|
+
|
46
59
|
content.gsub!("STANDALONE_MAIN_FILE", "#{File.basename(@params[:main_file].to_s)}")
|
60
|
+
@logger.info("The main project file path defined in the template is placed.")
|
47
61
|
|
48
62
|
new_launcher_path = File.join(@params[:project_path].to_s, @params[:launcher_name].to_s)
|
49
|
-
|
50
63
|
File.open(new_launcher_path, "w") do |f_man|
|
51
64
|
f_man.puts content
|
52
65
|
end
|
66
|
+
|
67
|
+
@logger.info("New launcher file directory created as #{new_launcher_path.to_s}")
|
53
68
|
else
|
54
|
-
print("Handler Error: ".red); puts("
|
69
|
+
print("Handler Error: ".red); puts("The template file could not be found.")
|
70
|
+
@logger.error("Template file not found!")
|
55
71
|
exit!
|
56
72
|
end
|
57
73
|
else
|
@@ -66,23 +82,30 @@ class LauncherHandler
|
|
66
82
|
|
67
83
|
if File.exist?(bat_template)
|
68
84
|
content = File.read(bat_template)
|
85
|
+
@logger.info("The content of the template has been read.")
|
69
86
|
|
70
87
|
content.gsub!("STANDALONE_RUBY_PATH", "#{File.join(File.basename(@params[:ruby_path].to_s), "bin", "#{ruby_file}")}")
|
88
|
+
@logger.info("Placed the defined Ruby interpreter path in the template.")
|
89
|
+
|
71
90
|
content.gsub!("STANDALONE_MAIN_FILE", "#{File.basename(@params[:main_file].to_s)}")
|
91
|
+
@logger.info("The main project file path defined in the template is placed.")
|
72
92
|
|
73
93
|
new_launcher_path = File.join(@params[:project_path].to_s, @params[:launcher_name].to_s)
|
74
|
-
|
75
94
|
File.open(new_launcher_path, "w") do |f_man|
|
76
95
|
f_man.puts content
|
77
96
|
end
|
97
|
+
|
98
|
+
@logger.info("New launcher file directory created as #{new_launcher_path.to_s}")
|
78
99
|
else
|
79
100
|
print("Handler Error: ".red); puts("The template file could not be found.")
|
101
|
+
@logger.error("Handler Error: Template file not found!")
|
80
102
|
exit!
|
81
103
|
end
|
82
104
|
end
|
83
105
|
end
|
84
106
|
rescue Exception => e
|
85
107
|
print("Handler Error: ".red); puts("#{e.message}")
|
108
|
+
@logger.error("Handler Error: #{e.message}")
|
86
109
|
end
|
87
110
|
end
|
88
111
|
end
|
data/lib/utils/logger_helper.rb
CHANGED
@@ -1,22 +1,24 @@
|
|
1
|
-
require 'logger'
|
2
|
-
require 'time'
|
3
|
-
require 'fileutils'
|
4
|
-
|
5
|
-
class LoggerHelper
|
6
|
-
def self.instance
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
1
|
+
require 'logger'
|
2
|
+
require 'time'
|
3
|
+
require 'fileutils'
|
4
|
+
|
5
|
+
class LoggerHelper
|
6
|
+
def self.instance
|
7
|
+
documents_path = File.join(ENV['USERPROFILE'], 'Documents', 'standalone-ruby-logs')
|
8
|
+
|
9
|
+
FileUtils.mkdir_p(documents_path) unless Dir.exist?(documents_path)
|
10
|
+
|
11
|
+
timestamp = Time.now.strftime("%Y-%m-%d_%H-%M-%S")
|
12
|
+
log_file = File.join(documents_path, "standalone-ruby_#{timestamp}.log")
|
13
|
+
|
14
|
+
logger = Logger.new(log_file)
|
15
|
+
logger.level = Logger::INFO
|
16
|
+
|
17
|
+
logger.formatter = proc do |severity, datetime, progname, msg|
|
18
|
+
msg = "(empty message)" if msg.nil? || msg.strip.empty?
|
19
|
+
"#{datetime.strftime('%Y-%m-%d %H:%M:%S')} [#{severity}] #{msg}\n"
|
20
|
+
end
|
21
|
+
|
22
|
+
return logger
|
23
|
+
end
|
24
|
+
end
|