tebako 0.5.12 → 0.6.2

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.
data/exe/tebako-packager CHANGED
@@ -74,19 +74,25 @@ begin
74
74
  Tebako::Packager.pass2(ARGV[1], ARGV[2], ARGV[3], ARGV[6])
75
75
  when "deploy"
76
76
  # ARGV[0] -- command
77
- # ARGV[1] -- FS_STASH_DIR
78
- # ARGV[2] -- DATA_SRC_DIR
79
- # ARGV[3] -- DATA_PRE_DIR
80
- # ARGV[4] -- DATA_BIN_DIR
81
- # ARGV[5] -- GFLENGTH
82
- unless ARGV.length == 6
77
+ # ARGV[1] -- OSTYPE
78
+ # ARGV[2] -- RUBY_SOURCE_DIR
79
+ # ARGV[3] -- FS_STASH_DIR
80
+ # ARGV[4] -- DATA_SRC_DIR
81
+ # ARGV[5] -- DATA_PRE_DIR
82
+ # ARGV[6] -- DATA_BIN_DIR
83
+ # ARGV[7] -- GFLENGTH
84
+ # ARGV[8] -- APP_NAME
85
+ # ARGV[9] -- RUBY_VER
86
+ unless ARGV.length == 10
83
87
  raise Tebako::Error,
84
- "tebako-packager deploy command expects 6 arguments, #{ARGV.length} has been provided."
88
+ "tebako-packager deploy command expects 10 arguments, #{ARGV.length} has been provided."
85
89
  end
86
- Tebako::Packager.init(ARGV[1], ARGV[2], ARGV[3], ARGV[4])
90
+ Tebako::Packager.init(ARGV[3], ARGV[4], ARGV[5], ARGV[6])
91
+ Tebako::Packager.create_implib(ARGV[2], ARGV[4], File.basename(ARGV[8]), ARGV[9]) if ARGV[1] =~ /msys/
87
92
  # Assume that "<TARGET_BIN_DIR (TBD)>" is <DATA_SRC_DIR>/bin"
88
93
  # That shall match CMakeLists.txt settings
89
- Tebako::Packager.deploy(ARGV[2], "#{ARGV[2]}/bin", ARGV[5])
94
+ Tebako::Packager.deploy(ARGV[4], "#{ARGV[4]}/bin", ARGV[7])
95
+
90
96
  else
91
97
  raise Tebako::Error, "tebako-packager cannot process #{ARGV[0]} command"
92
98
  end
@@ -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
data/lib/tebako/cli.rb CHANGED
@@ -28,10 +28,12 @@
28
28
 
29
29
  require "digest"
30
30
  require "fileutils"
31
+ require "open3"
31
32
  require "thor"
32
33
  require "yaml"
33
34
 
34
35
  require_relative "cli_helpers"
36
+ require_relative "cli_rubies"
35
37
  require_relative "error"
36
38
 
37
39
  # Tebako - an executable packager
@@ -47,24 +49,21 @@ module Tebako
47
49
  desc "clean", "Clean tebako packaging environment"
48
50
  def clean
49
51
  puts "Cleaning tebako packaging environment"
50
- FileUtils.rm_rf([deps, output], secure: true)
52
+ # Using File.join(deps, "") to ensure that the slashes are appropriate
53
+ FileUtils.rm_rf([File.join(deps, ""), File.join(output, "")], secure: true)
51
54
  end
52
55
 
53
56
  desc "clean_ruby", "Clean Ruby source from tebako packaging environment"
54
57
  method_option :Ruby, type: :string, aliases: "-R", required: false,
55
- enum: Tebako::CliHelpers::RUBY_VERSIONS.keys,
58
+ enum: Tebako::CliRubies::RUBY_VERSIONS.keys,
56
59
  desc: "Ruby version to clean, all available versions by default"
57
60
  def clean_ruby
58
61
  puts "Cleaning Ruby sources from tebako packaging environment"
59
- if options["Ruby"].nil?
60
- nmr = "#{deps}/src/_ruby_*"
61
- nms = "#{deps}/stash_*"
62
- else
63
- nmr = "#{deps}/src/_ruby_#{options["Ruby"]}*"
64
- nms = "#{deps}/stash_#{options["Ruby"]}"
65
- end
66
- FileUtils.rm_rf(Dir.glob(nmr), secure: true)
67
- FileUtils.rm_rf(Dir.glob(nms), secure: true)
62
+ suffix = options["Ruby"].nil? ? "" : "_#{options["Ruby"]}"
63
+ nmr = "src/_ruby_#{suffix}*"
64
+ nms = "stash_#{suffix}"
65
+ FileUtils.rm_rf(Dir.glob(File.join(deps, nmr)), secure: true)
66
+ FileUtils.rm_rf(Dir.glob(File.join(deps, nms)), secure: true)
68
67
  end
69
68
 
70
69
  desc "hash", "Print build script hash (ci cache key)"
@@ -81,8 +80,8 @@ module Tebako
81
80
  desc: "Tebako package file name, entry point base file name in the current folder by default"
82
81
  method_option :root, type: :string, aliases: "-r", required: true, desc: "Root folder of the Ruby application"
83
82
  method_option :Ruby, type: :string, aliases: "-R", required: false,
84
- enum: Tebako::CliHelpers::RUBY_VERSIONS.keys,
85
- desc: "Tebako package Ruby version, #{Tebako::CliHelpers::DEFAULT_RUBY_VERSION} by default"
83
+ enum: Tebako::CliRubies::RUBY_VERSIONS.keys,
84
+ desc: "Tebako package Ruby version, #{Tebako::CliRubies::DEFAULT_RUBY_VERSION} by default"
86
85
  def press
87
86
  puts press_announce
88
87
  do_press
@@ -93,8 +92,8 @@ module Tebako
93
92
 
94
93
  desc "setup", "Set up tebako packaging environment"
95
94
  method_option :Ruby, type: :string, aliases: "-R", required: false,
96
- enum: Tebako::CliHelpers::RUBY_VERSIONS.keys,
97
- desc: "Tebako package Ruby version, #{Tebako::CliHelpers::DEFAULT_RUBY_VERSION} by default"
95
+ enum: Tebako::CliRubies::RUBY_VERSIONS.keys,
96
+ desc: "Tebako package Ruby version, #{Tebako::CliRubies::DEFAULT_RUBY_VERSION} by default."
98
97
  def setup
99
98
  puts "Setting up tebako packaging environment"
100
99
  do_setup
@@ -122,29 +121,23 @@ module Tebako
122
121
 
123
122
  no_commands do
124
123
  def do_press
125
- packaging_error(103) unless system(b_env, "cmake -DSETUP_MODE:BOOLEAN=OFF #{cfg_options} #{press_options}")
126
- packaging_error(104) unless system(b_env,
127
- "cmake --build #{output} --target tebako --parallel #{Etc.nprocessors}")
124
+ cfg_cmd = "cmake -DSETUP_MODE:BOOLEAN=OFF #{cfg_options} #{press_options}"
125
+ build_cmd = "cmake --build #{output} --target tebako --parallel #{Etc.nprocessors}"
126
+ merged_env = ENV.to_h.merge(b_env)
127
+ Tebako.packaging_error(103) unless system(merged_env, cfg_cmd)
128
+ Tebako.packaging_error(104) unless system(merged_env, build_cmd)
128
129
  end
129
130
 
130
131
  def do_setup
131
- packaging_error(101) unless system(b_env, "cmake -DSETUP_MODE:BOOLEAN=ON #{cfg_options}")
132
- packaging_error(102) unless system(b_env,
133
- "cmake --build #{output} --target setup --parallel #{Etc.nprocessors}")
134
- end
135
-
136
- def press_announce
137
- @press_announce ||= <<~ANN
138
- Running tebako press at #{prefix}
139
- Ruby version: '#{extend_ruby_version[0]}'
140
- Project root: '#{options["root"]}'
141
- Application entry point: '#{options["entry-point"]}'
142
- Package file name: '#{package}'
143
- Loging level: '#{l_level}'
144
- ANN
132
+ cfg_cmd = "cmake -DSETUP_MODE:BOOLEAN=ON #{cfg_options}"
133
+ build_cmd = "cmake --build \"#{output}\" --target setup --parallel #{Etc.nprocessors}"
134
+ merged_env = ENV.to_h.merge(b_env)
135
+ Tebako.packaging_error(101) unless system(merged_env, cfg_cmd)
136
+ Tebako.packaging_error(102) unless system(merged_env, build_cmd)
145
137
  end
146
138
  end
147
139
 
148
140
  include Tebako::CliHelpers
141
+ include Tebako::CliRubies
149
142
  end
150
143
  end
@@ -30,13 +30,14 @@ require "fileutils"
30
30
  require "pathname"
31
31
  require "rbconfig"
32
32
 
33
+ require_relative "cli_rubies"
33
34
  require_relative "error"
34
35
  require_relative "version"
35
36
 
36
37
  # Tebako - an executable packager
37
38
  # Command-line interface methods
38
39
  module Tebako
39
- # Cli methods
40
+ # Cli helpers
40
41
  module CliHelpers
41
42
  def b_env
42
43
  u_flags = if RbConfig::CONFIG["host_os"] =~ /darwin/
@@ -49,35 +50,25 @@ module Tebako
49
50
 
50
51
  def cfg_options
51
52
  ruby_ver, ruby_hash = extend_ruby_version
53
+ # Cannot use 'xxx' as parameters because it does not work in Windows shells
54
+ # So we have to use \"xxx\"
52
55
  @cfg_options ||=
53
- "-DCMAKE_BUILD_TYPE=Release -DRUBY_VER:STRING='#{ruby_ver}' -DRUBY_HASH:STRING='#{ruby_hash}' " \
54
- "-DDEPS:STRING='#{deps}' -G '#{m_files}' -B '#{output}' -S '#{source}'"
56
+ "-DCMAKE_BUILD_TYPE=Release -DRUBY_VER:STRING=\"#{ruby_ver}\" -DRUBY_HASH:STRING=\"#{ruby_hash}\" " \
57
+ "-DDEPS:STRING=\"#{deps}\" -G \"#{m_files}\" -B \"#{output}\" -S \"#{source}\""
55
58
  end
56
59
 
57
60
  def deps
58
61
  @deps ||= File.join(prefix, "deps")
59
62
  end
60
63
 
61
- RUBY_VERSIONS = {
62
- "2.7.8" => "c2dab63cbc8f2a05526108ad419efa63a67ed4074dbbcf9fc2b1ca664cb45ba0",
63
- "3.0.6" => "6e6cbd490030d7910c0ff20edefab4294dfcd1046f0f8f47f78b597987ac683e",
64
- "3.1.4" => "a3d55879a0dfab1d7141fdf10d22a07dbf8e5cdc4415da1bde06127d5cc3c7b6",
65
- "3.2.3" => "af7f1757d9ddb630345988139211f1fd570ff5ba830def1cc7c468ae9b65c9ba",
66
- "3.3.0" => "96518814d9832bece92a85415a819d4893b307db5921ae1f0f751a9a89a56b7d"
67
- }.freeze
68
-
69
- DEFAULT_RUBY_VERSION = "3.1.4"
70
-
71
- def extend_ruby_version
72
- version = options["Ruby"].nil? ? DEFAULT_RUBY_VERSION : options["Ruby"]
73
- unless RUBY_VERSIONS.key?(version)
74
- raise Tebako::Error.new(
75
- "Ruby version #{version} is not supported yet, exiting",
76
- 253
77
- )
64
+ def fs_current
65
+ fs_current = Dir.pwd
66
+ if RUBY_PLATFORM =~ /msys|mingw|cygwin/
67
+ fs_current, cygpath_res = Open3.capture2e("cygpath", "-w", fs_current)
68
+ Tebako.packaging_error(101) unless cygpath_res.success?
69
+ fs_current.strip!
78
70
  end
79
-
80
- @extend_ruby_version ||= [version, RUBY_VERSIONS[version]]
71
+ @fs_current ||= fs_current
81
72
  end
82
73
 
83
74
  def l_level
@@ -90,14 +81,17 @@ module Tebako
90
81
 
91
82
  # rubocop:disable Metrics/MethodLength
92
83
  def m_files
93
- @m_files ||= case RbConfig::CONFIG["host_os"]
84
+ # [TODO]
85
+ # Ninja generates incorrect script fot tebako press target -- gets lost in a chain custom targets
86
+ # Using makefiles has negative performance impact so it needs to be fixed
87
+ @m_files ||= case RUBY_PLATFORM
94
88
  when /linux/, /darwin/
95
89
  "Unix Makefiles"
96
- when /msys/
97
- "Ninja"
90
+ when /msys|mingw|cygwin/
91
+ "MinGW Makefiles"
98
92
  else
99
93
  raise Tebako::Error.new(
100
- "#{RbConfig::CONFIG["host_os"]} is not supported yet, exiting",
94
+ "#{RUBY_PLATFORM} is not supported yet, exiting",
101
95
  254
102
96
  )
103
97
  end
@@ -109,26 +103,18 @@ module Tebako
109
103
  end
110
104
 
111
105
  def package
112
- @package ||= if options["output"].nil?
113
- File.join(Dir.pwd, File.basename(options["entry-point"], ".*"))
106
+ package = if options["output"].nil?
107
+ File.join(Dir.pwd, File.basename(options["entry-point"], ".*"))
108
+ else
109
+ options["output"]
110
+ end
111
+ @package ||= if relative?(package)
112
+ File.join(fs_current, package)
114
113
  else
115
- options["output"]
114
+ package
116
115
  end
117
116
  end
118
117
 
119
- PACKAGING_ERRORS = {
120
- 101 => "'tebako setup' configure step failed",
121
- 102 => "'tebako setup' build step failed",
122
- 103 => "'tebako press' configure step failed",
123
- 104 => "'tebako press' build step failed"
124
- }.freeze
125
-
126
- def packaging_error(code)
127
- msg = PACKAGING_ERRORS[code]
128
- msg = "Unknown packaging error" if msg.nil?
129
- raise Tebako::Error.new msg, code
130
- end
131
-
132
118
  def prefix
133
119
  @prefix ||= if options["prefix"].nil?
134
120
  puts "No prefix specified, using ~/.tebako"
@@ -140,10 +126,33 @@ module Tebako
140
126
  end
141
127
  end
142
128
 
129
+ def press_announce
130
+ @press_announce ||= <<~ANN
131
+ Running tebako press at #{prefix}
132
+ Ruby version: '#{extend_ruby_version[0]}'
133
+ Project root: '#{root}'
134
+ Application entry point: '#{options["entry-point"]}'
135
+ Package file name: '#{package}'
136
+ Loging level: '#{l_level}'
137
+ ANN
138
+ end
139
+
143
140
  def press_options
144
141
  @press_options ||=
145
- "-DROOT:STRING='#{options["root"]}' -DENTRANCE:STRING='#{options["entry-point"]}' " \
146
- "-DPCKG:STRING='#{package}' -DLOG_LEVEL:STRING='#{options["log-level"]}'"
142
+ "-DROOT:STRING='#{root}' -DENTRANCE:STRING='#{options["entry-point"]}' " \
143
+ "-DPCKG:STRING='#{package}' -DLOG_LEVEL:STRING='#{options["log-level"]}' "
144
+ end
145
+
146
+ def relative?(path)
147
+ Pathname.new(path).relative?
148
+ end
149
+
150
+ def root
151
+ @root ||= if relative?(options["root"])
152
+ File.join(fs_current, options["root"])
153
+ else
154
+ File.join(options["root"], "")
155
+ end
147
156
  end
148
157
 
149
158
  def source
@@ -0,0 +1,75 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Copyright (c) 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 "fileutils"
29
+ require "pathname"
30
+ require "rbconfig"
31
+
32
+ require_relative "error"
33
+ require_relative "version"
34
+
35
+ # Tebako - an executable packager
36
+ # Command-line interface methods
37
+ module Tebako
38
+ # Ruby version helpers
39
+ module CliRubies
40
+ RUBY_VERSIONS = {
41
+ "2.7.8" => "c2dab63cbc8f2a05526108ad419efa63a67ed4074dbbcf9fc2b1ca664cb45ba0",
42
+ "3.0.6" => "6e6cbd490030d7910c0ff20edefab4294dfcd1046f0f8f47f78b597987ac683e",
43
+ "3.1.4" => "a3d55879a0dfab1d7141fdf10d22a07dbf8e5cdc4415da1bde06127d5cc3c7b6",
44
+ "3.2.3" => "af7f1757d9ddb630345988139211f1fd570ff5ba830def1cc7c468ae9b65c9ba",
45
+ "3.3.0" => "96518814d9832bece92a85415a819d4893b307db5921ae1f0f751a9a89a56b7d"
46
+ }.freeze
47
+
48
+ DEFAULT_RUBY_VERSION = "3.1.4"
49
+
50
+ def version_check(version)
51
+ return if RUBY_VERSIONS.key?(version)
52
+
53
+ raise Tebako::Error.new(
54
+ "Ruby version #{version} is not supported yet, exiting",
55
+ 253
56
+ )
57
+ end
58
+
59
+ def version_check_msys(version)
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
+ end
67
+
68
+ def extend_ruby_version
69
+ version = options["Ruby"].nil? ? DEFAULT_RUBY_VERSION : options["Ruby"]
70
+ version_check(version)
71
+ version_check_msys(version)
72
+ @extend_ruby_version ||= [version, RUBY_VERSIONS[version]]
73
+ end
74
+ end
75
+ end
data/lib/tebako/error.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # Copyright (c) 2023 [Ribose Inc](https://www.ribose.com).
3
+ # Copyright (c) 2023-204 [Ribose Inc](https://www.ribose.com).
4
4
  # All rights reserved.
5
5
  # This file is a part of tebako
6
6
  #
@@ -26,8 +26,23 @@
26
26
  # POSSIBILITY OF SUCH DAMAGE.
27
27
 
28
28
  # Tebako - an executable packager
29
- # Tebako error class
30
29
  module Tebako
30
+ PACKAGING_ERRORS = {
31
+ 101 => "'tebako setup' configure step failed",
32
+ 102 => "'tebako setup' build step failed",
33
+ 103 => "'tebako press' configure step failed",
34
+ 104 => "'tebako press' build step failed",
35
+ 105 => "Failed to map MSys path to Windows"
36
+ }.freeze
37
+
38
+ class << self
39
+ def packaging_error(code)
40
+ msg = PACKAGING_ERRORS[code]
41
+ msg = "Unknown packaging error" if msg.nil?
42
+ raise Tebako::Error.new msg, code
43
+ end
44
+ end
45
+
31
46
  # Tebako error class
32
47
  class Error < StandardError
33
48
  def initialize(msg = "Unspecified error", code = 255)
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # Copyright (c) 2021-2023 [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
  #
@@ -25,19 +25,30 @@
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_relative "patch_literals"
28
29
  require_relative "patch_helpers"
30
+ require_relative "patch_buildsystem"
29
31
 
30
32
  # Tebako - an executable packager
31
33
  module Tebako
32
34
  module Packager
33
35
  # Ruby patching definitions (pass1)
34
36
  module Pass1
37
+ # [TODO] looks like it does not exist in 3.1.4
38
+ # May be obsolete
35
39
  TOOL_RBINSTALL_RB_PATCH = {
36
40
  " next if files.empty?" => "# tebako patched next if files.empty?"
37
41
  }.freeze
38
42
 
43
+ RUBYGEM_OPENSSL_RB_SUBST = <<~SUBST
44
+ # Start of tebako patch
45
+ require "openssl"
46
+ # End of tebako patch
47
+ autoload :OpenSSL, "openssl"
48
+ SUBST
49
+
39
50
  RUBYGEM_OPENSSL_RB_PATCH = {
40
- 'autoload :OpenSSL, "openssl"' => "require \"openssl\"\nautoload :OpenSSL, \"openssl\""
51
+ 'autoload :OpenSSL, "openssl"' => RUBYGEM_OPENSSL_RB_SUBST
41
52
  }.freeze
42
53
 
43
54
  EXT_SETUP_PATCH = {
@@ -77,13 +88,25 @@ module Tebako
77
88
  SUBST
78
89
  }.freeze
79
90
 
80
- CONFIGURE_PATCH = {
91
+ DARWIN_CONFIGURE_PATCH = {
81
92
  "EXTDLDFLAGS=\"-bundle_loader '\\$(BUILTRUBY)'\"" => ""
82
93
  }.freeze
83
94
 
95
+ OPENSSL_EXTCONF_RB_SUBST = <<~SUBST
96
+ # Start of tebako patch
97
+ $defs.push("-DRUBY_EXPORT=1")
98
+ # End of tebako patch
99
+
100
+ Logging::message "=== Checking done. ===\\n"
101
+ SUBST
102
+
103
+ OPENSSL_EXTCONF_RB_PATCH = {
104
+ "Logging::message \"=== Checking done. ===\\n\"" => OPENSSL_EXTCONF_RB_SUBST
105
+ }.freeze
106
+
84
107
  class << self
85
- def get_patch_map(ostype, mount_point, ruby_ver)
86
- patch_map = {
108
+ def get_base_patch_map(mount_point)
109
+ {
87
110
  # ....................................................
88
111
  # It won't install gems with no files defined in spec
89
112
  # However if
@@ -91,6 +114,8 @@ module Tebako
91
114
  # -- extension is build statically
92
115
  # there may be no files install in addition to spec
93
116
  # Example: io/wait extension (and others)
117
+ # [TODO] Check if it is still required
118
+ # No match and patching on Ruby 3.1.4 but works wo issues
94
119
  "tool/rbinstall.rb" => TOOL_RBINSTALL_RB_PATCH,
95
120
 
96
121
  # ....................................................
@@ -106,20 +131,62 @@ module Tebako
106
131
  # Disable dynamic extensions
107
132
  "ext/Setup" => EXT_SETUP_PATCH
108
133
  }
134
+ end
135
+
136
+ def get_patch_map(ostype, mount_point, ruby_ver)
137
+ patch_map = get_base_patch_map(mount_point)
138
+
109
139
  # ....................................................
110
140
  # Fixing (bypassing) configure script bug where a variable is used before initialization
111
- patch_map.store("configure", CONFIGURE_PATCH) if ostype =~ /darwin/
141
+ patch_map.store("configure", DARWIN_CONFIGURE_PATCH) if ostype =~ /darwin/
112
142
 
113
143
  # ....................................................
114
144
  # autoload :OpenSSL, "openssl"
115
145
  # fails to deal with a default gem from statically linked extension
116
146
  patch_map.store("lib/rubygems/openssl.rb", RUBYGEM_OPENSSL_RB_PATCH) if PatchHelpers.ruby3x?(ruby_ver)
117
147
 
148
+ if ostype =~ /msys/
149
+ # ....................................................
150
+ # Generate export definitions; use WinMain to build rubyw.exe
151
+ patch_map.store("cygwin/GNUmakefile.in", get_gnumakefile_in_patch_p1(ruby_ver))
152
+ # ....................................................
153
+ # RUBY_EXPORT=1 (shall ve set for static builds but is missing in openssl extension)
154
+ patch_map.store("ext/openssl/extconf.rb", OPENSSL_EXTCONF_RB_PATCH)
155
+ end
156
+
118
157
  patch_map
119
158
  end
120
159
 
121
160
  private
122
161
 
162
+ include Tebako::Packager::PatchLiterals
163
+ include Tebako::Packager::PatchBuildsystem
164
+
165
+ def get_gnumakefile_in_patch_p1(ruby_ver) # rubocop:disable Metrics/MethodLength
166
+ objext = PatchHelpers.ruby32?(ruby_ver) ? "$(OBJEXT)" : "@OBJEXT@"
167
+ {
168
+ " DLLWRAP += -mno-cygwin" =>
169
+ "# tebako patched DLLWRAP += -mno-cygwin",
170
+
171
+ "$(WPROGRAM): $(RUBYW_INSTALL_NAME).res.#{objext}" =>
172
+ "$(WPROGRAM): $(RUBYW_INSTALL_NAME).res.#{objext} $(WINMAINOBJ) # tebako patched",
173
+
174
+ "$(MAINOBJ) $(EXTOBJS) $(LIBRUBYARG) $(LIBS) -o $@" =>
175
+ "$(WINMAINOBJ) $(EXTOBJS) $(LIBRUBYARG) $(LIBS) -o $@ # tebako patched",
176
+
177
+ "--output-exp=$(RUBY_EXP) \\" =>
178
+ "--output-exp=$(RUBY_EXP) --output-lib=$(LIBRUBY) --output-def=tebako.def \\",
179
+
180
+ " @rm -f $(PROGRAM)" =>
181
+ "# tebako patched @rm -f $(PROGRAM)",
182
+
183
+ " $(Q) $(LDSHARED) $(DLDFLAGS) $(OBJS) dmyext.o $(SOLIBS) -o $(PROGRAM)" =>
184
+ "# tebako patched $(Q) $(LDSHARED) $(DLDFLAGS) $(OBJS) dmyext.o $(SOLIBS) -o $(PROGRAM)",
185
+
186
+ "RUBYDEF = $(DLL_BASE_NAME).def" => GNUMAKEFILE_IN_WINMAIN_SUBST
187
+ }
188
+ end
189
+
123
190
  def rubygems_path_support_patch_one(mount_point)
124
191
  <<~SUBST
125
192
  @home = env["GEM_HOME"] || Gem.default_dir