tebako 0.5.12 → 0.6.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CMakeLists.txt +107 -196
- data/README.adoc +82 -22
- data/common.env +1 -1
- data/exe/tebako-packager +15 -9
- data/include/tebako/tebako-main.h +2 -1
- data/lib/tebako/cli.rb +25 -32
- data/lib/tebako/cli_helpers.rb +53 -44
- data/lib/tebako/cli_rubies.rb +75 -0
- data/lib/tebako/error.rb +17 -2
- data/lib/tebako/packager/pass1.rb +73 -6
- data/lib/tebako/packager/pass2.rb +63 -93
- data/lib/tebako/packager/patch_buildsystem.rb +125 -0
- data/lib/tebako/packager/patch_helpers.rb +10 -0
- data/lib/tebako/packager/patch_libraries.rb +150 -0
- data/lib/tebako/packager/patch_literals.rb +161 -91
- data/lib/tebako/packager.rb +28 -2
- data/lib/tebako/version.rb +1 -1
- data/src/tebako-main.cpp +7 -37
- data/tools/ci-scripts/patch-fbthrift.sh +3 -56
- data/tools/ci-scripts/patch-folly.sh +52 -10
- data/version.txt +1 -1
- metadata +5 -2
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] --
|
78
|
-
# ARGV[2] --
|
79
|
-
# ARGV[3] --
|
80
|
-
# ARGV[4] --
|
81
|
-
# ARGV[5] --
|
82
|
-
|
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
|
88
|
+
"tebako-packager deploy command expects 10 arguments, #{ARGV.length} has been provided."
|
85
89
|
end
|
86
|
-
Tebako::Packager.init(ARGV[
|
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[
|
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
|
-
|
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::
|
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
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
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::
|
85
|
-
desc: "Tebako package Ruby version, #{Tebako::
|
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::
|
97
|
-
desc: "Tebako package Ruby version, #{Tebako::
|
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
|
-
|
126
|
-
|
127
|
-
|
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
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
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
|
data/lib/tebako/cli_helpers.rb
CHANGED
@@ -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
|
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
|
54
|
-
"-DDEPS:STRING
|
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
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
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
|
-
|
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
|
-
"
|
90
|
+
when /msys|mingw|cygwin/
|
91
|
+
"MinGW Makefiles"
|
98
92
|
else
|
99
93
|
raise Tebako::Error.new(
|
100
|
-
"#{
|
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
|
-
|
113
|
-
|
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
|
-
|
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='#{
|
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-
|
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"' =>
|
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
|
-
|
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
|
86
|
-
|
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",
|
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
|