tebako 0.7.3 → 0.8.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/CMakeLists.txt +20 -29
- data/README.adoc +659 -174
- data/common.env +1 -1
- data/exe/tebako-packager +10 -20
- data/lib/tebako/cli.rb +2 -2
- data/lib/tebako/cli_rubies.rb +3 -5
- data/lib/tebako/deploy_helper.rb +18 -5
- data/lib/tebako/packager/pass1.rb +7 -4
- data/lib/tebako/packager/pass2.rb +14 -16
- data/lib/tebako/packager/patch_buildsystem.rb +41 -7
- data/lib/tebako/packager/patch_helpers.rb +8 -4
- data/lib/tebako/packager/patch_libraries.rb +84 -65
- data/lib/tebako/packager/patch_literals.rb +15 -17
- data/lib/tebako/packager.rb +15 -13
- data/lib/tebako/stripper.rb +30 -7
- data/lib/tebako/version.rb +1 -1
- data/src/tebako-main.cpp +7 -0
- data/version.txt +1 -1
- metadata +2 -2
data/common.env
CHANGED
data/exe/tebako-packager
CHANGED
@@ -48,26 +48,7 @@ begin
|
|
48
48
|
end
|
49
49
|
|
50
50
|
Tebako::Packager.pass1(ARGV[1], ARGV[2], ARGV[3], ARGV[4], ARGV[5])
|
51
|
-
when "stash"
|
52
|
-
# ARGV[0] -- command
|
53
|
-
# ARGV[1] -- DATA_SRC_DIR
|
54
|
-
# ARGV[2] -- RUBY_STASH_DIR
|
55
|
-
unless ARGV.length == 3
|
56
|
-
raise Tebako::Error,
|
57
|
-
"tebako-packager stash command expects 3 arguments, #{ARGV.length} has been provided."
|
58
|
-
end
|
59
|
-
|
60
|
-
Tebako::Packager.stash(ARGV[1], ARGV[2])
|
61
|
-
when "strip"
|
62
|
-
# ARGV[0] -- command
|
63
|
-
# ARGV[1] -- OSTYPE
|
64
|
-
# ARGV[2] -- DATA_SRC_DIR
|
65
|
-
unless ARGV.length == 3
|
66
|
-
raise Tebako::Error,
|
67
|
-
"tebako-packager strip command expects 3 arguments, #{ARGV.length} has been provided."
|
68
|
-
end
|
69
51
|
|
70
|
-
Tebako::Stripper.strip(ARGV[1], ARGV[2])
|
71
52
|
when "pass1a"
|
72
53
|
# ARGV[0] -- command
|
73
54
|
# ARGV[1] -- RUBY_SOURCE_DIR
|
@@ -114,6 +95,16 @@ begin
|
|
114
95
|
# That shall match CMakeLists.txt settings
|
115
96
|
Tebako::Packager.deploy(ARGV[1], ARGV[4], ARGV[5], ARGV[11], ARGV[7], ARGV[8], ARGV[9])
|
116
97
|
|
98
|
+
when "finalize"
|
99
|
+
# ARGV[0] -- command
|
100
|
+
# ARGV[1] -- OSTYPE
|
101
|
+
# ARGV[2] -- RUBY_SOURCE_DIR
|
102
|
+
# ARGV[3] -- APP_NAME
|
103
|
+
unless ARGV.length == 4
|
104
|
+
raise Tebako::Error,
|
105
|
+
"tebako-packager finalize command expects 4 arguments, #{ARGV.length} has been provided."
|
106
|
+
end
|
107
|
+
Tebako::Packager.finalize(ARGV[1], ARGV[2], ARGV[3])
|
117
108
|
else
|
118
109
|
raise Tebako::Error, "tebako-packager cannot process #{ARGV[0]} command"
|
119
110
|
end
|
@@ -121,5 +112,4 @@ rescue Tebako::Error => e
|
|
121
112
|
puts "tebako-packager failed: #{e.message} [#{e.error_code}]"
|
122
113
|
exit(e.error_code)
|
123
114
|
end
|
124
|
-
|
125
115
|
exit(0)
|
data/lib/tebako/cli.rb
CHANGED
@@ -61,8 +61,8 @@ module Tebako
|
|
61
61
|
def clean_ruby
|
62
62
|
puts "Cleaning Ruby sources from tebako packaging environment"
|
63
63
|
suffix = options["Ruby"].nil? ? "" : "_#{options["Ruby"]}"
|
64
|
-
nmr = "src/
|
65
|
-
nms = "
|
64
|
+
nmr = "src/_ruby#{suffix}*"
|
65
|
+
nms = "stash#{suffix}*"
|
66
66
|
FileUtils.rm_rf(Dir.glob(File.join(deps, nmr)), secure: true)
|
67
67
|
FileUtils.rm_rf(Dir.glob(File.join(deps, nms)), secure: true)
|
68
68
|
end
|
data/lib/tebako/cli_rubies.rb
CHANGED
@@ -40,12 +40,10 @@ module Tebako
|
|
40
40
|
RUBY_VERSIONS = {
|
41
41
|
"2.7.8" => "c2dab63cbc8f2a05526108ad419efa63a67ed4074dbbcf9fc2b1ca664cb45ba0",
|
42
42
|
"3.0.7" => "2a3411977f2850431136b0fab8ad53af09fb74df2ee2f4fb7f11b378fe034388",
|
43
|
-
"3.1.4" => "a3d55879a0dfab1d7141fdf10d22a07dbf8e5cdc4415da1bde06127d5cc3c7b6",
|
44
|
-
"3.1.5" => "3685c51eeee1352c31ea039706d71976f53d00ab6d77312de6aa1abaf5cda2c5",
|
45
43
|
"3.1.6" => "0d0dafb859e76763432571a3109d1537d976266be3083445651dc68deed25c22",
|
46
|
-
"3.2.
|
47
|
-
"3.
|
48
|
-
|
44
|
+
"3.2.4" => "c72b3c5c30482dca18b0f868c9075f3f47d8168eaf626d4e682ce5b59c858692",
|
45
|
+
"3.3.3" => "83c05b2177ee9c335b631b29b8c077b4770166d02fa527f3a9f6a40d13f3cce2",
|
46
|
+
"3.3.4" => "fe6a30f97d54e029768f2ddf4923699c416cdbc3a6e96db3e2d5716c7db96a34"
|
49
47
|
}.freeze
|
50
48
|
|
51
49
|
DEFAULT_RUBY_VERSION = "3.1.6"
|
data/lib/tebako/deploy_helper.rb
CHANGED
@@ -29,6 +29,7 @@ require "fileutils"
|
|
29
29
|
require "find"
|
30
30
|
|
31
31
|
require_relative "error"
|
32
|
+
require_relative "packager/patch_helpers"
|
32
33
|
|
33
34
|
# Tebako - an executable packager
|
34
35
|
module Tebako
|
@@ -65,11 +66,16 @@ module Tebako
|
|
65
66
|
end
|
66
67
|
|
67
68
|
def deploy
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
69
|
+
Packager::PatchHelpers.with_env(deploy_env) do
|
70
|
+
unless Packager::PatchHelpers.ruby31?(@ruby_ver)
|
71
|
+
update_rubygems
|
72
|
+
patch_after_rubygems_update(@target_dir, @ruby_api_version)
|
73
|
+
end
|
74
|
+
system("#{gem_command} env")
|
75
|
+
install_gem("tebako-runtime")
|
76
|
+
install_gem("bundler", BUNDLER_VERSION) if needs_bundler?
|
77
|
+
deploy_solution
|
78
|
+
end
|
73
79
|
end
|
74
80
|
|
75
81
|
def deploy_env
|
@@ -264,6 +270,13 @@ module Tebako
|
|
264
270
|
end
|
265
271
|
end
|
266
272
|
|
273
|
+
def patch_after_rubygems_update(target_dir, ruby_api_ver)
|
274
|
+
# Autoload cannot handle statically linked openssl extension
|
275
|
+
# Changing it to require seems to be the simplest solution
|
276
|
+
Packager::PatchHelpers.patch_file("#{target_dir}/lib/ruby/site_ruby/#{ruby_api_ver}/rubygems/openssl.rb",
|
277
|
+
{ "autoload :OpenSSL, \"openssl\"" => "require \"openssl\"" })
|
278
|
+
end
|
279
|
+
|
267
280
|
def run_with_capture(args)
|
268
281
|
puts " ... @ #{args.join(" ")}"
|
269
282
|
out, st = Open3.capture2e(*args)
|
@@ -178,13 +178,16 @@ module Tebako
|
|
178
178
|
"$(WINMAINOBJ) $(EXTOBJS) $(LIBRUBYARG) $(LIBS) -o $@ # tebako patched",
|
179
179
|
|
180
180
|
"--output-exp=$(RUBY_EXP) \\" =>
|
181
|
-
|
181
|
+
"--output-exp=$(RUBY_EXP) --output-lib=$(LIBRUBY) --output-def=tebako.def \\",
|
182
182
|
|
183
|
-
"
|
184
|
-
"# tebako patched
|
183
|
+
"--export-all $(LIBRUBY_A) $(LIBS) -o $(PROGRAM)" =>
|
184
|
+
"--export-all $(LIBRUBY_A) $(LIBS) -o program-stub.exe # tebako patched",
|
185
|
+
|
186
|
+
"@rm -f $(PROGRAM)" =>
|
187
|
+
"@rm -f program-stub.exe # tebako patched",
|
185
188
|
|
186
189
|
" $(Q) $(LDSHARED) $(DLDFLAGS) $(OBJS) dmyext.o $(SOLIBS) -o $(PROGRAM)" =>
|
187
|
-
|
190
|
+
"# tebako patched $(Q) $(LDSHARED) $(DLDFLAGS) $(OBJS) dmyext.o $(SOLIBS) -o $(PROGRAM)",
|
188
191
|
|
189
192
|
"RUBYDEF = $(DLL_BASE_NAME).def" => GNUMAKEFILE_IN_WINMAIN_SUBST
|
190
193
|
}
|
@@ -38,23 +38,26 @@ module Tebako
|
|
38
38
|
class << self
|
39
39
|
def get_patch_map(ostype, deps_lib_dir, ruby_ver)
|
40
40
|
patch_map = get_patch_map_base(ostype, deps_lib_dir, ruby_ver)
|
41
|
-
|
42
41
|
patch_map.store("thread_pthread.c", LINUX_MUSL_THREAD_PTHREAD_PATCH) if ostype =~ /linux-musl/
|
43
|
-
|
44
42
|
if PatchHelpers.msys?(ostype)
|
45
43
|
patch_map.merge!(get_msys_patches(ruby_ver))
|
46
44
|
elsif PatchHelpers.ruby3x?(ruby_ver)
|
47
|
-
# [TODO] Do we really need it for platforms other then Windows ??
|
48
45
|
patch_map.store("common.mk", COMMON_MK_PATCH)
|
49
46
|
end
|
50
|
-
|
51
|
-
patch_map
|
47
|
+
extend_patch_map_r33(patch_map, ostype, deps_lib_dir, ruby_ver)
|
52
48
|
end
|
53
49
|
|
54
50
|
private
|
55
51
|
|
56
52
|
include Tebako::Packager::PatchBuildsystem
|
57
53
|
include Tebako::Packager::PatchLiterals
|
54
|
+
def extend_patch_map_r33(patch_map, ostype, deps_lib_dir, ruby_ver)
|
55
|
+
if PatchHelpers.ruby33?(ruby_ver) || PatchHelpers.msys?(ostype)
|
56
|
+
patch_map.store("config.status",
|
57
|
+
get_config_status_patch(ostype, deps_lib_dir, ruby_ver))
|
58
|
+
end
|
59
|
+
patch_map
|
60
|
+
end
|
58
61
|
|
59
62
|
def get_dir_c_patch(ostype)
|
60
63
|
pattern = PatchHelpers.msys?(ostype) ? "/* define system APIs */" : "#ifdef HAVE_GETATTRLIST"
|
@@ -91,21 +94,17 @@ module Tebako
|
|
91
94
|
end
|
92
95
|
|
93
96
|
def get_util_c_patch(ruby_ver)
|
94
|
-
if PatchHelpers.
|
97
|
+
if PatchHelpers.ruby31?(ruby_ver)
|
95
98
|
PatchHelpers.patch_c_file_post("#endif /* !HAVE_GNU_QSORT_R */")
|
96
99
|
else
|
97
100
|
PatchHelpers.patch_c_file_pre("#ifndef S_ISDIR")
|
98
101
|
end
|
99
102
|
end
|
100
103
|
|
101
|
-
def
|
104
|
+
def get_tool_mkconfig_rb_patch(ostype)
|
105
|
+
subst = PatchHelpers.msys?(ostype) ? TOOL_MKCONFIG_RB_SUBST_MSYS : TOOL_MKCONFIG_RB_SUBST
|
102
106
|
{
|
103
|
-
" if fast[name]" =>
|
104
|
-
"when /RUBYGEMS/; next" =>
|
105
|
-
"when /RUBYGEMS/; next\n\n" \
|
106
|
-
"# Start of tebako patch\n" \
|
107
|
-
"when /MAINLIBS/; val = #{PatchLibraries.msys_base_libs(ruby_ver)}\n" \
|
108
|
-
"# End of tebako patch"
|
107
|
+
" if fast[name]" => subst
|
109
108
|
}
|
110
109
|
end
|
111
110
|
|
@@ -119,10 +118,9 @@ module Tebako
|
|
119
118
|
end
|
120
119
|
|
121
120
|
def get_patch_map_base(ostype, deps_lib_dir, ruby_ver)
|
122
|
-
mcrb_subst = PatchHelpers.msys?(ostype) ? get_msys_mkconfig_rb_patches(ruby_ver) : TOOL_MKCONFIG_RB_PATCH
|
123
121
|
{
|
124
122
|
"template/Makefile.in" => template_makefile_in_patch(ostype, deps_lib_dir, ruby_ver),
|
125
|
-
"tool/mkconfig.rb" =>
|
123
|
+
"tool/mkconfig.rb" => get_tool_mkconfig_rb_patch(ostype),
|
126
124
|
"dir.c" => get_dir_c_patch(ostype), "dln.c" => get_dln_c_patch(ostype, ruby_ver),
|
127
125
|
"io.c" => get_io_c_patch(ostype, ruby_ver), "main.c" => MAIN_C_PATCH,
|
128
126
|
"file.c" => PatchHelpers.patch_c_file_pre("/* define system APIs */"),
|
@@ -135,7 +133,7 @@ module Tebako
|
|
135
133
|
{
|
136
134
|
"MAINLIBS = #{yjit_libs}@MAINLIBS@" =>
|
137
135
|
"# -- Start of tebako patch -- \n" \
|
138
|
-
"MAINLIBS = #{yjit_libs}#{PatchLibraries.mlibs(ostype, deps_lib_dir, ruby_ver)}" \
|
136
|
+
"MAINLIBS = #{yjit_libs}#{PatchLibraries.mlibs(ostype, deps_lib_dir, ruby_ver, true)}\n" \
|
139
137
|
"# -- End of tebako patch -- \n"
|
140
138
|
}
|
141
139
|
end
|
@@ -57,10 +57,14 @@ module Tebako
|
|
57
57
|
"$(EXTOBJS) $(LIBRUBYARG_STATIC) $(OUTFLAG)$@\n" \
|
58
58
|
"# -- End of tebako patch --"
|
59
59
|
|
60
|
-
|
60
|
+
TEMPLATE_MAKEFILE_IN_BASE_PATTERN_PRE_3_3 =
|
61
61
|
"\t\t$(Q) $(PURIFY) $(CC) $(EXE_LDFLAGS) $(XLDFLAGS) $(MAINOBJ) $(EXTOBJS) " \
|
62
62
|
"$(LIBRUBYARG) $(MAINLIBS) $(LIBS) $(EXTLIBS) $(OUTFLAG)$@"
|
63
63
|
|
64
|
+
TEMPLATE_MAKEFILE_IN_BASE_PATTERN =
|
65
|
+
"\t\t$(Q) $(PURIFY) $(CC) $(EXE_LDFLAGS) $(XLDFLAGS) $(MAINOBJ) $(EXTOBJS) " \
|
66
|
+
"$(LIBRUBYARG) $(MAINLIBS) $(EXTLIBS) $(OUTFLAG)$@"
|
67
|
+
|
64
68
|
TEMPLATE_MAKEFILE_IN_BASE_PATCH =
|
65
69
|
"# -- Start of tebako patch --\n" \
|
66
70
|
"\t\t$(Q) $(PURIFY) $(CC) $(EXE_LDFLAGS) $(MAINOBJ) " \
|
@@ -73,13 +77,23 @@ module Tebako
|
|
73
77
|
"$(EXTOBJS) $(LIBRUBYARG_STATIC) $(OUTFLAG)$@\n" \
|
74
78
|
"# -- End of tebako patch --"
|
75
79
|
|
76
|
-
def
|
80
|
+
def template_makefile_in_subst(ostype, ruby_ver)
|
77
81
|
if PatchHelpers.msys?(ostype)
|
78
|
-
|
79
|
-
elsif PatchHelpers.ruby31?(ruby_ver)
|
80
|
-
|
82
|
+
TEMPLATE_MAKEFILE_IN_BASE_PATCH_MSYS
|
83
|
+
elsif !PatchHelpers.ruby31?(ruby_ver)
|
84
|
+
TEMPLATE_MAKEFILE_IN_BASE_PATCH_PRE_3_1
|
85
|
+
else
|
86
|
+
TEMPLATE_MAKEFILE_IN_BASE_PATCH
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
def template_makefile_in_patch_two(ostype, ruby_ver)
|
91
|
+
if !PatchHelpers.ruby31?(ruby_ver)
|
92
|
+
{ TEMPLATE_MAKEFILE_IN_BASE_PATTERN_PRE_3_1 => template_makefile_in_subst(ostype, ruby_ver) }
|
93
|
+
elsif !PatchHelpers.ruby33?(ruby_ver)
|
94
|
+
{ TEMPLATE_MAKEFILE_IN_BASE_PATTERN_PRE_3_3 => template_makefile_in_subst(ostype, ruby_ver) }
|
81
95
|
else
|
82
|
-
{
|
96
|
+
{ TEMPLATE_MAKEFILE_IN_BASE_PATTERN => template_makefile_in_subst(ostype, ruby_ver) }
|
83
97
|
end
|
84
98
|
end
|
85
99
|
|
@@ -94,10 +108,30 @@ module Tebako
|
|
94
108
|
# End of tebako patch
|
95
109
|
SUBST
|
96
110
|
|
111
|
+
def get_config_status_pattern(ostype)
|
112
|
+
case ostype
|
113
|
+
when /linux-/
|
114
|
+
"S[\"MAINLIBS\"]=\"-lz -lrt -lrt -ldl -lcrypt -lm -lpthread \""
|
115
|
+
when /darwin/
|
116
|
+
"S[\"MAINLIBS\"]=\"-ldl -lobjc -lpthread \""
|
117
|
+
when /msys/
|
118
|
+
"S[\"MAINLIBS\"]=\"-lshell32 -lws2_32 -liphlpapi -limagehlp -lshlwapi -lbcrypt \""
|
119
|
+
else
|
120
|
+
raise Tebako::Error, "Unknown ostype #{ostype}"
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
def get_config_status_patch(ostype, deps_lib_dir, ruby_ver)
|
125
|
+
{
|
126
|
+
get_config_status_pattern(ostype) =>
|
127
|
+
"S[\"MAINLIBS\"]=\"#{PatchLibraries.mlibs(ostype, deps_lib_dir, ruby_ver, false)}\""
|
128
|
+
}
|
129
|
+
end
|
130
|
+
|
97
131
|
# Other MSYS (GNUMakefile) specific patches
|
98
132
|
# - The same issue with libraries as for Makefile above
|
99
133
|
# - 'Kill' ruby.exp regeneration on pass2
|
100
|
-
# since we want to use
|
134
|
+
# since we want to use output from pass1 for implib generation
|
101
135
|
# [VERY UGLY HACK]
|
102
136
|
# - Introduce LIBRUBY dependency on static extensions
|
103
137
|
# This is an addition to COMMON_MK_PATCH specified above
|
@@ -62,10 +62,18 @@ module Tebako
|
|
62
62
|
out
|
63
63
|
end
|
64
64
|
|
65
|
+
def exe_suffix(ostype)
|
66
|
+
msys?(ostype) ? ".exe" : ""
|
67
|
+
end
|
68
|
+
|
65
69
|
def msys?(ostype)
|
66
70
|
ostype =~ /msys|cygwin|mingw/
|
67
71
|
end
|
68
72
|
|
73
|
+
def macos?(ostype)
|
74
|
+
ostype =~ /darwin/
|
75
|
+
end
|
76
|
+
|
69
77
|
def patch_c_file_pre(pattern)
|
70
78
|
{
|
71
79
|
pattern => "#{PatchLiterals::C_FILE_SUBST}\n#{pattern}"
|
@@ -108,10 +116,6 @@ module Tebako
|
|
108
116
|
ruby3x?(ruby_ver) && ruby_ver[2].to_i >= 1
|
109
117
|
end
|
110
118
|
|
111
|
-
def ruby316?(ruby_ver)
|
112
|
-
ruby3x?(ruby_ver) && ruby_ver[2] == "1" && ruby_ver[4].to_i >= 6
|
113
|
-
end
|
114
|
-
|
115
119
|
def ruby32?(ruby_ver)
|
116
120
|
ruby3x?(ruby_ver) && ruby_ver[2].to_i >= 2
|
117
121
|
end
|
@@ -40,32 +40,101 @@ module Tebako
|
|
40
40
|
DARWIN_BREW_LIBS = [
|
41
41
|
["zlib", "z"], ["gdbm", "gdbm"], ["readline", "readline"], ["libffi", "ffi"],
|
42
42
|
["ncurses", "ncurses"], ["fmt", "fmt"], ["lz4", "lz4"], ["xz", "lzma"],
|
43
|
-
["libyaml", "yaml"], ["boost", "boost_chrono"],
|
44
|
-
["double-conversion", "double-conversion"]
|
43
|
+
["libyaml", "yaml"], ["boost", "boost_chrono"], ["double-conversion", "double-conversion"]
|
45
44
|
].freeze
|
46
45
|
|
47
46
|
DARWIN_BREW_LIBS_PRE_31 = [["openssl@1.1", "ssl"], ["openssl@1.1", "crypto"]].freeze
|
48
47
|
|
49
|
-
DARWIN_BREW_LIBS_31 = [["
|
48
|
+
DARWIN_BREW_LIBS_31 = [["openssl@3", "ssl"], ["openssl@3", "crypto"]].freeze
|
50
49
|
|
51
|
-
|
50
|
+
DARWIN_DEP_LIBS_1 = ["folly", "fsst", "metadata_thrift", "thrift_light", "xxhash", "zstd"].freeze
|
51
|
+
DARWIN_DEP_LIBS_2 = ["glog", "gflags", "brotlienc", "brotlidec", "brotlicommon"].freeze
|
52
52
|
# rubocop:enable Style/WordArray
|
53
53
|
|
54
|
+
COMMON_LINUX_LIBRARIES = [
|
55
|
+
"-l:libdwarfs-wr.a", "-l:libtebako-fs.a", "-l:libdwarfs.a", "LIBCOMPRESSION",
|
56
|
+
"-l:libfolly.a", "-l:libfsst.a", "-l:libmetadata_thrift.a", "-l:libthrift_light.a",
|
57
|
+
"-l:libxxhash.a", "-l:libfmt.a", "-l:libdouble-conversion.a", "-l:libglog.a",
|
58
|
+
"-l:libgflags.a", "-l:libevent.a"
|
59
|
+
].freeze
|
60
|
+
|
61
|
+
COMMON_ARCHIEVE_LIBRARIES = [
|
62
|
+
"-l:libarchive.a", "-l:liblz4.a", "-l:libz.a", "-l:libzstd.a",
|
63
|
+
"-l:libbrotlienc.a", "-l:libbrotlidec.a", "-l:libbrotlicommon.a", "-l:liblzma.a"
|
64
|
+
].freeze
|
65
|
+
|
66
|
+
LINUX_GNU_LIBRARIES = [
|
67
|
+
"-l:libiberty.a", "-l:libacl.a", "-l:libssl.a", "-l:libcrypto.a",
|
68
|
+
"-l:libgdbm.a", "-l:libreadline.a", "-l:libtinfo.a", "-l:libffi.a",
|
69
|
+
"-l:libncurses.a", "-l:libjemalloc.a", "-l:libcrypt.a", "-l:libanl.a",
|
70
|
+
"LIBYAML", "-l:libboost_system.a", "-l:libboost_chrono.a", "-l:libutil.a",
|
71
|
+
"-l:libstdc++.a", "-lgcc_eh", "-l:libunwind.a", "-l:liblzma.a",
|
72
|
+
"-l:librt.a", "-ldl", "-lpthread", "-lm"
|
73
|
+
].freeze
|
74
|
+
|
75
|
+
LINUX_MUSL_LIBRARIES = [
|
76
|
+
"-l:libiberty.a", "-l:libacl.a", "-l:libssl.a", "-l:libcrypto.a",
|
77
|
+
"-l:libreadline.a", "-l:libgdbm.a", "-l:libffi.a", "-l:libncurses.a",
|
78
|
+
"-l:libjemalloc.a", "-l:libcrypt.a", "LIBYAML", "-l:libboost_system.a",
|
79
|
+
"-l:libboost_chrono.a", "-l:librt.a", "-l:libstdc++.a", "-lgcc_eh",
|
80
|
+
" -l:libunwind.a", "-l:liblzma.a", "-ldl", "-lpthread"
|
81
|
+
].freeze
|
82
|
+
|
83
|
+
MSYS_LIBRARIES = [
|
84
|
+
"-l:liblz4.a", "-l:libz.a", "-l:libzstd.a", "-l:liblzma.a",
|
85
|
+
"-l:libncurses.a", "-l:libunwind.a", "-l:liblzma.a", "-l:libiberty.a",
|
86
|
+
"LIBYAML", "-l:libffi.a", "-l:libboost_system-mt.a", "-l:libboost_chrono-mt.a",
|
87
|
+
"-l:libstdc++.a", "-l:libdl.a", "-static-libgcc", "-static-libstdc++",
|
88
|
+
"-l:libssl.a", "-l:libcrypto.a", "-l:libz.a", "-l:libwinpthread.a",
|
89
|
+
"-lcrypt32", "-lshlwapi", "-lwsock32", "-liphlpapi",
|
90
|
+
"-limagehlp", "-lbcrypt", "-lole32", "-loleaut32",
|
91
|
+
"-luuid", "-lws2_32"
|
92
|
+
].freeze
|
93
|
+
|
94
|
+
def linux_gnu_libraries(ruby_ver, with_compression)
|
95
|
+
libraries = COMMON_LINUX_LIBRARIES + COMMON_ARCHIEVE_LIBRARIES + LINUX_GNU_LIBRARIES
|
96
|
+
linux_libraries(libraries, ruby_ver, with_compression)
|
97
|
+
end
|
98
|
+
|
99
|
+
def linux_musl_libraries(ruby_ver, with_compression)
|
100
|
+
libraries = COMMON_LINUX_LIBRARIES + COMMON_ARCHIEVE_LIBRARIES + LINUX_MUSL_LIBRARIES
|
101
|
+
linux_libraries(libraries, ruby_ver, with_compression)
|
102
|
+
end
|
103
|
+
|
104
|
+
def linux_libraries(libraries, ruby_ver, with_compression)
|
105
|
+
libraries.map! do |lib|
|
106
|
+
if lib == "LIBYAML"
|
107
|
+
PatchHelpers.yaml_reference(ruby_ver)
|
108
|
+
elsif lib == "LIBCOMPRESSION"
|
109
|
+
with_compression ? "-Wl,--push-state,--whole-archive -l:libdwarfs_compression.a -Wl,--pop-state" : ""
|
110
|
+
else
|
111
|
+
lib
|
112
|
+
end
|
113
|
+
end
|
114
|
+
libraries.join(" ")
|
115
|
+
end
|
116
|
+
|
117
|
+
def msys_libraries(ruby_ver, with_compression)
|
118
|
+
libraries = with_compression ? ["-Wl,-Bstatic"] : []
|
119
|
+
libraries = libraries + COMMON_LINUX_LIBRARIES + MSYS_LIBRARIES
|
120
|
+
linux_libraries(libraries, ruby_ver, with_compression)
|
121
|
+
end
|
122
|
+
|
54
123
|
def process_brew_libs!(libs, brew_libs)
|
55
124
|
brew_libs.each { |lib| libs << "#{PatchHelpers.get_prefix_macos(lib[0]).chop}/lib/lib#{lib[1]}.a " }
|
56
125
|
end
|
57
126
|
|
58
|
-
def
|
127
|
+
def darwin_libraries(deps_lib_dir, ruby_ver, with_compression)
|
59
128
|
libs = String.new
|
60
129
|
|
130
|
+
DARWIN_DEP_LIBS_1.each { |lib| libs << "#{deps_lib_dir}/lib#{lib}.a " }
|
61
131
|
process_brew_libs!(libs, PatchHelpers.ruby31?(ruby_ver) ? DARWIN_BREW_LIBS_31 : DARWIN_BREW_LIBS_PRE_31)
|
62
132
|
process_brew_libs!(libs, DARWIN_BREW_LIBS)
|
63
133
|
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
SUBST
|
134
|
+
DARWIN_DEP_LIBS_2.each { |lib| libs << "#{deps_lib_dir}/lib#{lib}.a " }
|
135
|
+
|
136
|
+
compression_lib = with_compression ? "-force_load #{deps_lib_dir}/libdwarfs_compression.a" : ""
|
137
|
+
"-ltebako-fs -ldwarfs-wr -ldwarfs #{compression_lib} #{libs} -ljemalloc -lc++ -lc++abi"
|
69
138
|
end
|
70
139
|
|
71
140
|
# .....................................................
|
@@ -80,66 +149,16 @@ module Tebako
|
|
80
149
|
# This is fixed by ext/extmk.rb patch [TODO ?]
|
81
150
|
# .....................................................
|
82
151
|
|
83
|
-
def
|
84
|
-
<<~SUBST
|
85
|
-
-l:libtebako-fs.a -l:libdwarfs-wr.a -l:libdwarfs.a -Wl,--push-state,--whole-archive -l:libdwarfs_compression.a -Wl,--pop-state -l:libfolly.a -l:libfsst.a \\
|
86
|
-
-l:libmetadata_thrift.a -l:libthrift_light.a -l:libxxhash.a -l:libfmt.a -l:libdouble-conversion.a -l:libglog.a -l:libgflags.a -l:libevent.a \\
|
87
|
-
SUBST
|
88
|
-
end
|
89
|
-
|
90
|
-
def common_enc_libs
|
91
|
-
"-l:liblz4.a -l:libz.a -l:libzstd.a -l:libbrotlienc.a -l:libbrotlidec.a -l:libbrotlicommon.a -l:liblzma.a"
|
92
|
-
end
|
93
|
-
|
94
|
-
def linux_gnu_libs(ruby_ver)
|
95
|
-
<<~SUBST
|
96
|
-
#{linux_common_libs} \
|
97
|
-
-l:libarchive.a -l:libiberty.a -l:libacl.a -l:libssl.a -l:libcrypto.a #{common_enc_libs} \\
|
98
|
-
-l:libgdbm.a -l:libreadline.a -l:libtinfo.a -l:libffi.a -l:libncurses.a -l:libjemalloc.a -l:libcrypt.a -l:libanl.a #{PatchHelpers.yaml_reference(ruby_ver)} \\
|
99
|
-
-l:libboost_system.a -l:libboost_chrono.a -l:libutil.a -l:libstdc++.a -lgcc_eh -l:libunwind.a -l:liblzma.a -l:librt.a -ldl -lpthread -lm
|
100
|
-
SUBST
|
101
|
-
end
|
102
|
-
|
103
|
-
def linux_musl_libs(ruby_ver)
|
104
|
-
<<~SUBST
|
105
|
-
#{linux_common_libs} \
|
106
|
-
-l:libiberty.a -l:libacl.a -l:libssl.a -l:libcrypto.a #{common_enc_libs} -l:libreadline.a \\
|
107
|
-
-l:libgdbm.a -l:libffi.a -l:libncurses.a -l:libjemalloc.a -l:libcrypt.a #{PatchHelpers.yaml_reference(ruby_ver)} -l:libboost_system.a -l:libboost_chrono.a \\
|
108
|
-
-l:librt.a -l:libstdc++.a -lgcc_eh -l:libunwind.a -l:liblzma.a -ldl -lpthread
|
109
|
-
SUBST
|
110
|
-
end
|
111
|
-
|
112
|
-
# Used for mkconfig.rb
|
113
|
-
def msys_base_libs(ruby_ver)
|
114
|
-
<<~SUBST
|
115
|
-
"-l:libtebako-fs.a -l:libdwarfs-wr.a -l:libdwarfs.a -l:libdwarfs_compression.a -l:libfolly.a -l:libfsst.a " \\
|
116
|
-
"-l:libmetadata_thrift.a -l:libthrift_light.a -l:libxxhash.a -l:libfmt.a -l:libdouble-conversion.a -l:libglog.a -l:libgflags.a -l:libevent.a " \\
|
117
|
-
"-l:liblz4.a -l:libz.a -l:libzstd.a -l:liblzma.a -l:libncurses.a -l:libunwind.a -l:liblzma.a -l:libiberty.a #{PatchHelpers.yaml_reference(ruby_ver)} " \\
|
118
|
-
"-l:libffi.a -l:libboost_system-mt.a -l:libboost_chrono-mt.a -l:libstdc++.a -l:libdl.a -static-libgcc -static-libstdc++ -l:libssl.a -l:libcrypto.a " \\
|
119
|
-
"-l:libz.a -l:libwinpthread.a -lcrypt32 -lshlwapi -lwsock32 -liphlpapi -limagehlp -lbcrypt -lole32 -loleaut32 -luuid"
|
120
|
-
SUBST
|
121
|
-
end
|
122
|
-
|
123
|
-
# Used in Makefile
|
124
|
-
def msys_libs(ruby_ver)
|
125
|
-
<<~SUBST
|
126
|
-
-Wl,-Bstatic #{linux_common_libs} \
|
127
|
-
-l:liblz4.a -l:libz.a -l:libzstd.a -l:liblzma.a -l:libncurses.a -l:libunwind.a -l:liblzma.a -l:libiberty.a #{PatchHelpers.yaml_reference(ruby_ver)} \\
|
128
|
-
-l:libffi.a -l:libboost_system-mt.a -l:libboost_chrono-mt.a -l:libstdc++.a -l:libdl.a -static-libgcc -static-libstdc++ -l:libssl.a -l:libcrypto.a -l:libz.a \\
|
129
|
-
-l:libwinpthread.a -lcrypt32 -lshlwapi -lwsock32 -liphlpapi -limagehlp -lshlwapi -lbcrypt -lws2_32 -lole32 -loleaut32 -luuid
|
130
|
-
SUBST
|
131
|
-
end
|
132
|
-
|
133
|
-
def mlibs(ostype, deps_lib_dir, ruby_ver) # rubocop:disable Metrics/MethodLength
|
152
|
+
def mlibs(ostype, deps_lib_dir, ruby_ver, with_compression) # rubocop:disable Metrics/MethodLength
|
134
153
|
case ostype
|
135
154
|
when /linux-gnu/
|
136
|
-
|
155
|
+
linux_gnu_libraries(ruby_ver, with_compression)
|
137
156
|
when /linux-musl/
|
138
|
-
|
157
|
+
linux_musl_libraries(ruby_ver, with_compression)
|
139
158
|
when /darwin/
|
140
|
-
|
159
|
+
darwin_libraries(deps_lib_dir, ruby_ver, with_compression)
|
141
160
|
when /msys/
|
142
|
-
|
161
|
+
msys_libraries(ruby_ver, with_compression)
|
143
162
|
else
|
144
163
|
raise Tebako::Error, "Unknown ostype #{ostype}"
|
145
164
|
end
|
@@ -30,25 +30,23 @@ module Tebako
|
|
30
30
|
module Packager
|
31
31
|
# Ruby patching literals (pass2)
|
32
32
|
module PatchLiterals
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
if v_head_comp == v[0...(v_head_comp.length)]
|
38
|
-
v = "\#{v[0...(v_head_comp.length)]}'/__tebako_memfs__'
|
39
|
-
"
|
40
|
-
end
|
41
|
-
v_head_comp = " CONFIG[\\"RUBY_EXEC_PREFIX\\"] \#{eq} "
|
42
|
-
if v_head_comp == v[0...(v_head_comp.length)]
|
33
|
+
TOOL_MKCONFIG_RB_SUBST = <<~SUBST
|
34
|
+
# -- Start of tebako patch --
|
35
|
+
v_head_comp = " CONFIG[\\"prefix\\"] \#{eq} "
|
36
|
+
if v_head_comp == v[0...(v_head_comp.length)]
|
43
37
|
v = "\#{v[0...(v_head_comp.length)]}'/__tebako_memfs__'
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
38
|
+
"
|
39
|
+
end
|
40
|
+
v_head_comp = " CONFIG[\\"RUBY_EXEC_PREFIX\\"] \#{eq} "
|
41
|
+
if v_head_comp == v[0...(v_head_comp.length)]
|
42
|
+
v = "\#{v[0...(v_head_comp.length)]}'/__tebako_memfs__'
|
43
|
+
"
|
44
|
+
end
|
45
|
+
# -- End of tebako patch --
|
46
|
+
if fast[name]
|
47
|
+
SUBST
|
50
48
|
|
51
|
-
|
49
|
+
TOOL_MKCONFIG_RB_SUBST_MSYS = <<~SUBST
|
52
50
|
# -- Start of tebako patch --
|
53
51
|
v_head_comp = " CONFIG[\\"prefix\\"] \#{eq} "
|
54
52
|
if v_head_comp == v[0...(v_head_comp.length)]
|
data/lib/tebako/packager.rb
CHANGED
@@ -31,6 +31,7 @@ require "pathname"
|
|
31
31
|
|
32
32
|
require_relative "error"
|
33
33
|
require_relative "deploy_helper"
|
34
|
+
require_relative "stripper"
|
34
35
|
require_relative "packager/pass1"
|
35
36
|
require_relative "packager/pass1a"
|
36
37
|
require_relative "packager/pass2"
|
@@ -79,14 +80,22 @@ module Tebako
|
|
79
80
|
|
80
81
|
deploy_helper = Tebako::DeployHelper.new(fs_root, fs_entrance, fs_mount_point, target_dir, pre_dir)
|
81
82
|
deploy_helper.config(os_type, ruby_ver)
|
83
|
+
deploy_helper.deploy
|
84
|
+
Tebako::Stripper.strip(os_type, target_dir)
|
85
|
+
end
|
82
86
|
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
87
|
+
def finalize(os_type, src_dir, app_name)
|
88
|
+
exe_suffix = Packager::PatchHelpers.exe_suffix(os_type)
|
89
|
+
src_name = File.join(src_dir, "ruby#{exe_suffix}")
|
90
|
+
package_name = "#{app_name}#{exe_suffix}"
|
91
|
+
# [TODO] On MSys strip sometimes creates a broken executable
|
92
|
+
# https://github.com/tamatebako/tebako/issues/172
|
93
|
+
if Packager::PatchHelpers.msys?(os_type)
|
94
|
+
FileUtils.cp(src_name, package_name)
|
95
|
+
else
|
96
|
+
Tebako::Stripper.strip_file(src_name, package_name)
|
89
97
|
end
|
98
|
+
puts "Created tebako package at \"#{package_name}\""
|
90
99
|
end
|
91
100
|
|
92
101
|
# Init
|
@@ -188,13 +197,6 @@ module Tebako
|
|
188
197
|
end
|
189
198
|
ruby_version
|
190
199
|
end
|
191
|
-
|
192
|
-
def patch_after_rubygems_update(target_dir, ruby_api_ver)
|
193
|
-
# Autoload cannot handle statically linked openssl extension
|
194
|
-
# Changing it to require seems to be the simplest solution
|
195
|
-
PatchHelpers.patch_file("#{target_dir}/lib/ruby/site_ruby/#{ruby_api_ver}/rubygems/openssl.rb",
|
196
|
-
{ "autoload :OpenSSL, \"openssl\"" => "require \"openssl\"" })
|
197
|
-
end
|
198
200
|
end
|
199
201
|
end
|
200
202
|
end
|