tebako 0.5.1 → 0.5.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (74) hide show
  1. checksums.yaml +4 -4
  2. data/CMakeLists.txt +21 -29
  3. data/README.adoc +53 -28
  4. data/Rakefile +10 -0
  5. data/common.env +1 -1
  6. data/lib/tebako/cli.rb +23 -8
  7. data/lib/tebako/cli_helpers.rb +3 -3
  8. data/lib/tebako/packager/pass1.rb +3 -1
  9. data/lib/tebako/packager/pass2.rb +64 -274
  10. data/{tests-2/fixtures/gems-expressir/gems-expressir.rb → lib/tebako/packager/patch_helpers.rb} +30 -5
  11. data/lib/tebako/packager/patch_literals.rb +255 -0
  12. data/lib/tebako/version.rb +1 -1
  13. data/tebako.gemspec +4 -1
  14. data/version.txt +1 -0
  15. metadata +5 -62
  16. data/tests/scripts/cross-tests.sh +0 -34
  17. data/tests/scripts/functional-tests.sh +0 -335
  18. data/tests/test-00/test.rb +0 -4
  19. data/tests/test-01/tebako-test-run.rb +0 -5
  20. data/tests/test-09/tebako-test-0.0.1.gem +0 -0
  21. data/tests/test-11/bin/tebako-test-run.rb +0 -10
  22. data/tests/test-11/lib/tebako-test.rb +0 -20
  23. data/tests/test-11/tebako-test.gemspec +0 -15
  24. data/tests/test-12/tebako-test-a.gemspec +0 -15
  25. data/tests/test-12/tebako-test-b.gemspec +0 -15
  26. data/tests/test-13/bin/tebako-test-run.rb +0 -10
  27. data/tests/test-13/lib/tebako-test.rb +0 -20
  28. data/tests/test-13/tebako-test.gemspec +0 -15
  29. data/tests/test-15/Gemfile +0 -8
  30. data/tests/test-15/Rakefile +0 -4
  31. data/tests/test-15/bin/tebako-test-run.rb +0 -10
  32. data/tests/test-15/lib/tebako/bundle/test/version.rb +0 -9
  33. data/tests/test-15/lib/tebako/bundle/test.rb +0 -29
  34. data/tests/test-15/tebako-bundle-test.gemspec +0 -30
  35. data/tests/test-16/Gemfile +0 -8
  36. data/tests/test-16/Rakefile +0 -4
  37. data/tests/test-16/bin/tebako-test-run.rb +0 -10
  38. data/tests/test-16/lib/tebako/bundle/test/version.rb +0 -9
  39. data/tests/test-16/lib/tebako/bundle/test.rb +0 -29
  40. data/tests/test-16/tebako-bundle-test.gemspec +0 -24
  41. data/tests/test-18/Gemfile +0 -5
  42. data/tests/test-18/tebako-test-run.rb +0 -12
  43. data/tests/test-19/Gemfile +0 -6
  44. data/tests/test-19/tebako-test-run.rb +0 -11
  45. data/tests-2/fixtures/gems-bundler/Gemfile +0 -4
  46. data/tests-2/fixtures/gems-bundler/gems-bundler.rb +0 -34
  47. data/tests-2/fixtures/gems-byebug/Gemfile +0 -5
  48. data/tests-2/fixtures/gems-byebug/gems-byebug.rb +0 -31
  49. data/tests-2/fixtures/gems-expressir/Gemfile +0 -7
  50. data/tests-2/fixtures/gems-libmspack/Gemfile +0 -5
  51. data/tests-2/fixtures/gems-libmspack/gems-libmspack.rb +0 -91
  52. data/tests-2/fixtures/gems-sassc/Gemfile +0 -6
  53. data/tests-2/fixtures/gems-sassc/base_style/all.scss +0 -1
  54. data/tests-2/fixtures/gems-sassc/base_style/reset.scss +0 -100
  55. data/tests-2/fixtures/gems-sassc/gems-sassc.rb +0 -129
  56. data/tests-2/fixtures/gems-seven-zip/Gemfile +0 -7
  57. data/tests-2/fixtures/gems-seven-zip/gems-seven-zip.rb +0 -53
  58. data/tests-2/fixtures/launcher-coreincl/launcher-coreincl.rb +0 -29
  59. data/tests-2/fixtures/launcher-package/launcher-package.rb +0 -29
  60. data/tests-2/fixtures/launcher-pwd/launcher-pwd.rb +0 -28
  61. data/tests-2/fixtures/launcher-stdinredir/input.txt +0 -1
  62. data/tests-2/fixtures/launcher-stdinredir/launcher-stdinredir.rb +0 -31
  63. data/tests-2/fixtures/launcher-stdoutredir/launcher-stdoutredir.rb +0 -28
  64. data/tests-2/fixtures/patches-dir/level-1/level-2/file-1.txt +0 -1
  65. data/tests-2/fixtures/patches-dir/level-1/level-2/file-2.txt +0 -1
  66. data/tests-2/fixtures/patches-dir/level-1/level-2/file-3.txt +0 -1
  67. data/tests-2/fixtures/patches-dir/patches-dir.rb +0 -154
  68. data/tests-2/fixtures/patches-io-and-file/level-1/level-2/file-1.txt +0 -1
  69. data/tests-2/fixtures/patches-io-and-file/level-1/level-2/file-2.txt +0 -2
  70. data/tests-2/fixtures/patches-io-and-file/level-1/level-2/file-3.txt +0 -1
  71. data/tests-2/fixtures/patches-io-and-file/level-1/link-3 +0 -1
  72. data/tests-2/fixtures/patches-io-and-file/patches-io-and-file.rb +0 -87
  73. data/tests-2/fixtures/patches-main/patches-main.rb +0 -6
  74. data/tests-2/tebako-test.rb +0 -312
@@ -25,321 +25,112 @@
25
25
  # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26
26
  # POSSIBILITY OF SUCH DAMAGE.
27
27
 
28
- require "open3"
28
+ require_relative "patch_literals"
29
+ require_relative "patch_helpers"
29
30
 
30
31
  # Tebako - an executable packager
31
32
  module Tebako
32
33
  module Packager
33
34
  # Ruby patching definitions (pass2)
34
- # rubocop:disable Metrics/ModuleLength
35
35
  module Pass2
36
- LINUX_GNU_LIBS = <<~SUBST
37
- # -- Start of tebako patch --
38
- MAINLIBS = -l:libtebako-fs.a -l:libdwarfs-wr.a -l:libdwarfs.a -l:libfolly.a -l:libfsst.a -l:libmetadata_thrift.a -l:libthrift_light.a -l:libxxhash.a \
39
- -l:libfmt.a -l:libdouble-conversion.a -l:libglog.a -l:libgflags.a -l:libevent.a -l:libiberty.a -l:libacl.a -l:libssl.a -l:libcrypto.a -l:liblz4.a -l:libz.a \
40
- -l:libzstd.a -l:libgdbm.a -l:libreadline.a -l:libtinfo.a -l:libffi.a -l:libncurses.a -l:libjemalloc.a -l:libunwind.a -l:libcrypt.a -l:libanl.a -l:liblzma.a \
41
- -l:libboost_system.a -l:libstdc++.a -l:librt.a -ldl -lpthread
42
- # -- End of tebako patch --
43
- SUBST
44
-
45
- LINUX_MUSL_LIBS = <<~SUBST
46
- # -- Start of tebako patch --
47
- MAINLIBS = -l:libtebako-fs.a -l:libdwarfs-wr.a -l:libdwarfs.a -l:libfolly.a -l:libfsst.a -l:libmetadata_thrift.a -l:libthrift_light.a -l:libxxhash.a \
48
- -l:libfmt.a -l:libdouble-conversion.a -l:libglog.a -l:libgflags.a -l:libevent.a -l:libiberty.a -l:libacl.a -l:libssl.a -l:libcrypto.a -l:liblz4.a -l:libz.a \
49
- -l:libzstd.a -l:libgdbm.a -l:libreadline.a -l:libffi.a -l:libncurses.a -l:libjemalloc.a -l:libunwind.a -l:libcrypt.a -l:liblzma.a \
50
- -l:libboost_system.a -l:libstdc++.a -l:librt.a -ldl -lpthread
51
- # -- End of tebako patch --
52
- SUBST
53
-
54
- MSYS_LIBS = <<~SUBST
55
- # -- Start of tebako patch --
56
- MAINLIBS = -l:libtebako-fs.a -l:libdwarfs-wr.a -l:libdwarfs.a -l:libfolly.a -l:libfsst.a -l:libmetadata_thrift.a -l:libthrift_light.a -l:libxxhash.a \
57
- -l:libfmt.a -l:libdouble-conversion.a -l:libglog.a -l:libgflags.a -l:libevent.a -l:libssl.a -l:libcrypto.a -l:liblz4.a -l:libz.a \
58
- -l:libzstd.a -l:libffi.a -l:libgdbm.a -l:libncurses.a -l:libjemalloc.a -l:libunwind.a -l:liblzma.a -l:libiberty.a \
59
- -l:libstdc++.a -l:libdl.a -lole32 -loleaut32 -luuid
60
- # -- End of tebako patch --
61
- SUBST
62
-
63
- TOOL_MKCONFIG_RB_PATCH = {
64
- " if fast[name]" => <<~SUBST
65
- # -- Start of tebako patch --
66
- v_head_comp = " CONFIG[\\"prefix\\"] \#{eq} "
67
- if v_head_comp == v[0...(v_head_comp.length)]
68
- if win32
69
- v = "\#{v[0...(v_head_comp.length)]}CONFIG[\\"RUBY_EXEC_PREFIX\\"] = '/__tebako_memfs__'
70
- "
71
- else
72
- v = "\#{v[0...(v_head_comp.length)]}'/__tebako_memfs__'
73
- "
74
- end
75
- end
76
- v_head_comp = " CONFIG[\\"RUBY_EXEC_PREFIX\\"] \#{eq} "
77
- if v_head_comp == v[0...(v_head_comp.length)]
78
- v = "\#{v[0...(v_head_comp.length)]}'/__tebako_memfs__'
79
- "
80
- end
81
- # -- End of tebako patch --
82
- if fast[name]
83
- SUBST
84
- }.freeze
85
-
86
- # Alpine-specific patches https://github.com/docker-library/ruby/blob/master/3.1/alpine3.15/Dockerfile
87
- # -- Patch no. 1 --
88
- # https://github.com/docker-library/ruby/issues/196
89
- # https://bugs.ruby-lang.org/issues/14387#note-13 (patch source)
90
- # https://bugs.ruby-lang.org/issues/14387#note-16
91
- # ("Therefore ncopa's patch looks good for me in general." -- only breaks glibc which doesn't matter here)
92
-
93
- # -- Patch no. 2 -- not needed: isnan, isinf are detected correctly by configure script
94
- # the configure script does not detect isnan/isinf as macros
95
- # export ac_cv_func_isnan=yes ac_cv_func_isinf=yes;
96
-
97
- # -- Patch no. 3 --
98
- # hack in "ENABLE_PATH_CHECK" disabling to suppress: "warning: Insecure world writable dir"
99
- # Applied in CMakeLists.txt
100
-
101
- LINUX_MUSL_THREAD_PTHREAD_PATCH = {
102
- "#if MAINSTACKADDR_AVAILABLE && !defined(get_main_stack)" => <<~SUBST
103
- /* -- Start of tebako patch -- */
104
- #if defined(__linux__) && !defined(__GLIBC__) && defined(HAVE_GETRLIMIT)
105
- #ifndef PAGE_SIZE
106
- #include <unistd.h>
107
- #define PAGE_SIZE sysconf(_SC_PAGE_SIZE)
108
- #endif
109
- static int
110
- get_main_stack(void **addr, size_t *size)
111
- {
112
- size_t start, end, limit, prevend = 0;
113
- struct rlimit r;
114
- FILE *f;
115
- char buf[PATH_MAX+80], s[8];
116
- int n;
117
- STACK_GROW_DIR_DETECTION;
118
- f = fopen("/proc/self/maps", "re");
119
- if (!f)
120
- return -1;
121
- n = 0;
122
- while (fgets(buf, sizeof buf, f)) {
123
- n = sscanf(buf, "%zx-%zx %*s %*s %*s %*s %7s", &start, &end, s);
124
- if (n >= 2) {
125
- if (n == 3 && strcmp(s, "[stack]") == 0)
126
- break;
127
- prevend = end;
128
- }
129
- n = 0;
130
- }
131
- fclose(f);
132
- if (n == 0)
133
- return -1;
134
- limit = 100 << 20; /* 100MB stack limit */
135
- if (getrlimit(RLIMIT_STACK, &r)==0 && r.rlim_cur < limit)
136
- limit = r.rlim_cur & -PAGE_SIZE;
137
- if (limit > end) limit = end;
138
- if (prevend < end - limit) prevend = end - limit;
139
- if (start > prevend) start = prevend;
140
- *addr = IS_STACK_DIR_UPPER() ? (void *)start : (void *)end;
141
- *size = end - start;
142
- return 0;
143
- }
144
- #else
145
- /* -- End of tebako patch -- */
146
- SUBST
147
- }.freeze
148
-
149
- MAIN_C_PATCH = {
150
- "int\nmain(int argc, char **argv)" =>
151
- "#include <tebako/tebako-main.h>\n\nint\nmain(int argc, char **argv)",
152
-
153
- " ruby_sysinit(&argc, &argv);" => <<~SUBST
154
- ruby_sysinit(&argc, &argv);
155
- /* -- Start of tebako patch -- */
156
- if (tebako_main(&argc, &argv) != 0) {
157
- return -1;
158
- }
159
- /* -- End of tebako patch -- */
160
- SUBST
161
- }.freeze
162
-
163
- # Compensate ruby incorrect processing of (f)getattrlist returning ENOTSUP
164
- # Note. We are not patching need_normalization function
165
- # In this function (f)getattrlist failure with ENOTSUP is processed correctly
166
-
167
- DIR_C_BASE_PATCH_ONE = <<~SUBST
168
- #if defined HAVE_GETATTRLIST && defined ATTR_DIR_ENTRYCOUNT
169
- /* tebako patch */ if (!within_tebako_memfs(path))
170
- SUBST
171
-
172
- DIR_C_BASE_PATCH_TWO = <<~SUBST
173
- #if USE_NAME_ON_FS == USE_NAME_ON_FS_REAL_BASENAME
174
- /* tebako patch */ if (!within_tebako_memfs(path)) plain = 1; else magical = 1;
175
- SUBST
176
-
177
- DIR_C_BASE_PATCH = {
178
- "#if defined HAVE_GETATTRLIST && defined ATTR_DIR_ENTRYCOUNT" => DIR_C_BASE_PATCH_ONE,
179
- "#if USE_NAME_ON_FS == USE_NAME_ON_FS_REAL_BASENAME\n plain = 1;" => DIR_C_BASE_PATCH_TWO,
180
- "if (is_case_sensitive(dirp, path) == 0)" =>
181
- "if (is_case_sensitive(dirp, path) == 0 /* tebako patch */ && !within_tebako_memfs(path))",
182
- "if ((*cur)->type == ALPHA) {" =>
183
- "if ((*cur)->type == ALPHA /* tebako patch */ && !within_tebako_memfs(buf)) {",
184
- "else if (e == EIO) {" =>
185
- "else if (e == EIO /* tebako patch */ && !within_tebako_memfs(path)) {"
186
- }.freeze
187
-
188
- COMMON_MK_PATCH = {
189
- "ext/extinit.c: $(srcdir)/template/extinit.c.tmpl $(PREP)" =>
190
- "ext/extinit.c: $(srcdir)/template/extinit.c.tmpl $(PREP) $(EXTS_MK)"
191
- }.freeze
192
-
193
- C_FILES_TO_PATCH = [
194
- ["file.c", "/* define system APIs */"],
195
- ["io.c", "/* define system APIs */"],
196
- ["util.c", "#ifndef S_ISDIR"],
197
- ["dln.c", "static const char funcname_prefix[sizeof(FUNCNAME_PREFIX) - 1] = FUNCNAME_PREFIX;"]
198
- ].freeze
199
-
200
- TEMPLATE_MAKEFILE_IN_BASE_PATTERN_TWO_PRE_3_1 =
201
- "\t\t$(Q) $(PURIFY) $(CC) $(LDFLAGS) $(XLDFLAGS) $(MAINOBJ) " \
202
- "$(EXTOBJS) $(LIBRUBYARG) $(MAINLIBS) $(LIBS) $(EXTLIBS) $(OUTFLAG)$@"
203
-
204
- TEMPLATE_MAKEFILE_IN_BASE_PATCH_TWO_PRE_3_1 =
205
- "# -- Start of tebako patch --\n" \
206
- "\t\t$(Q) $(PURIFY) $(CC) $(LDFLAGS) $(XLDFLAGS) $(MAINOBJ) " \
207
- "$(EXTOBJS) $(LIBRUBYARG_STATIC) $(LIBS) $(OUTFLAG)$@\n" \
208
- "# -- End of tebako patch --"
209
-
210
- TEMPLATE_MAKEFILE_IN_BASE_PATTERN_TWO =
211
- "\t\t$(Q) $(PURIFY) $(CC) $(EXE_LDFLAGS) $(XLDFLAGS) $(MAINOBJ) " \
212
- "$(EXTOBJS) $(LIBRUBYARG) $(MAINLIBS) $(LIBS) $(EXTLIBS) $(OUTFLAG)$@"
213
-
214
- TEMPLATE_MAKEFILE_IN_BASE_PATCH_TWO =
215
- "# -- Start of tebako patch --\n" \
216
- "\t\t$(Q) $(PURIFY) $(CC) $(EXE_LDFLAGS) $(XLDFLAGS) $(MAINOBJ) " \
217
- "$(EXTOBJS) $(LIBRUBYARG_STATIC) $(LIBS) $(OUTFLAG)$@\n" \
218
- "# -- End of tebako patch --"
219
-
220
- C_FILE_SUBST = <<~SUBST
221
- /* -- Start of tebako patch -- */
222
- #ifndef NO_TEBAKO_INCLUDES
223
- #include <tebako/tebako-config.h>
224
- #include <tebako/tebako-defines.h>
225
- #include <tebako/tebako-io-rb-w32.h>
226
- #include <tebako/tebako-io.h>
227
- #endif
228
- /* -- End of tebako patch -- */
229
- SUBST
230
-
231
- MSYS_PATCHES = {
232
- "ruby.c" => {
233
- "#define RUBY_RELATIVE(path, len) rb_str_buf_cat(BASEPATH(), (path), (len))" =>
234
- "#define RUBY_RELATIVE(path, len) rubylib_path_new((path), (len)) /* tebako patched */",
235
- "#define PREFIX_PATH() sopath" =>
236
- "#define PREFIX_PATH() rubylib_path_new(tebako_mount_point(), " \
237
- "strlen(tebako_mount_point())) /* tebako patched */",
238
- '#include "mjit.h"' =>
239
- "#include \"mjit.h\"\n" \
240
- "/* -- Start of tebako patch -- */\n" \
241
- "#include <tebako/tebako-main.h>\n" \
242
- "/* -- End of tebako patch -- */"
243
- },
244
- "/win32/win32.c" => {
245
- "#undef __STRICT_ANSI__" =>
246
- "#undef __STRICT_ANSI__\n" \
247
- "/* -- Start of tebako patch -- */\n" \
248
- "#define NO_TEBAKO_INCLUDES\n" \
249
- "/* -- End of tebako patch -- */"
250
- },
251
- "win32/dir.h" => {
252
- "#define opendir(s) rb_w32_opendir((s))" => "#{C_FILE_SUBST}\n#define opendir(s) rb_w32_opendir((s))"
253
- },
254
- "file.c" => {
255
- " wpath = mbstr_to_wstr(CP_UTF8, path, -1, &len);" =>
256
- "/* -- Start of tebako patch -- */\n" \
257
- "if (tebako_file_load_ok(path)) return 1;\n" \
258
- "/* -- End of tebako patch -- */\n" \
259
- "wpath = mbstr_to_wstr(CP_UTF8, path, -1, &len);",
260
- '#include "win32/file.h' =>
261
- "#include \"win32/file.h\"\n" \
262
- "/* -- Start of tebako patch -- */\n" \
263
- "#include <tebako/tebako-main.h>\n" \
264
- "/* -- End of tebako patch -- */"
265
- }
266
-
267
- }.freeze
268
-
269
- # rubocop:disable Style/WordArray
270
- DARWIN_BREW_LIBS = [
271
- ["openssl@1.1", "ssl"], ["openssl@1.1", "crypto"],
272
- ["zlib", "z"], ["gdbm", "gdbm"],
273
- ["readline", "readline"], ["libffi", "ffi"],
274
- ["ncurses", "ncurses"], ["fmt", "fmt"],
275
- ["lz4", "lz4"], ["xz", "lzma"],
276
- ["double-conversion", "double-conversion"]
277
- ].freeze
278
-
279
- DARWIN_DEP_LIBS = ["glog", "gflags"].freeze
280
- # rubocop:enable Style/WordArray
281
-
282
36
  class << self
283
- # rubocop:disable Metrics/MethodLength
284
- def get_patch_map(ostype, deps_lib_dir, ruby_ver)
37
+ def get_dir_c_patch(ostype)
285
38
  dir_c_patch = patch_c_file(ostype =~ /msys/ ? "/* define system APIs */" : "#ifdef HAVE_GETATTRLIST")
286
39
  dir_c_patch.merge!(DIR_C_BASE_PATCH)
40
+ end
287
41
 
42
+ def get_patch_map(ostype, deps_lib_dir, ruby_ver)
288
43
  patch_map = {
289
44
  "template/Makefile.in" => template_makefile_in_patch(ostype, deps_lib_dir, ruby_ver),
290
45
  "main.c" => MAIN_C_PATCH,
291
46
  "tool/mkconfig.rb" => TOOL_MKCONFIG_RB_PATCH,
292
- "dir.c" => dir_c_patch
47
+ "dir.c" => get_dir_c_patch(ostype)
293
48
  }
294
49
 
295
50
  C_FILES_TO_PATCH.each { |patch| patch_map.store(patch[0], patch_c_file(patch[1])) }
296
51
  patch_map.store("thread_pthread.c", LINUX_MUSL_THREAD_PTHREAD_PATCH) if ostype =~ /linux-musl/
297
- patch_map.merge!(MSYS_PATCHES) if ostype =~ /msys/
298
-
299
- patch_map.store("common.mk", COMMON_MK_PATCH) if ruby_ver[0] == "3"
52
+ patch_map.store("common.mk", COMMON_MK_PATCH) if PatchHelpers.ruby3x?(ruby_ver)
300
53
 
301
- patch_map
54
+ ostype =~ /msys/ ? patch_map.merge!(MSYS_PATCHES) : patch_map
302
55
  end
303
- # rubocop:enable Metrics/MethodLength
304
56
 
305
57
  private
306
58
 
307
- def get_prefix(package)
308
- out, st = Open3.capture2("brew --prefix #{package}")
309
- raise Tebako::Error, "brew --prefix #{package} failed with code #{st.exitstatus}" unless st.exitstatus.zero?
59
+ include Tebako::Packager::PatchLiterals
310
60
 
311
- out
61
+ def process_brew_libs!(libs, brew_libs)
62
+ brew_libs.each { |lib| libs << "#{PatchHelpers.get_prefix(lib[0]).chop}/lib/lib#{lib[1]}.a " }
312
63
  end
313
64
 
314
- def darwin_libs(deps_lib_dir)
65
+ def darwin_libs(deps_lib_dir, ruby_ver)
315
66
  libs = String.new
316
- DARWIN_BREW_LIBS.each { |lib| libs << get_prefix(lib[0]).chop << "/lib/lib#{lib[1]}.a " }
317
- DARWIN_DEP_LIBS.each { |lib| libs << deps_lib_dir << "/lib#{lib}.a " }
67
+ process_brew_libs!(libs, DARWIN_BREW_LIBS)
68
+ process_brew_libs!(libs, DARWIN_BREW_LIBS_32) if PatchHelpers.ruby32?(ruby_ver)
69
+ DARWIN_DEP_LIBS.each { |lib| libs << "#{deps_lib_dir}/lib#{lib}.a " }
318
70
  <<~SUBST
319
- # -- Start of tebako patch --
320
- MAINLIBS = -ltebako-fs -ldwarfs-wr -ldwarfs -lfolly -lfsst -lmetadata_thrift -lthrift_light -lxxhash \
71
+ -ltebako-fs -ldwarfs-wr -ldwarfs -lfolly -lfsst -lmetadata_thrift -lthrift_light -lxxhash \
321
72
  -lzstd #{libs} -ljemalloc -lc++
322
- # -- End of tebako patch --
73
+ SUBST
74
+ end
75
+
76
+ def yaml_reference(ruby_ver)
77
+ PatchHelpers.ruby32?(ruby_ver) ? "-l:libyaml.a" : ""
78
+ end
79
+
80
+ def linux_gnu_libs(ruby_ver)
81
+ <<~SUBST
82
+ -l:libtebako-fs.a -l:libdwarfs-wr.a -l:libdwarfs.a -l:libfolly.a -l:libfsst.a -l:libmetadata_thrift.a -l:libthrift_light.a -l:libxxhash.a \
83
+ -l:libfmt.a -l:libdouble-conversion.a -l:libglog.a -l:libgflags.a -l:libevent.a -l:libiberty.a -l:libacl.a -l:libssl.a -l:libcrypto.a -l:liblz4.a -l:libz.a \
84
+ -l:libzstd.a -l:libgdbm.a -l:libreadline.a -l:libtinfo.a -l:libffi.a -l:libncurses.a -l:libjemalloc.a -l:libunwind.a -l:libcrypt.a -l:libanl.a -l:liblzma.a \
85
+ #{yaml_reference(ruby_ver)} -l:libboost_system.a -l:libstdc++.a -l:librt.a -ldl -lpthread
86
+ SUBST
87
+ end
88
+
89
+ def linux_musl_libs(ruby_ver)
90
+ <<~SUBST
91
+ -l:libtebako-fs.a -l:libdwarfs-wr.a -l:libdwarfs.a -l:libfolly.a -l:libfsst.a -l:libmetadata_thrift.a -l:libthrift_light.a -l:libxxhash.a \
92
+ -l:libfmt.a -l:libdouble-conversion.a -l:libglog.a -l:libgflags.a -l:libevent.a -l:libiberty.a -l:libacl.a -l:libssl.a -l:libcrypto.a -l:liblz4.a -l:libz.a \
93
+ -l:libzstd.a -l:libgdbm.a -l:libreadline.a -l:libffi.a -l:libncurses.a -l:libjemalloc.a -l:libunwind.a -l:libcrypt.a -l:liblzma.a \
94
+ #{yaml_reference(ruby_ver)} -l:libboost_system.a -l:libstdc++.a -l:librt.a -ldl -lpthread
95
+ SUBST
96
+ end
97
+
98
+ def msys_libs(ruby_ver)
99
+ <<~SUBST
100
+ -l:libtebako-fs.a -l:libdwarfs-wr.a -l:libdwarfs.a -l:libfolly.a -l:libfsst.a -l:libmetadata_thrift.a -l:libthrift_light.a -l:libxxhash.a \
101
+ -l:libfmt.a -l:libdouble-conversion.a -l:libglog.a -l:libgflags.a -l:libevent.a -l:libssl.a -l:libcrypto.a -l:liblz4.a -l:libz.a \
102
+ -l:libzstd.a -l:libffi.a -l:libgdbm.a -l:libncurses.a -l:libjemalloc.a -l:libunwind.a -l:liblzma.a -l:libiberty.a \
103
+ #{yaml_reference(ruby_ver)} -l:libstdc++.a -l:libdl.a -lole32 -loleaut32 -luuid
323
104
  SUBST
324
105
  end
325
106
 
326
107
  # rubocop:disable Metrics/MethodLength
327
- def mlibs(ostype, deps_lib_dir)
108
+ def mlibs(ostype, deps_lib_dir, ruby_ver)
328
109
  case ostype
329
110
  when /linux-gnu/
330
- LINUX_GNU_LIBS
111
+ linux_gnu_libs(ruby_ver)
331
112
  when /linux-musl/
332
- LINUX_MUSL_LIBS
113
+ linux_musl_libs(ruby_ver)
333
114
  when /darwin/
334
- darwin_libs(deps_lib_dir)
115
+ darwin_libs(deps_lib_dir, ruby_ver)
335
116
  when /msys/
336
- MSYS_LIBS
117
+ msys_libs(ruby_ver)
337
118
  else
338
119
  raise Tebako::Error, "Unknown ostype #{ostype}"
339
120
  end
340
121
  end
341
122
  # rubocop:enable Metrics/MethodLength
342
123
 
124
+ def mlibs_subst(ostype, deps_lib_dir, ruby_ver)
125
+ yjit_libs = PatchHelpers.ruby32?(ruby_ver) ? "$(YJIT_LIBS) " : ""
126
+ {
127
+ "MAINLIBS = #{yjit_libs}@MAINLIBS@" =>
128
+ "# -- Start of tebako patch -- \n" \
129
+ "MAINLIBS = #{yjit_libs}#{mlibs(ostype, deps_lib_dir, ruby_ver)}" \
130
+ "# -- End of tebako patch -- \n"
131
+ }
132
+ end
133
+
343
134
  def patch_c_file(pattern)
344
135
  {
345
136
  pattern => "#{C_FILE_SUBST}\n#{pattern}"
@@ -348,18 +139,18 @@ module Tebako
348
139
 
349
140
  def template_makefile_in_patch(ostype, deps_lib_dir, ruby_ver)
350
141
  base_patch = {
351
- "MAINLIBS = @MAINLIBS@" => mlibs(ostype, deps_lib_dir),
352
142
  "LIBS = @LIBS@ $(EXTLIBS)" => <<~SUBST
353
143
  # -- Start of tebako patch --
354
144
  LIBS = $(MAINLIBS) @LIBS@
355
145
  # -- End of tebako patch --
356
146
  SUBST
357
147
  }
148
+ base_patch.merge!(mlibs_subst(ostype, deps_lib_dir, ruby_ver))
358
149
  base_patch.merge!(template_makefile_in_patch_two(ruby_ver))
359
150
  end
360
151
 
361
152
  def template_makefile_in_patch_two(ruby_ver)
362
- if ruby_ver[0] == "3" && ruby_ver[2] != "0"
153
+ if PatchHelpers.ruby31?(ruby_ver)
363
154
  { TEMPLATE_MAKEFILE_IN_BASE_PATTERN_TWO => TEMPLATE_MAKEFILE_IN_BASE_PATCH_TWO }
364
155
  else
365
156
  { TEMPLATE_MAKEFILE_IN_BASE_PATTERN_TWO_PRE_3_1 => TEMPLATE_MAKEFILE_IN_BASE_PATCH_TWO_PRE_3_1 }
@@ -368,5 +159,4 @@ module Tebako
368
159
  end
369
160
  end
370
161
  end
371
- # rubocop:enable Metrics/ModuleLength
372
162
  end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # Copyright (c) 2022-2023, [Ribose Inc](https://www.ribose.com).
3
+ # Copyright (c) 2023 [Ribose Inc](https://www.ribose.com).
4
4
  # All rights reserved.
5
5
  # This file is a part of tebako
6
6
  #
@@ -25,9 +25,34 @@
25
25
  # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26
26
  # POSSIBILITY OF SUCH DAMAGE.
27
27
 
28
- # This test is inspired packed-mn
29
- # https://github.com/metanorma/packed-mn
28
+ require "open3"
29
+ require_relative "patch_literals"
30
30
 
31
- require "expressir/express/parser"
31
+ # Tebako - an executable packager
32
+ module Tebako
33
+ module Packager
34
+ # Ruby patching helpers (pass2)
35
+ module PatchHelpers
36
+ class << self
37
+ def get_prefix(package)
38
+ out, st = Open3.capture2("brew --prefix #{package}")
39
+ raise Tebako::Error, "brew --prefix #{package} failed with code #{st.exitstatus}" unless st.exitstatus.zero?
32
40
 
33
- puts "Hello! Expressir gem welcomes you to the magic world of ruby gems."
41
+ out
42
+ end
43
+
44
+ def ruby3x?(ruby_ver)
45
+ ruby_ver[0] == "3"
46
+ end
47
+
48
+ def ruby31?(ruby_ver)
49
+ ruby3x?(ruby_ver) && ruby_ver[2].to_i >= 1
50
+ end
51
+
52
+ def ruby32?(ruby_ver)
53
+ ruby3x?(ruby_ver) && ruby_ver[2].to_i >= 2
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end