tebako 0.6.0 → 0.6.3

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b3b1bac324a40524fe22b2c7026dcad437f62802fcaf57f37b4ae64eda383eb3
4
- data.tar.gz: 1eec9bed248d7fc6d3f4c6d8c11e1ca7d7f9f1a10077b87cde00f61c2978cd33
3
+ metadata.gz: 34a8463d460a7d42e197e9237b49175944f3119aed26735246c65cd915be82cf
4
+ data.tar.gz: f699b42afc5529fb1d3a0651d4e2462eed3630d3e12369ef7feea09cb7296f6d
5
5
  SHA512:
6
- metadata.gz: da56a60c53abc22be03dbd4be569f547c0bb5f698883e3f3960c2ba8a43a2ef06c66df739c9dfd7bda55c129fb8f6e166c02372baad4cee1ce1af142709c0ad0
7
- data.tar.gz: 902a593412bb255369c7dd69b98c178066cfe5209d7a3836bfe3d2b45382bcd9c29ba4119e0f8128b3b960d545af0f9881de9786e374e4a231e46d0c42971543
6
+ metadata.gz: '0282fce5e343e77c355e86528ddc5f640e6331f354d834f166175351c13e13476d888f78a0c6a221f857be7f071b9240f730095edd876d2674c47515fcb62581'
7
+ data.tar.gz: e0c9755655e63b19248a9d61ee7933bf8c6891bb1aeb23597e9a65d6015d26f7e6c807006ea3729dbaa0ef41c1a2a12116ddddcc123f8d76cf4d412a25726df1
data/CMakeLists.txt CHANGED
@@ -214,7 +214,7 @@ if(DWARFS_PRELOAD)
214
214
  list(GET LIBDWARFS_WR_VER_COMPONENTS 2 LIBDWARFS_WR_VER_PATCH)
215
215
  set (LIBDWARFS_WR_VER_M ${LIBDWARFS_WR_VER_MAJOR}.${LIBDWARFS_WR_VER_MINOR}.${LIBDWARFS_WR_VER_PATCH})
216
216
  else(DWARFS_PRELOAD)
217
- def_ext_prj_g(DWARFS_WR "v0.5.1")
217
+ def_ext_prj_g(DWARFS_WR "v0.5.2")
218
218
  endif(DWARFS_PRELOAD)
219
219
 
220
220
  set(LIBYAML_RUBY_OPTION "")
@@ -560,9 +560,9 @@ else (${SETUP_MODE})
560
560
  COMMAND ${GNU_BASH} -c "rm -f ${DATA_SRC_DIR}/**/*.a"
561
561
  COMMAND ${GNU_BASH} -c "rm -f ${DATA_SRC_DIR}/**/*.o"
562
562
  COMMAND ${GNU_BASH} -c "chmod +x ${DEPS_BIN_DIR}/mkdwarfs${EXE_SUFFIX}"
563
- # No progress below is crtitical since in reporting mode mkdwarfs tries to work directly with terminal
564
- # and it creates critical issues for stderr redirects (&2 > 1) used by Ninja and our test srcipts
565
- # It may be fixable bit is very difficult to reproduce in testi environment
563
+ # No progress below is critical since in reporting mode mkdwarfs tries to work directly with terminal
564
+ # and it creates issues for stderr redirects (&2 > 1) used by Ninja and our test srcipts
565
+ # It may be fixable bit is very difficult to reproduce in test environment
566
566
  COMMAND ${DEPS_BIN_DIR}/mkdwarfs -o ${DATA_BIN_FILE} -i ${DATA_SRC_DIR} --no-progress
567
567
  COMMAND ${CMAKE_COMMAND} -E touch ${DEPS_SRC_DIR}/tebako/tebako-fs.cpp
568
568
  DEPENDS setup source_filesystem
data/README.adoc CHANGED
@@ -5,7 +5,6 @@ image:https://github.com/tamatebako/tebako/actions/workflows/alpine.yml/badge.sv
5
5
  image:https://github.com/tamatebako/tebako/actions/workflows/macos.yml/badge.svg["MacOS amd64", link="https://github.com/tamatebako/tebako/actions/workflows/macos.yml"]
6
6
  image:https://github.com/tamatebako/tebako/actions/workflows/windows-msys.yml/badge.svg["Windows msys", link="https://github.com/tamatebako/tebako/actions/workflows/windows-msys.yml"]
7
7
 
8
- image:https://api.cirrus-ci.com/github/tamatebako/tebako.svg?branch=main&task=macos-arm64["MacOS arm64", link="https://cirrus-ci.com/github/tamatebako/tebako"]
9
8
  image:https://api.cirrus-ci.com/github/tamatebako/tebako.svg?branch=main&task=ubuntu-aarch64["Ubuntu aarch64", link="https://cirrus-ci.com/github/tamatebako/tebako"]
10
9
 
11
10
  image:https://github.com/tamatebako/tebako/actions/workflows/lint.yml/badge.svg["lint", link="https://github.com/tamatebako/tebako/actions/workflows/lint.yml"]
@@ -36,7 +35,7 @@ In the future:
36
35
  The Tebako packager is tested on the following platforms:
37
36
 
38
37
  * Linux: Ubuntu 20.04; Alpine 3.17
39
- * MacOS: macOS 12 (Monterey), 13 (Ventura)
38
+ * MacOS: macOS 12 (Monterey), 13 (Ventura), 14 (Sonoma)
40
39
  * Windows: 2019, 2022 (using MinGW ucrt64 toolchain)
41
40
 
42
41
  Please note that Windows support is in pre-release and is a subject of further testing and optimization
@@ -48,7 +47,7 @@ The Tebako packager supports the following versions of Ruby for packaging:
48
47
  * 2.7.8 (Linux, MacOS)
49
48
  * 3.0.6 (Linux, MacOS)
50
49
  * 3.1.4 (Linux, MacOS, Windows)
51
- * 3.2.3 (Linux, MacOS)
50
+ * 3.2.3 (Linux, MacOS, Windows)
52
51
 
53
52
  Support of specific version including minor release requires some effort, sometimes extensive
54
53
  but our goal is to be able to package all maintained Ruby releases.
@@ -129,31 +128,31 @@ brew install gnu-sed bash pkg-config bison flex binutils libffi gdbm zlib ncurse
129
128
  double-conversion boost jemalloc fmt glog libevent libsodium lz4 xz libyaml openssl@3
130
129
  ----
131
130
 
132
- == Installation
131
+ === Windows (2019, 2022)
133
132
 
134
- === General
133
+ The simplest approach is to use Ruby development environment provided by RubyInstaller, for example Ruby+Devkit 3.1.4-1.
135
134
 
136
- Tebako is distributed as a Ruby gem
135
+ Once it is installed use the following commands:
137
136
 
138
137
  [source,sh]
139
138
  ----
140
- gem install tebako
139
+ ridk enable ucrt64
140
+ pacman -S git tar bison flex toolchain make cmake
141
+ boost diffutils libevent double-conversion
142
+ fmt glog dlfcn gtest autotools ncurses libyaml
141
143
  ----
142
144
 
143
- === Windows (2019, 2022)
145
+ == Installation
144
146
 
145
- The simplest approach is to use Ruby development environment provided by RubyInstaller, for example Ruby+Devkit 3.1.4-1
146
- Once it is is installed use the follwoing commands
147
+ === General
148
+
149
+ Tebako is distributed as a Ruby gem
147
150
 
148
151
  [source,sh]
149
152
  ----
150
- ridk enable ucrt64
151
- pacman -S git tar bison flex toolchain make cmake
152
- boost diffutils libevent double-conversion
153
- fmt glog dlfcn gtest autotools ncurses libyaml
153
+ gem install tebako
154
154
  ----
155
155
 
156
-
157
156
  === Quick setup on Ubuntu 20.04 on Docker
158
157
 
159
158
  Launch a container on the target platform:
data/common.env CHANGED
@@ -1,5 +1,5 @@
1
1
  BUILD_TYPE=Release
2
2
  DEPS=deps
3
3
  INCBIN_TAG=348e36b
4
- DWARFS_WR_TAG=v0.5.1
4
+ DWARFS_WR_TAG=v0.5.2
5
5
  RUBY_VER=3.1.4
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  *
3
- * Copyright (c) 2021, [Ribose Inc](https://www.ribose.com).
3
+ * Copyright (c) 2021-2024, [Ribose Inc](https://www.ribose.com).
4
4
  * All rights reserved.
5
5
  * This file is a part of tebako
6
6
  *
@@ -32,6 +32,7 @@ extern "C" {
32
32
  #endif
33
33
  int tebako_main(int* argc, char*** argv);
34
34
  const char* tebako_mount_point(void);
35
+ int tebako_is_running_miniruby(void);
35
36
  #ifdef RB_W32
36
37
  int tebako_file_load_ok(const char *path);
37
38
  #endif
@@ -57,12 +57,12 @@ module Tebako
57
57
  end
58
58
 
59
59
  def version_check_msys(version)
60
- return unless version != DEFAULT_RUBY_VERSION && RbConfig::CONFIG["host_os"] =~ /msys|mingw|cygwin/
61
-
62
- raise Tebako::Error.new(
63
- "Windows packaging is compatible with Ruby #{DEFAULT_RUBY_VERSION} only, version #{version} is not supported",
64
- 252
65
- )
60
+ if Gem::Version.new(version) < Gem::Version.new(DEFAULT_RUBY_VERSION) && RUBY_PLATFORM =~ /msys|mingw|cygwin/
61
+ raise Tebako::Error.new(
62
+ "Windows packaging works for Ruby #{DEFAULT_RUBY_VERSION} or above, version #{version} is not supported",
63
+ 252
64
+ )
65
+ end
66
66
  end
67
67
 
68
68
  def extend_ruby_version
@@ -27,6 +27,7 @@
27
27
 
28
28
  require_relative "patch_literals"
29
29
  require_relative "patch_helpers"
30
+ require_relative "patch_buildsystem"
30
31
 
31
32
  # Tebako - an executable packager
32
33
  module Tebako
@@ -159,6 +160,7 @@ module Tebako
159
160
  private
160
161
 
161
162
  include Tebako::Packager::PatchLiterals
163
+ include Tebako::Packager::PatchBuildsystem
162
164
 
163
165
  def get_gnumakefile_in_patch_p1(ruby_ver) # rubocop:disable Metrics/MethodLength
164
166
  objext = PatchHelpers.ruby32?(ruby_ver) ? "$(OBJEXT)" : "@OBJEXT@"
@@ -28,6 +28,7 @@
28
28
  require_relative "patch_literals"
29
29
  require_relative "patch_libraries"
30
30
  require_relative "patch_helpers"
31
+ require_relative "patch_buildsystem"
31
32
 
32
33
  # Tebako - an executable packager
33
34
  module Tebako
@@ -40,7 +41,7 @@ module Tebako
40
41
 
41
42
  patch_map.store("thread_pthread.c", LINUX_MUSL_THREAD_PTHREAD_PATCH) if ostype =~ /linux-musl/
42
43
 
43
- if ostype =~ /msys/
44
+ if PatchHelpers.msys?(ostype)
44
45
  patch_map.merge!(get_msys_patches(ruby_ver))
45
46
  elsif PatchHelpers.ruby3x?(ruby_ver)
46
47
  # [TODO] Do we really need it for platforms other then Windows ??
@@ -52,47 +53,51 @@ module Tebako
52
53
 
53
54
  private
54
55
 
56
+ include Tebako::Packager::PatchBuildsystem
55
57
  include Tebako::Packager::PatchLiterals
56
58
 
57
59
  def get_dir_c_patch(ostype)
58
- dir_c_patch = patch_c_file(ostype =~ /msys/ ? "/* define system APIs */" : "#ifdef HAVE_GETATTRLIST")
60
+ pattern = PatchHelpers.msys?(ostype) ? "/* define system APIs */" : "#ifdef HAVE_GETATTRLIST"
61
+ dir_c_patch = PatchHelpers.patch_c_file(pattern)
59
62
  dir_c_patch.merge!(DIR_C_BASE_PATCH)
63
+ dir_c_patch
60
64
  end
61
65
 
62
- def get_dln_c_patch(ostype)
66
+ def get_dln_c_patch(ostype, ruby_ver)
63
67
  # Not using substitutions of dlxxx functions on Windows
64
68
  dln_c_patch = {
65
69
  "static const char funcname_prefix[sizeof(FUNCNAME_PREFIX) - 1] = FUNCNAME_PREFIX;" =>
66
- "#{ostype =~ /msys/ ? C_FILE_SUBST_LESS : C_FILE_SUBST}\n" \
70
+ "#{PatchHelpers.msys?(ostype) ? C_FILE_SUBST_LESS : C_FILE_SUBST}\n" \
67
71
  "static const char funcname_prefix[sizeof(FUNCNAME_PREFIX) - 1] = FUNCNAME_PREFIX;\n"
68
72
  }
69
- dln_c_patch.merge!(DLN_C_MSYS_PATCH) if ostype =~ /msys/
73
+
74
+ if PatchHelpers.msys?(ostype)
75
+ patch = PatchHelpers.ruby32?(ruby_ver) ? DLN_C_MSYS_PATCH : DLN_C_MSYS_PATCH_PRE32
76
+ dln_c_patch.merge!(patch)
77
+ end
78
+
70
79
  dln_c_patch
71
80
  end
72
81
 
73
- def get_io_c_patch(ostype)
74
- io_c_patch = patch_c_file("/* define system APIs */")
75
- io_c_patch.merge!(IO_C_MSYS_PATCH) if ostype =~ /msys/
82
+ def get_io_c_msys_patch(ruby_ver)
83
+ io_c_msys_patch = PatchHelpers.ruby32?(ruby_ver) ? IO_C_MSYS_PATCH : IO_C_MSYS_PATCH_PRE_32
84
+ io_c_msys_patch.merge(IO_C_MSYS_BASE_PATCH)
85
+ end
86
+
87
+ def get_io_c_patch(ostype, ruby_ver)
88
+ io_c_patch = PatchHelpers.patch_c_file("/* define system APIs */")
89
+ io_c_patch.merge!(get_io_c_msys_patch(ruby_ver)) if PatchHelpers.msys?(ostype)
76
90
  io_c_patch
77
91
  end
78
92
 
79
- def get_gnumakefile_in_patch_p2(ruby_ver) # rubocop:disable Metrics/MethodLength
80
- # For pass 2 we 'kill ruby.exp' regeneration
81
- objext = PatchHelpers.ruby32?(ruby_ver) ? "$(OBJEXT)" : "@OBJEXT@"
93
+ def get_msys_mkconfig_rb_patches(ruby_ver)
82
94
  {
83
- "$(WPROGRAM): $(RUBYW_INSTALL_NAME).res.#{objext}" =>
84
- "$(WPROGRAM): $(RUBYW_INSTALL_NAME).res.#{objext} $(WINMAINOBJ) # tebako patched",
85
-
86
- "$(MAINOBJ) $(EXTOBJS) $(LIBRUBYARG) $(LIBS) -o $@" =>
87
- "$(WINMAINOBJ) $(EXTOBJS) $(LIBRUBYARG) $(MAINLIBS) -o $@ # tebako patched",
88
-
89
- "RUBYDEF = $(DLL_BASE_NAME).def" => GNUMAKEFILE_IN_WINMAIN_SUBST,
90
-
91
- "$(RUBY_EXP): $(LIBRUBY_A)" => "dummy.exp: $(LIBRUBY_A) # tebako patched",
92
-
93
- "$(PROGRAM): $(RUBY_INSTALL_NAME).res.#{objext}" =>
94
- "$(PROGRAM): $(RUBY_INSTALL_NAME).res.#{objext} $(LIBRUBY_A) # tebako patched\n" \
95
- "$(LIBRUBY_A): $(LIBRUBY_A_OBJS) $(INITOBJS) # tebako patched\n"
95
+ " if fast[name]" => TOOLS_MKCONFIG_RB_SUBST,
96
+ "when /RUBYGEMS/; next" =>
97
+ "when /RUBYGEMS/; next\n\n" \
98
+ "# Start of tebako patch\n" \
99
+ "when /MAINLIBS/; val = #{PatchLibraries.msys_base_libs(ruby_ver)}\n" \
100
+ "# End of tebako patch"
96
101
  }
97
102
  end
98
103
 
@@ -106,13 +111,15 @@ module Tebako
106
111
  end
107
112
 
108
113
  def get_patch_map_base(ostype, deps_lib_dir, ruby_ver)
114
+ mcrb_subst = PatchHelpers.msys?(ostype) ? get_msys_mkconfig_rb_patches(ruby_ver) : TOOL_MKCONFIG_RB_PATCH
109
115
  {
110
116
  "template/Makefile.in" => template_makefile_in_patch(ostype, deps_lib_dir, ruby_ver),
111
- "tool/mkconfig.rb" => ostype =~ /msys/ ? TOOL_MKCONFIG_RB_PATCH_MSYS : TOOL_MKCONFIG_RB_PATCH,
117
+ "tool/mkconfig.rb" => mcrb_subst,
112
118
  "gem_prelude.rb" => GEM_PRELUDE_RB_PATCH,
113
- "dir.c" => get_dir_c_patch(ostype), "dln.c" => get_dln_c_patch(ostype),
114
- "io.c" => get_io_c_patch(ostype), "file.c" => patch_c_file("/* define system APIs */"),
115
- "main.c" => MAIN_C_PATCH, "util.c" => patch_c_file("#ifndef S_ISDIR")
119
+ "dir.c" => get_dir_c_patch(ostype), "dln.c" => get_dln_c_patch(ostype, ruby_ver),
120
+ "io.c" => get_io_c_patch(ostype, ruby_ver), "main.c" => MAIN_C_PATCH,
121
+ "file.c" => PatchHelpers.patch_c_file("/* define system APIs */"),
122
+ "util.c" => PatchHelpers.patch_c_file("#ifndef S_ISDIR")
116
123
  }
117
124
  end
118
125
 
@@ -126,25 +133,9 @@ module Tebako
126
133
  }
127
134
  end
128
135
 
129
- def patch_c_file(pattern)
130
- {
131
- pattern => "#{C_FILE_SUBST}\n#{pattern}"
132
- }
133
- end
134
-
135
136
  def template_makefile_in_patch(ostype, deps_lib_dir, ruby_ver)
136
137
  template_makefile_in_patch_two(ostype, ruby_ver).merge(mlibs_subst(ostype, deps_lib_dir, ruby_ver))
137
138
  end
138
-
139
- def template_makefile_in_patch_two(ostype, ruby_ver)
140
- if ostype =~ /msys/
141
- { TEMPLATE_MAKEFILE_IN_BASE_PATTERN => TEMPLATE_MAKEFILE_IN_BASE_PATCH_MSYS }
142
- elsif PatchHelpers.ruby31?(ruby_ver)
143
- { TEMPLATE_MAKEFILE_IN_BASE_PATTERN => TEMPLATE_MAKEFILE_IN_BASE_PATCH }
144
- else
145
- { TEMPLATE_MAKEFILE_IN_BASE_PATTERN_PRE_3_1 => TEMPLATE_MAKEFILE_IN_BASE_PATCH_PRE_3_1 }
146
- end
147
- end
148
139
  end
149
140
  end
150
141
  end
@@ -0,0 +1,125 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Copyright (c) 2023-2024 [Ribose Inc](https://www.ribose.com).
4
+ # All rights reserved.
5
+ # This file is a part of tebako
6
+ #
7
+ # Redistribution and use in source and binary forms, with or without
8
+ # modification, are permitted provided that the following conditions
9
+ # are met:
10
+ # 1. Redistributions of source code must retain the above copyright
11
+ # notice, this list of conditions and the following disclaimer.
12
+ # 2. Redistributions in binary form must reproduce the above copyright
13
+ # notice, this list of conditions and the following disclaimer in the
14
+ # documentation and/or other materials provided with the distribution.
15
+ #
16
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17
+ # ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
18
+ # TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19
+ # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS
20
+ # BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21
+ # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22
+ # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23
+ # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24
+ # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25
+ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26
+ # POSSIBILITY OF SUCH DAMAGE.
27
+
28
+ require_relative "patch_helpers"
29
+
30
+ # Tebako - an executable packager
31
+ module Tebako
32
+ module Packager
33
+ # Ruby buildsystem patches (pass2)
34
+ module PatchBuildsystem
35
+ # This patch forces rebuild of extinit.c when exts.mk changes
36
+ # exts.mk changes when we rebuild extensions to make them statically linked
37
+ # [TODO] it is possible that we can build extensions statically on pass1 and it will
38
+ # eliminate the need for this patch
39
+ COMMON_MK_PATCH = {
40
+ "ext/extinit.c: $(srcdir)/template/extinit.c.tmpl $(PREP)" =>
41
+ "ext/extinit.c: $(srcdir)/template/extinit.c.tmpl $(PREP) $(EXTS_MK)"
42
+ }.freeze
43
+
44
+ # This patch changes libraries that are used for Ruby linking
45
+ # MAINLIBS is patched elsewhere (not with literal but dynamically)
46
+ # to haold the list of sattic libraries and related options
47
+ # Also we have to put LIBRUBYARG_STATIC instead of LIBRUBYARG to link with static libruby,
48
+ # configure's --disable-shared option does not do it
49
+ # Several variants depending on os and version
50
+ TEMPLATE_MAKEFILE_IN_BASE_PATTERN_PRE_3_1 =
51
+ "\t\t$(Q) $(PURIFY) $(CC) $(LDFLAGS) $(XLDFLAGS) $(MAINOBJ) " \
52
+ "$(EXTOBJS) $(LIBRUBYARG) $(MAINLIBS) $(LIBS) $(EXTLIBS) $(OUTFLAG)$@"
53
+
54
+ TEMPLATE_MAKEFILE_IN_BASE_PATCH_PRE_3_1 =
55
+ "# -- Start of tebako patch --\n" \
56
+ "\t\t$(Q) $(PURIFY) $(CC) $(LDFLAGS) $(XLDFLAGS) $(MAINOBJ) " \
57
+ "$(EXTOBJS) $(LIBRUBYARG_STATIC) $(OUTFLAG)$@\n" \
58
+ "# -- End of tebako patch --"
59
+
60
+ TEMPLATE_MAKEFILE_IN_BASE_PATTERN =
61
+ "\t\t$(Q) $(PURIFY) $(CC) $(EXE_LDFLAGS) $(XLDFLAGS) $(MAINOBJ) $(EXTOBJS) " \
62
+ "$(LIBRUBYARG) $(MAINLIBS) $(LIBS) $(EXTLIBS) $(OUTFLAG)$@"
63
+
64
+ TEMPLATE_MAKEFILE_IN_BASE_PATCH =
65
+ "# -- Start of tebako patch --\n" \
66
+ "\t\t$(Q) $(PURIFY) $(CC) $(EXE_LDFLAGS) $(XLDFLAGS) $(MAINOBJ) " \
67
+ "$(EXTOBJS) $(LIBRUBYARG_STATIC) $(OUTFLAG)$@\n" \
68
+ "# -- End of tebako patch --"
69
+
70
+ TEMPLATE_MAKEFILE_IN_BASE_PATCH_MSYS =
71
+ "# -- Start of tebako patch --\n" \
72
+ "\t\t$(Q) $(PURIFY) $(CC) $(EXE_LDFLAGS) $(XLDFLAGS) $(RUBY_EXP) $(MAINOBJ) " \
73
+ "$(EXTOBJS) $(LIBRUBYARG_STATIC) $(OUTFLAG)$@\n" \
74
+ "# -- End of tebako patch --"
75
+
76
+ def template_makefile_in_patch_two(ostype, ruby_ver)
77
+ if PatchHelpers.msys?(ostype)
78
+ { TEMPLATE_MAKEFILE_IN_BASE_PATTERN => TEMPLATE_MAKEFILE_IN_BASE_PATCH_MSYS }
79
+ elsif PatchHelpers.ruby31?(ruby_ver)
80
+ { TEMPLATE_MAKEFILE_IN_BASE_PATTERN => TEMPLATE_MAKEFILE_IN_BASE_PATCH }
81
+ else
82
+ { TEMPLATE_MAKEFILE_IN_BASE_PATTERN_PRE_3_1 => TEMPLATE_MAKEFILE_IN_BASE_PATCH_PRE_3_1 }
83
+ end
84
+ end
85
+
86
+ # This MSYS specific thing ensure compilation of winmain.c
87
+ # Did try to understand why it did not work out of the box
88
+ GNUMAKEFILE_IN_WINMAIN_SUBST = <<~SUBST
89
+ RUBYDEF = $(DLL_BASE_NAME).def
90
+
91
+ # Start of tebako patch
92
+ WINMAINOBJ = win32/winmain.$(OBJEXT)
93
+ $(WINMAINOBJ): win32/winmain.c
94
+ # End of tebako patch
95
+ SUBST
96
+
97
+ # Other MSYS (GNUMakefile) specific patches
98
+ # - The same issue with libraries as for Makefile above
99
+ # - 'Kill' ruby.exp regeneration on pass2
100
+ # since we want to use outpu from pass1 for implib generation
101
+ # [VERY UGLY HACK]
102
+ # - Introduce LIBRUBY dependency on static extensions
103
+ # This is an addition to COMMON_MK_PATCH specified above
104
+ def get_gnumakefile_in_patch_p2(ruby_ver) # rubocop:disable Metrics/MethodLength
105
+ objext = PatchHelpers.ruby32?(ruby_ver) ? "$(OBJEXT)" : "@OBJEXT@"
106
+
107
+ {
108
+ "$(WPROGRAM): $(RUBYW_INSTALL_NAME).res.#{objext}" =>
109
+ "$(WPROGRAM): $(RUBYW_INSTALL_NAME).res.#{objext} $(WINMAINOBJ) # tebako patched",
110
+
111
+ "RUBYDEF = $(DLL_BASE_NAME).def" => GNUMAKEFILE_IN_WINMAIN_SUBST,
112
+
113
+ "$(MAINOBJ) $(EXTOBJS) $(LIBRUBYARG) $(LIBS) -o $@" =>
114
+ "$(WINMAINOBJ) $(EXTOBJS) $(LIBRUBYARG) $(MAINLIBS) -o $@ # tebako patched",
115
+
116
+ "$(RUBY_EXP): $(LIBRUBY_A)" => "dummy.exp: $(LIBRUBY_A) # tebako patched",
117
+
118
+ "$(PROGRAM): $(RUBY_INSTALL_NAME).res.#{objext}" =>
119
+ "$(PROGRAM): $(RUBY_INSTALL_NAME).res.#{objext} $(LIBRUBY_A) # tebako patched\n" \
120
+ "$(LIBRUBY_A): $(LIBRUBY_A_OBJS) $(INITOBJS) # tebako patched\n"
121
+ }
122
+ end
123
+ end
124
+ end
125
+ end
@@ -61,6 +61,16 @@ module Tebako
61
61
  out
62
62
  end
63
63
 
64
+ def msys?(ostype)
65
+ ostype =~ /msys|cygwin|mingw/
66
+ end
67
+
68
+ def patch_c_file(pattern)
69
+ {
70
+ pattern => "#{PatchLiterals::C_FILE_SUBST}\n#{pattern}"
71
+ }
72
+ end
73
+
64
74
  def recreate(dirname)
65
75
  FileUtils.rm_rf(dirname, noop: nil, verbose: nil, secure: true)
66
76
  FileUtils.mkdir(dirname)
@@ -109,6 +109,18 @@ module Tebako
109
109
  SUBST
110
110
  end
111
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
112
124
  def msys_libs(ruby_ver)
113
125
  <<~SUBST
114
126
  -Wl,-Bstatic #{linux_common_libs} \
@@ -29,7 +29,7 @@
29
29
  module Tebako
30
30
  module Packager
31
31
  # Ruby patching literals (pass2)
32
- module PatchLiterals # rubocop:disable Metrics/ModuleLength
32
+ module PatchLiterals
33
33
  TOOL_MKCONFIG_RB_PATCH = {
34
34
  " if fast[name]" => <<~SUBST
35
35
  # -- Start of tebako patch --
@@ -48,23 +48,21 @@ module Tebako
48
48
  SUBST
49
49
  }.freeze
50
50
 
51
- TOOL_MKCONFIG_RB_PATCH_MSYS = {
52
- " if fast[name]" => <<~SUBST
53
- # -- Start of tebako patch --
54
- v_head_comp = " CONFIG[\\"prefix\\"] \#{eq} "
55
- if v_head_comp == v[0...(v_head_comp.length)]
56
- v = "\#{v[0...(v_head_comp.length)]}CONFIG[\\"RUBY_EXEC_PREFIX\\"] = 'A:/__tebako_memfs__'
57
- "
58
- end
59
- v_head_comp = " CONFIG[\\"RUBY_EXEC_PREFIX\\"] \#{eq} "
60
- if v_head_comp == v[0...(v_head_comp.length)]
61
- v = "\#{v[0...(v_head_comp.length)]}'A:/__tebako_memfs__'
62
- "
63
- end
64
- # -- End of tebako patch --
65
- if fast[name]
66
- SUBST
67
- }.freeze
51
+ TOOLS_MKCONFIG_RB_SUBST = <<~SUBST
52
+ # -- Start of tebako patch --
53
+ v_head_comp = " CONFIG[\\"prefix\\"] \#{eq} "
54
+ if v_head_comp == v[0...(v_head_comp.length)]
55
+ v = "\#{v[0...(v_head_comp.length)]}CONFIG[\\"RUBY_EXEC_PREFIX\\"] = 'A:/__tebako_memfs__'
56
+ "
57
+ end
58
+ v_head_comp = " CONFIG[\\"RUBY_EXEC_PREFIX\\"] \#{eq} "
59
+ if v_head_comp == v[0...(v_head_comp.length)]
60
+ v = "\#{v[0...(v_head_comp.length)]}'A:/__tebako_memfs__'
61
+ "
62
+ end
63
+ # -- End of tebako patch --
64
+ if fast[name]
65
+ SUBST
68
66
 
69
67
  # Alpine-specific patches https://github.com/docker-library/ruby/blob/master/3.1/alpine3.15/Dockerfile
70
68
  # -- Patch no. 1 --
@@ -169,7 +167,7 @@ module Tebako
169
167
  "else if (e == EIO /* tebako patch */ && !within_tebako_memfs(path)) {"
170
168
  }.freeze
171
169
 
172
- DLN_C_MSYS_PATCH = {
170
+ DLN_C_MSYS_PATCH_PRE32 = {
173
171
  " winfile = rb_w32_mbstr_to_wstr(CP_UTF8, file, -1, NULL);" => <<~SUBST
174
172
  /* -- Start of tebako patch -- */
175
173
  char *f = NULL;
@@ -191,37 +189,28 @@ module Tebako
191
189
  SUBST
192
190
  }.freeze
193
191
 
194
- COMMON_MK_PATCH = {
195
- "ext/extinit.c: $(srcdir)/template/extinit.c.tmpl $(PREP)" =>
196
- "ext/extinit.c: $(srcdir)/template/extinit.c.tmpl $(PREP) $(EXTS_MK)"
192
+ DLN_C_MSYS_PATCH = {
193
+ " WCHAR *winfile = rb_w32_mbstr_to_wstr(CP_UTF8, file, -1, NULL);" => <<~SUBST
194
+ /* -- Start of tebako patch -- */
195
+ char *f = NULL;
196
+ WCHAR *winfile = NULL;
197
+ if (file && within_tebako_memfs(file)) {
198
+ f = tebako_dlmap2file(file);
199
+ if (f) {
200
+ winfile = rb_w32_mbstr_to_wstr(CP_UTF8, f, -1, NULL);
201
+ free(f);
202
+ }
203
+ else {
204
+ goto failed;
205
+ }
206
+ }
207
+ else {
208
+ winfile = rb_w32_mbstr_to_wstr(CP_UTF8, file, -1, NULL);
209
+ }
210
+ /* -- End of tebako patch -- */
211
+ SUBST
197
212
  }.freeze
198
213
 
199
- TEMPLATE_MAKEFILE_IN_BASE_PATTERN_PRE_3_1 =
200
- "\t\t$(Q) $(PURIFY) $(CC) $(LDFLAGS) $(XLDFLAGS) $(MAINOBJ) " \
201
- "$(EXTOBJS) $(LIBRUBYARG) $(MAINLIBS) $(LIBS) $(EXTLIBS) $(OUTFLAG)$@"
202
-
203
- TEMPLATE_MAKEFILE_IN_BASE_PATCH_PRE_3_1 =
204
- "# -- Start of tebako patch --\n" \
205
- "\t\t$(Q) $(PURIFY) $(CC) $(LDFLAGS) $(XLDFLAGS) $(MAINOBJ) " \
206
- "$(EXTOBJS) $(LIBRUBYARG_STATIC) $(OUTFLAG)$@\n" \
207
- "# -- End of tebako patch --"
208
-
209
- TEMPLATE_MAKEFILE_IN_BASE_PATTERN =
210
- "\t\t$(Q) $(PURIFY) $(CC) $(EXE_LDFLAGS) $(XLDFLAGS) $(MAINOBJ) $(EXTOBJS) " \
211
- "$(LIBRUBYARG) $(MAINLIBS) $(LIBS) $(EXTLIBS) $(OUTFLAG)$@"
212
-
213
- TEMPLATE_MAKEFILE_IN_BASE_PATCH =
214
- "# -- Start of tebako patch --\n" \
215
- "\t\t$(Q) $(PURIFY) $(CC) $(EXE_LDFLAGS) $(XLDFLAGS) $(MAINOBJ) " \
216
- "$(EXTOBJS) $(LIBRUBYARG_STATIC) $(OUTFLAG)$@\n" \
217
- "# -- End of tebako patch --"
218
-
219
- TEMPLATE_MAKEFILE_IN_BASE_PATCH_MSYS =
220
- "# -- Start of tebako patch --\n" \
221
- "\t\t$(Q) $(PURIFY) $(CC) $(EXE_LDFLAGS) $(XLDFLAGS) $(RUBY_EXP) $(MAINOBJ) " \
222
- "$(EXTOBJS) $(LIBRUBYARG_STATIC) $(OUTFLAG)$@\n" \
223
- "# -- End of tebako patch --"
224
-
225
214
  C_FILE_SUBST = <<~SUBST
226
215
  /* -- Start of tebako patch -- */
227
216
  #include <tebako/tebako-config.h>
@@ -251,15 +240,6 @@ module Tebako
251
240
  SUBST
252
241
  }.freeze
253
242
 
254
- GNUMAKEFILE_IN_WINMAIN_SUBST = <<~SUBST
255
- RUBYDEF = $(DLL_BASE_NAME).def
256
-
257
- # Start of tebako patch
258
- WINMAINOBJ = win32/winmain.$(OBJEXT)
259
- $(WINMAINOBJ): win32/winmain.c
260
- # End of tebako patch
261
- SUBST
262
-
263
243
  IO_C_SUBST = <<~SUBST
264
244
  /* -- Start of tebako patch -- */
265
245
  if (is_tebako_file_descriptor(fd)) return;
@@ -267,13 +247,23 @@ module Tebako
267
247
  flags = fcntl(fd, F_GETFD); /* should not fail except EBADF. */
268
248
  SUBST
269
249
 
270
- IO_C_MSYS_PATCH = {
271
- "#define open rb_w32_uopen" => "#define open(p, f, m) tebako_open(3, (p), (f), (m))",
250
+ IO_C_MSYS_BASE_PATCH = {
251
+ "#define open rb_w32_uopen" => "#define open(p, f, m) tebako_open(3, (p), (f), (m))"
252
+ }.freeze
253
+
254
+ IO_C_MSYS_PATCH_PRE_32 = {
272
255
  "(rb_w32_io_cancelable_p((fptr)->fd) ? Qnil : rb_io_wait(fptr->self, RB_INT2NUM(RUBY_IO_READABLE), Qnil))" =>
273
256
  "((is_tebako_file_descriptor((fptr)->fd) || rb_w32_io_cancelable_p((fptr)->fd)) ? \\\n" \
274
257
  "Qnil : rb_io_wait(fptr->self, RB_INT2NUM(RUBY_IO_READABLE), Qnil))"
275
258
  }.freeze
276
259
 
260
+ IO_C_MSYS_PATCH = {
261
+ "(rb_w32_io_cancelable_p((fptr)->fd) ? Qnil : rb_io_wait(fptr->self, " \
262
+ "RB_INT2NUM(RUBY_IO_READABLE), RUBY_IO_TIMEOUT_DEFAULT))" =>
263
+ "((is_tebako_file_descriptor((fptr)->fd) || rb_w32_io_cancelable_p((fptr)->fd)) ? \\\n" \
264
+ "Qnil : rb_io_wait(fptr->self, RB_INT2NUM(RUBY_IO_READABLE), RUBY_IO_TIMEOUT_DEFAULT))"
265
+ }.freeze
266
+
277
267
  FILE_C_MSYS_SUBST = <<~SUBST
278
268
  /* -- Start of tebako patch -- */
279
269
  if (is_tebako_file_descriptor((fptr)->fd)) return ENOTSUP;
@@ -26,5 +26,5 @@
26
26
  # POSSIBILITY OF SUCH DAMAGE.
27
27
 
28
28
  module Tebako
29
- VERSION = "0.6.0"
29
+ VERSION = "0.6.3"
30
30
  end
data/src/tebako-main.cpp CHANGED
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  *
3
- * Copyright (c) 2021-2022 [Ribose Inc](https://www.ribose.com).
3
+ * Copyright (c) 2021-2024 [Ribose Inc](https://www.ribose.com).
4
4
  * All rights reserved.
5
5
  * This file is a part of tebako
6
6
  *
@@ -50,6 +50,8 @@
50
50
  #include <tebako/tebako-main.h>
51
51
  #include <tebako/tebako-fs.h>
52
52
 
53
+ static int running_miniruby = 0;
54
+
53
55
  extern "C" int tebako_main(int* argc, char*** argv) {
54
56
  int ret = -1, fsret = -1;
55
57
  char** new_argv = NULL;
@@ -59,6 +61,7 @@ extern "C" int tebako_main(int* argc, char*** argv) {
59
61
  // Ruby build script is designed in such a way that this patch is also applied towards miniruby
60
62
  // Just pass through in such case
61
63
  ret = 0;
64
+ running_miniruby = -1;
62
65
  }
63
66
  else {
64
67
  try {
@@ -149,3 +152,7 @@ extern "C" int tebako_main(int* argc, char*** argv) {
149
152
  extern "C" const char* tebako_mount_point(void) {
150
153
  return tebako::fs_mount_point;
151
154
  }
155
+
156
+ extern "C" int tebako_is_running_miniruby(void) {
157
+ return running_miniruby;
158
+ }
data/version.txt CHANGED
@@ -1 +1 @@
1
- 0.6.0
1
+ 0.6.3
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tebako
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.0
4
+ version: 0.6.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ribose Inc.
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-04-01 00:00:00.000000000 Z
11
+ date: 2024-05-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: thor
@@ -70,6 +70,7 @@ files:
70
70
  - lib/tebako/packager.rb
71
71
  - lib/tebako/packager/pass1.rb
72
72
  - lib/tebako/packager/pass2.rb
73
+ - lib/tebako/packager/patch_buildsystem.rb
73
74
  - lib/tebako/packager/patch_helpers.rb
74
75
  - lib/tebako/packager/patch_libraries.rb
75
76
  - lib/tebako/packager/patch_literals.rb
@@ -134,7 +135,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
134
135
  - !ruby/object:Gem::Version
135
136
  version: '0'
136
137
  requirements: []
137
- rubygems_version: 3.5.3
138
+ rubygems_version: 3.5.9
138
139
  signing_key:
139
140
  specification_version: 4
140
141
  summary: Packager for Ruby executables