tebako 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/CMakeLists.txt +694 -0
- data/Gemfile +35 -0
- data/README.adoc +389 -0
- data/Rakefile +33 -0
- data/bin/console +15 -0
- data/bin/setup +8 -0
- data/cmake/copy_dir.cmake +29 -0
- data/cmake/def_tty_colours.cmake +19 -0
- data/common.env +6 -0
- data/exe/tebako +31 -0
- data/include/tebako/tebako-fs.h +40 -0
- data/include/tebako/tebako-main.h +40 -0
- data/lib/cli.rb +28 -0
- data/lib/tebako/cli.rb +137 -0
- data/lib/tebako/cli_helpers.rb +147 -0
- data/lib/tebako/error.rb +39 -0
- data/lib/tebako/packager/pass1.rb +155 -0
- data/lib/tebako/packager/pass2.rb +374 -0
- data/lib/tebako/packager.rb +210 -0
- data/lib/tebako/version.rb +30 -0
- data/resources/tebako-fs.cpp.in +37 -0
- data/resources/tebako-version.h.in +37 -0
- data/src/tebako-main.cpp +188 -0
- data/tebako.gemspec +63 -0
- data/tests/scripts/cross-tests.sh +34 -0
- data/tests/scripts/functional-tests.sh +335 -0
- data/tests/test-00/test.rb +4 -0
- data/tests/test-01/tebako-test-run.rb +5 -0
- data/tests/test-09/tebako-test-0.0.1.gem +0 -0
- data/tests/test-11/bin/tebako-test-run.rb +10 -0
- data/tests/test-11/lib/tebako-test.rb +20 -0
- data/tests/test-11/tebako-test.gemspec +15 -0
- data/tests/test-12/tebako-test-a.gemspec +15 -0
- data/tests/test-12/tebako-test-b.gemspec +15 -0
- data/tests/test-13/bin/tebako-test-run.rb +10 -0
- data/tests/test-13/lib/tebako-test.rb +20 -0
- data/tests/test-13/tebako-test.gemspec +15 -0
- data/tests/test-15/Gemfile +8 -0
- data/tests/test-15/Rakefile +4 -0
- data/tests/test-15/bin/tebako-test-run.rb +10 -0
- data/tests/test-15/lib/tebako/bundle/test/version.rb +9 -0
- data/tests/test-15/lib/tebako/bundle/test.rb +29 -0
- data/tests/test-15/tebako-bundle-test.gemspec +30 -0
- data/tests/test-16/Gemfile +8 -0
- data/tests/test-16/Rakefile +4 -0
- data/tests/test-16/bin/tebako-test-run.rb +10 -0
- data/tests/test-16/lib/tebako/bundle/test/version.rb +9 -0
- data/tests/test-16/lib/tebako/bundle/test.rb +29 -0
- data/tests/test-16/tebako-bundle-test.gemspec +24 -0
- data/tests/test-18/Gemfile +5 -0
- data/tests/test-18/tebako-test-run.rb +12 -0
- data/tests/test-19/Gemfile +6 -0
- data/tests/test-19/tebako-test-run.rb +11 -0
- data/tests-2/fixtures/gems-bundler/Gemfile +4 -0
- data/tests-2/fixtures/gems-bundler/gems-bundler.rb +34 -0
- data/tests-2/fixtures/gems-byebug/Gemfile +5 -0
- data/tests-2/fixtures/gems-byebug/gems-byebug.rb +31 -0
- data/tests-2/fixtures/gems-expressir/Gemfile +7 -0
- data/tests-2/fixtures/gems-expressir/gems-expressir.rb +33 -0
- data/tests-2/fixtures/gems-libmspack/Gemfile +5 -0
- data/tests-2/fixtures/gems-libmspack/gems-libmspack.rb +91 -0
- data/tests-2/fixtures/gems-sassc/Gemfile +6 -0
- data/tests-2/fixtures/gems-sassc/base_style/all.scss +1 -0
- data/tests-2/fixtures/gems-sassc/base_style/reset.scss +100 -0
- data/tests-2/fixtures/gems-sassc/gems-sassc.rb +129 -0
- data/tests-2/fixtures/gems-seven-zip/Gemfile +7 -0
- data/tests-2/fixtures/gems-seven-zip/gems-seven-zip.rb +53 -0
- data/tests-2/fixtures/launcher-coreincl/launcher-coreincl.rb +29 -0
- data/tests-2/fixtures/launcher-package/launcher-package.rb +29 -0
- data/tests-2/fixtures/launcher-pwd/launcher-pwd.rb +28 -0
- data/tests-2/fixtures/launcher-stdinredir/input.txt +1 -0
- data/tests-2/fixtures/launcher-stdinredir/launcher-stdinredir.rb +31 -0
- data/tests-2/fixtures/launcher-stdoutredir/launcher-stdoutredir.rb +28 -0
- data/tests-2/fixtures/patches-dir/level-1/level-2/file-1.txt +1 -0
- data/tests-2/fixtures/patches-dir/level-1/level-2/file-2.txt +1 -0
- data/tests-2/fixtures/patches-dir/level-1/level-2/file-3.txt +1 -0
- data/tests-2/fixtures/patches-dir/patches-dir.rb +154 -0
- data/tests-2/fixtures/patches-io-and-file/level-1/level-2/file-1.txt +1 -0
- data/tests-2/fixtures/patches-io-and-file/level-1/level-2/file-2.txt +2 -0
- data/tests-2/fixtures/patches-io-and-file/level-1/level-2/file-3.txt +1 -0
- data/tests-2/fixtures/patches-io-and-file/level-1/link-3 +1 -0
- data/tests-2/fixtures/patches-io-and-file/patches-io-and-file.rb +87 -0
- data/tests-2/fixtures/patches-main/patches-main.rb +6 -0
- data/tests-2/tebako-test.rb +312 -0
- metadata +170 -0
data/lib/tebako/cli.rb
ADDED
@@ -0,0 +1,137 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
# Copyright (c) 2021-2023 [Ribose Inc](https://www.ribose.com).
|
5
|
+
# All rights reserved.
|
6
|
+
# This file is a part of tebako
|
7
|
+
#
|
8
|
+
# Redistribution and use in source and binary forms, with or without
|
9
|
+
# modification, are permitted provided that the following conditions
|
10
|
+
# are met:
|
11
|
+
# 1. Redistributions of source code must retain the above copyright
|
12
|
+
# notice, this list of conditions and the following disclaimer.
|
13
|
+
# 2. Redistributions in binary form must reproduce the above copyright
|
14
|
+
# notice, this list of conditions and the following disclaimer in the
|
15
|
+
# documentation and/or other materials provided with the distribution.
|
16
|
+
#
|
17
|
+
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
18
|
+
# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
19
|
+
# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
20
|
+
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS
|
21
|
+
# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
22
|
+
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
23
|
+
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
24
|
+
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
25
|
+
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
26
|
+
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
27
|
+
# POSSIBILITY OF SUCH DAMAGE.
|
28
|
+
|
29
|
+
require "fileutils"
|
30
|
+
require "thor"
|
31
|
+
require "yaml"
|
32
|
+
|
33
|
+
require_relative "cli_helpers"
|
34
|
+
require_relative "error"
|
35
|
+
require_relative "version"
|
36
|
+
|
37
|
+
# Tebako - an executable packager
|
38
|
+
# Implementation of tebako command-line interface
|
39
|
+
module Tebako
|
40
|
+
OPTIONS_FILE = ".tebako.yml"
|
41
|
+
# Tebako packager front-end
|
42
|
+
class TebakoCli < Thor
|
43
|
+
package_name "Tebako"
|
44
|
+
class_option :prefix, type: :string, aliases: "-p", required: false,
|
45
|
+
desc: "A path to tebako packaging environment, '~/.tebako' ('$HOME/.tebako') by default"
|
46
|
+
|
47
|
+
desc "clean", "Clean tebako packaging environment"
|
48
|
+
def clean
|
49
|
+
puts "Cleaning tebako packaging environment"
|
50
|
+
FileUtils.rm_rf([deps, output], secure: true)
|
51
|
+
end
|
52
|
+
|
53
|
+
desc "press", "Press tebako image"
|
54
|
+
method_option :"entry-point", type: :string, aliases: ["-e", "--entry"], required: true,
|
55
|
+
desc: "Ruby application entry point"
|
56
|
+
method_option :"log-level", type: :string, aliases: "-l", required: false, enum: %w[error warn debug trace],
|
57
|
+
desc: "Tebako memfs logging level, 'error' by default"
|
58
|
+
method_option :output, type: :string, aliases: "-o", required: false,
|
59
|
+
desc: "Tebako package file name, entry point base file name in the current folder by default"
|
60
|
+
method_option :root, type: :string, aliases: "-r", required: true, desc: "Root folder of the Ruby application"
|
61
|
+
method_option :Ruby, type: :string, aliases: "-R", required: false,
|
62
|
+
enum: Tebako::CliHelpers::RUBY_VERSIONS.keys,
|
63
|
+
desc: "Tebako package Ruby version, #{Tebako::CliHelpers::DEFAULT_RUBY_VERSION} by default"
|
64
|
+
def press
|
65
|
+
puts press_announce
|
66
|
+
do_press
|
67
|
+
rescue TebakoError => e
|
68
|
+
puts "Tebako script failed: #{e.message} [#{e.error_code}]"
|
69
|
+
exit e.error_code
|
70
|
+
end
|
71
|
+
|
72
|
+
desc "setup", "Set up tebako packaging environment"
|
73
|
+
method_option :Ruby, type: :string, aliases: "-R", required: false,
|
74
|
+
enum: Tebako::CliHelpers::RUBY_VERSIONS.keys,
|
75
|
+
desc: "Tebako package Ruby version, #{Tebako::CliHelpers::DEFAULT_RUBY_VERSION} by default"
|
76
|
+
def setup
|
77
|
+
puts "Setting up tebako packaging environment"
|
78
|
+
do_setup
|
79
|
+
rescue TebakoError => e
|
80
|
+
puts "Tebako script failed: #{e.message} [#{e.error_code}]"
|
81
|
+
exit e.error_code
|
82
|
+
end
|
83
|
+
|
84
|
+
def self.exit_on_failure?
|
85
|
+
true
|
86
|
+
end
|
87
|
+
|
88
|
+
no_commands do
|
89
|
+
def options
|
90
|
+
original_options = super
|
91
|
+
|
92
|
+
return original_options unless File.exist?(OPTIONS_FILE)
|
93
|
+
|
94
|
+
defaults = ::YAML.load_file(OPTIONS_FILE) || {}
|
95
|
+
puts defaults.merge(original_options)
|
96
|
+
Thor::CoreExt::HashWithIndifferentAccess.new(defaults.merge(original_options))
|
97
|
+
end
|
98
|
+
|
99
|
+
def generate
|
100
|
+
FileUtils.mkdir_p(prefix)
|
101
|
+
File.write(File.join(prefix, "version.txt"), "#{Tebako::VERSION}\n")
|
102
|
+
puts("all: ")
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
private
|
107
|
+
|
108
|
+
no_commands do
|
109
|
+
def do_press
|
110
|
+
packaging_error(103) unless system(b_env, "cmake -DSETUP_MODE:BOOLEAN=OFF #{cfg_options} #{press_options}")
|
111
|
+
packaging_error(104) unless system(b_env,
|
112
|
+
"cmake --build #{output} --target tebako --parallel #{Etc.nprocessors}")
|
113
|
+
end
|
114
|
+
|
115
|
+
def do_setup
|
116
|
+
FileUtils.mkdir_p(prefix)
|
117
|
+
File.write(File.join(prefix, "version.txt"), "#{Tebako::VERSION}\n")
|
118
|
+
packaging_error(101) unless system(b_env, "cmake -DSETUP_MODE:BOOLEAN=ON #{cfg_options}")
|
119
|
+
packaging_error(102) unless system(b_env,
|
120
|
+
"cmake --build #{output} --target setup --parallel #{Etc.nprocessors}")
|
121
|
+
end
|
122
|
+
|
123
|
+
def press_announce
|
124
|
+
@press_announce ||= <<~ANN
|
125
|
+
Running tebako press at #{prefix}
|
126
|
+
Ruby version: '#{extend_ruby_version[0]}'
|
127
|
+
Project root: '#{options["root"]}'
|
128
|
+
Application entry point: '#{options["entry-point"]}'
|
129
|
+
Package file name: '#{package}'
|
130
|
+
Loging level: '#{l_level}'
|
131
|
+
ANN
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
include Tebako::CliHelpers
|
136
|
+
end
|
137
|
+
end
|
@@ -0,0 +1,147 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Copyright (c) 2023 [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 "etc"
|
29
|
+
require "fileutils"
|
30
|
+
require "pathname"
|
31
|
+
require "rbconfig"
|
32
|
+
|
33
|
+
require_relative "error"
|
34
|
+
require_relative "version"
|
35
|
+
|
36
|
+
# Tebako - an executable packager
|
37
|
+
# Command-line interface methods
|
38
|
+
module Tebako
|
39
|
+
# TebakoCli methods
|
40
|
+
module CliHelpers
|
41
|
+
def b_env
|
42
|
+
u_flags = if RbConfig::CONFIG["host_os"] =~ /darwin/
|
43
|
+
"-DTARGET_OS_SIMULATOR=0 -DTARGET_OS_IPHONE=0 #{ENV.fetch("CXXFLAGS", nil)}"
|
44
|
+
else
|
45
|
+
ENV.fetch("CXXFLAGS", nil)
|
46
|
+
end
|
47
|
+
# cc = ENV.fetch("CC", "gcc")
|
48
|
+
# cxx = ENV.fetch("CXX", "g++")
|
49
|
+
@b_env ||= { "CXXFLAGS" => u_flags }
|
50
|
+
end
|
51
|
+
|
52
|
+
def cfg_options
|
53
|
+
ruby_ver, ruby_hash = extend_ruby_version
|
54
|
+
@cfg_options ||=
|
55
|
+
"-DCMAKE_BUILD_TYPE=Release -DRUBY_VER:STRING='#{ruby_ver}' -DRUBY_HASH:STRING='#{ruby_hash}' " \
|
56
|
+
"-DDEPS:STRING='#{deps}' -G '#{m_files}' -B '#{output}' -S '#{source}'"
|
57
|
+
end
|
58
|
+
|
59
|
+
def deps
|
60
|
+
@deps ||= File.join(prefix, "deps")
|
61
|
+
end
|
62
|
+
|
63
|
+
RUBY_VERSIONS = {
|
64
|
+
"2.7.7" => "e10127db691d7ff36402cfe88f418c8d025a3f1eea92044b162dd72f0b8c7b90",
|
65
|
+
"3.0.6" => "6e6cbd490030d7910c0ff20edefab4294dfcd1046f0f8f47f78b597987ac683e",
|
66
|
+
"3.1.4" => "a3d55879a0dfab1d7141fdf10d22a07dbf8e5cdc4415da1bde06127d5cc3c7b6"
|
67
|
+
# "3.2.2" => "96c57558871a6748de5bc9f274e93f4b5aad06cd8f37befa0e8d94e7b8a423bc"
|
68
|
+
}.freeze
|
69
|
+
|
70
|
+
DEFAULT_RUBY_VERSION = "3.0.6"
|
71
|
+
|
72
|
+
def extend_ruby_version
|
73
|
+
version = options["Ruby"].nil? ? DEFAULT_RUBY_VERSION : options["Ruby"]
|
74
|
+
unless RUBY_VERSIONS.key?(version)
|
75
|
+
raise TebakoError.new "Ruby version #{version} is not supported yet, exiting",
|
76
|
+
253
|
77
|
+
end
|
78
|
+
|
79
|
+
@extend_ruby_version ||= [version, RUBY_VERSIONS[version]]
|
80
|
+
end
|
81
|
+
|
82
|
+
def l_level
|
83
|
+
@l_level ||= if options["log-level"].nil?
|
84
|
+
"error"
|
85
|
+
else
|
86
|
+
options["log-level"]
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
def m_files
|
91
|
+
@m_files ||= case RbConfig::CONFIG["host_os"]
|
92
|
+
when /linux/, /darwin/
|
93
|
+
"Unix Makefiles"
|
94
|
+
when /msys/
|
95
|
+
"Ninja"
|
96
|
+
else
|
97
|
+
raise TebakoError.new "#{RbConfig::CONFIG["host_os"]} is not supported yet, exiting", 254
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
def output
|
102
|
+
@output ||= File.join(prefix, "output")
|
103
|
+
end
|
104
|
+
|
105
|
+
def package
|
106
|
+
@package ||= if options["output"].nil?
|
107
|
+
File.join(Dir.pwd, File.basename(options["entry-point"], ".*"))
|
108
|
+
else
|
109
|
+
options["output"]
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
PACKAGING_ERRORS = {
|
114
|
+
101 => "'tebako setup' configure step failed",
|
115
|
+
102 => "'tebako setup' build step failed",
|
116
|
+
103 => "'tebako press' configure step failed",
|
117
|
+
104 => "'tebako press' build step failed"
|
118
|
+
}.freeze
|
119
|
+
|
120
|
+
def packaging_error(code)
|
121
|
+
msg = PACKAGING_ERRORS[code]
|
122
|
+
msg = "Unknown packaging error" if msg.nil?
|
123
|
+
raise TebakoError.new msg, code
|
124
|
+
end
|
125
|
+
|
126
|
+
def prefix
|
127
|
+
@prefix ||= if options["prefix"].nil?
|
128
|
+
File.expand_path("~/.tebako")
|
129
|
+
elsif options["prefix"] == "PWD"
|
130
|
+
Dir.pwd
|
131
|
+
else
|
132
|
+
File.expand_path(options["prefix"])
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
def press_options
|
137
|
+
@press_options ||=
|
138
|
+
"-DROOT:STRING='#{options["root"]}' -DENTRANCE:STRING='#{options["entry-point"]}' " \
|
139
|
+
"-DPCKG:STRING='#{package}' -DLOG_LEVEL:STRING='#{options["log-level"]}'"
|
140
|
+
end
|
141
|
+
|
142
|
+
def source
|
143
|
+
c_path = Pathname.new(__FILE__).realpath
|
144
|
+
@source ||= File.expand_path("../../..", c_path)
|
145
|
+
end
|
146
|
+
end
|
147
|
+
end
|
data/lib/tebako/error.rb
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Copyright (c) 2023 [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
|
+
# Tebako - an executable packager
|
29
|
+
# Tebako error class
|
30
|
+
module Tebako
|
31
|
+
# Tebako error class
|
32
|
+
class TebakoError < StandardError
|
33
|
+
def initialize(msg = "Unspecified error", code = 255)
|
34
|
+
@error_code = code
|
35
|
+
super(msg)
|
36
|
+
end
|
37
|
+
attr_accessor :error_code
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,155 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Copyright (c) 2021-2023 [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
|
+
# Tebako - an executable packager
|
29
|
+
module Tebako
|
30
|
+
# Ruby patching definitions (pass1)
|
31
|
+
module Pass1
|
32
|
+
TOOL_RBINSTALL_RB_PATCH = {
|
33
|
+
" next if files.empty?" => "# tebako patched next if files.empty?"
|
34
|
+
}.freeze
|
35
|
+
|
36
|
+
RUBYGEM_OPENSSL_RB_PATCH = {
|
37
|
+
'autoload :OpenSSL, "openssl"' => "require \"openssl\"\nautoload :OpenSSL, \"openssl\""
|
38
|
+
}.freeze
|
39
|
+
|
40
|
+
EXT_SETUP_PATCH = {
|
41
|
+
"#option nodynamic" => "option nodynamic"
|
42
|
+
}.freeze
|
43
|
+
|
44
|
+
EXT_BIGDECIMAL_BIGDECIMAL_H_PATCH = {
|
45
|
+
"#include \"ruby/ruby.h\"" => <<~SUBST
|
46
|
+
#include "ruby/ruby.h"
|
47
|
+
|
48
|
+
/* -- Start of tebako patch -- */
|
49
|
+
#ifndef HAVE_RB_SYM2STR
|
50
|
+
#define HAVE_RB_SYM2STR 1
|
51
|
+
#endif
|
52
|
+
|
53
|
+
#ifndef HAVE_RB_ARRAY_CONST_PTR
|
54
|
+
#define HAVE_RB_ARRAY_CONST_PTR 1
|
55
|
+
#endif
|
56
|
+
|
57
|
+
#ifndef HAVE_RB_RATIONAL_NUM
|
58
|
+
#define HAVE_RB_RATIONAL_NUM 1
|
59
|
+
#endif
|
60
|
+
|
61
|
+
#ifndef HAVE_RB_RATIONAL_DEN
|
62
|
+
#define HAVE_RB_RATIONAL_DEN 1
|
63
|
+
#endif
|
64
|
+
|
65
|
+
#ifndef HAVE_RB_COMPLEX_REAL
|
66
|
+
#define HAVE_RB_COMPLEX_REAL
|
67
|
+
#endif
|
68
|
+
|
69
|
+
#ifndef HAVE_RB_COMPLEX_IMAG
|
70
|
+
#define HAVE_RB_COMPLEX_IMAG
|
71
|
+
#endif
|
72
|
+
/* -- End of tebako patch -- */
|
73
|
+
|
74
|
+
SUBST
|
75
|
+
}.freeze
|
76
|
+
|
77
|
+
CONFIGURE_PATCH = {
|
78
|
+
"EXTDLDFLAGS=\"-bundle_loader '\\$(BUILTRUBY)'\"" => ""
|
79
|
+
}.freeze
|
80
|
+
|
81
|
+
class << self
|
82
|
+
def get_patch_map(ostype, mount_point, ruby_ver)
|
83
|
+
patch_map = {
|
84
|
+
# ....................................................
|
85
|
+
# It won't install gems with no files defined in spec
|
86
|
+
# However if
|
87
|
+
# -- we are installing a default gem from extension
|
88
|
+
# -- extension is build statically
|
89
|
+
# there may be no files install in addition to spec
|
90
|
+
# Example: io/wait extension (and others)
|
91
|
+
"tool/rbinstall.rb" => TOOL_RBINSTALL_RB_PATCH,
|
92
|
+
|
93
|
+
# ....................................................
|
94
|
+
# This is something that I cannnot explain
|
95
|
+
# (this patch does not seem related to static compilation)
|
96
|
+
"ext/bigdecimal/bigdecimal.h" => EXT_BIGDECIMAL_BIGDECIMAL_H_PATCH,
|
97
|
+
|
98
|
+
# ....................................................
|
99
|
+
# Allow only packaged gems (from within memfs)
|
100
|
+
"lib/rubygems/path_support.rb" => rubygems_path_support_patch(mount_point),
|
101
|
+
|
102
|
+
# ....................................................
|
103
|
+
# Disable dynamic extensions
|
104
|
+
"ext/Setup" => EXT_SETUP_PATCH
|
105
|
+
}
|
106
|
+
# ....................................................
|
107
|
+
# Fixing (bypassing) configure script bug where a variable is used before initialization
|
108
|
+
patch_map.store("configure", CONFIGURE_PATCH) if ostype =~ /darwin/
|
109
|
+
|
110
|
+
# ....................................................
|
111
|
+
# autoload :OpenSSL, "openssl"
|
112
|
+
# fails to deal with a default gem from statically linked extension
|
113
|
+
patch_map.store("lib/rubygems/openssl.rb", RUBYGEM_OPENSSL_RB_PATCH) if ruby_ver[0] == "3"
|
114
|
+
|
115
|
+
patch_map
|
116
|
+
end
|
117
|
+
|
118
|
+
private
|
119
|
+
|
120
|
+
def rubygems_path_support_patch_one(mount_point)
|
121
|
+
<<~SUBST
|
122
|
+
@home = env["GEM_HOME"] || Gem.default_dir
|
123
|
+
# -- Start of tebako patch --
|
124
|
+
unless env["TEBAKO_PASS_THROUGH"]
|
125
|
+
@home = Gem.default_dir unless @home.index("#{mount_point}") == 0
|
126
|
+
end
|
127
|
+
# -- End of tebako patch --
|
128
|
+
|
129
|
+
SUBST
|
130
|
+
end
|
131
|
+
|
132
|
+
def rubygems_path_support_patch_two(mount_point)
|
133
|
+
<<~SUBST
|
134
|
+
|
135
|
+
@path = split_gem_path env["GEM_PATH"], @home
|
136
|
+
# -- Start of tebako patch --
|
137
|
+
unless env["TEBAKO_PASS_THROUGH"]
|
138
|
+
@path.keep_if do |xpath|
|
139
|
+
xpath.index("#{mount_point}") == 0
|
140
|
+
end
|
141
|
+
end
|
142
|
+
# -- End of tebako patch --
|
143
|
+
|
144
|
+
SUBST
|
145
|
+
end
|
146
|
+
|
147
|
+
def rubygems_path_support_patch(mount_point)
|
148
|
+
{
|
149
|
+
' @home = env["GEM_HOME"] || Gem.default_dir' => rubygems_path_support_patch_one(mount_point),
|
150
|
+
' @path = split_gem_path env["GEM_PATH"], @home' => rubygems_path_support_patch_two(mount_point)
|
151
|
+
}
|
152
|
+
end
|
153
|
+
end
|
154
|
+
end
|
155
|
+
end
|