tebako 0.10.0 → 0.11.0
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 +4 -4
- data/CMakeLists.txt +5 -15
- data/README.adoc +237 -75
- data/common.env +1 -1
- data/lib/tebako/cli.rb +34 -11
- data/lib/tebako/cli_helpers.rb +25 -9
- data/lib/tebako/codegen.rb +95 -10
- data/lib/tebako/deploy_helper.rb +1 -1
- data/lib/tebako/options_manager.rb +89 -12
- data/lib/tebako/package_descriptor.rb +143 -0
- data/lib/tebako/packager.rb +12 -18
- data/lib/tebako/packager_lite.rb +78 -0
- data/lib/tebako/scenario_manager.rb +1 -1
- data/lib/tebako/version.rb +1 -1
- data/src/tebako-main.cpp +46 -30
- metadata +4 -2
data/lib/tebako/cli_helpers.rb
CHANGED
@@ -34,6 +34,7 @@ require_relative "codegen"
|
|
34
34
|
require_relative "error"
|
35
35
|
require_relative "options_manager"
|
36
36
|
require_relative "scenario_manager"
|
37
|
+
require_relative "packager_lite"
|
37
38
|
|
38
39
|
# Tebako - an executable packager
|
39
40
|
# Command-line interface methods
|
@@ -41,10 +42,27 @@ module Tebako
|
|
41
42
|
# Cli helpers
|
42
43
|
module CliHelpers
|
43
44
|
def do_press(options_manager)
|
44
|
-
|
45
|
+
scenario_manager = Tebako::ScenarioManager.new(options_manager.root, options_manager.fs_entrance)
|
46
|
+
puts options_manager.press_announce(scenario_manager.msys?)
|
47
|
+
|
48
|
+
if options_manager.mode == "both" || options_manager.mode == "runtime" || options_manager.mode == "bundle"
|
49
|
+
do_press_runtime(options_manager, scenario_manager)
|
50
|
+
end
|
51
|
+
|
52
|
+
if options_manager.mode == "both" || options_manager.mode == "application"
|
53
|
+
do_press_application(options_manager, scenario_manager)
|
54
|
+
end
|
55
|
+
|
56
|
+
true
|
57
|
+
end
|
45
58
|
|
46
|
-
|
59
|
+
def do_press_application(options_manager, scenario_manager)
|
60
|
+
packager = Tebako::PackagerLite.new(options_manager, scenario_manager)
|
61
|
+
packager.create_package
|
62
|
+
end
|
47
63
|
|
64
|
+
def do_press_runtime(options_manager, scenario_manager)
|
65
|
+
generate_files(options_manager, scenario_manager)
|
48
66
|
cfg_cmd = "cmake -DSETUP_MODE:BOOLEAN=OFF #{options_manager.cfg_options} #{options_manager.press_options}"
|
49
67
|
build_cmd = "cmake --build #{options_manager.output_folder} --target tebako --parallel #{Etc.nprocessors}"
|
50
68
|
merged_env = ENV.to_h.merge(options_manager.b_env)
|
@@ -64,20 +82,18 @@ module Tebako
|
|
64
82
|
true
|
65
83
|
end
|
66
84
|
|
67
|
-
def generate_files(options_manager)
|
85
|
+
def generate_files(options_manager, scenario_manager)
|
68
86
|
puts "-- Generating files"
|
69
|
-
scenario_manager = Tebako::ScenarioManager.new(options_manager.root, options_manager.fs_entrance)
|
70
87
|
scenario_manager.configure_scenario
|
71
88
|
|
72
|
-
puts " ... tebako-version.h"
|
73
89
|
v_parts = Tebako::VERSION.split(".")
|
74
90
|
Tebako::Codegen.generate_tebako_version_h(options_manager, v_parts)
|
75
|
-
|
76
|
-
puts " ... tebako-fs.cpp"
|
77
91
|
Tebako::Codegen.generate_tebako_fs_cpp(options_manager, scenario_manager)
|
78
|
-
|
79
|
-
puts " ... deploy.rb"
|
80
92
|
Tebako::Codegen.generate_deploy_rb(options_manager, scenario_manager)
|
93
|
+
|
94
|
+
return unless options_manager.mode == "both" || options_manager.mode == "runtime"
|
95
|
+
|
96
|
+
Tebako::Codegen.generate_stub_rb(options_manager)
|
81
97
|
end
|
82
98
|
|
83
99
|
def options_from_tebafile(tebafile)
|
data/lib/tebako/codegen.rb
CHANGED
@@ -28,6 +28,8 @@
|
|
28
28
|
require "pathname"
|
29
29
|
require "fileutils"
|
30
30
|
|
31
|
+
require_relative "package_descriptor"
|
32
|
+
|
31
33
|
# Tebako - an executable packager
|
32
34
|
module Tebako
|
33
35
|
# Code geberation
|
@@ -47,20 +49,42 @@ module Tebako
|
|
47
49
|
|
48
50
|
SUBST
|
49
51
|
|
50
|
-
class << self
|
52
|
+
class << self # rubocop:disable Metrics/ClassLength
|
51
53
|
def deploy_crt_implib(opt, scm)
|
52
54
|
crt = ""
|
53
55
|
if scm.msys?
|
54
56
|
crt = <<~SUBST
|
55
57
|
Tebako::Packager.create_implib("#{opt.ruby_src_dir}", "#{opt.data_src_dir}",
|
56
|
-
"#{
|
58
|
+
"#{opt.package}", rv)
|
57
59
|
SUBST
|
58
60
|
end
|
59
61
|
crt
|
60
62
|
end
|
61
63
|
|
62
|
-
def
|
63
|
-
|
64
|
+
def deploy_mk(opt, scm)
|
65
|
+
case opt.mode
|
66
|
+
when "bundle"
|
67
|
+
deploy_mk_bundle(opt, scm)
|
68
|
+
when /runtime|both/
|
69
|
+
deploy_mk_stub(opt)
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
def deploy_mk_bundle(opt, scm)
|
74
|
+
<<~SUBST
|
75
|
+
Tebako::Packager.deploy("#{opt.data_src_dir}", "#{opt.data_pre_dir}",
|
76
|
+
rv , "#{opt.root}", "#{scm.fs_entrance}", "#{opt.cwd}")
|
77
|
+
Tebako::Packager.mkdwarfs("#{opt.deps_bin_dir}", "#{opt.data_bundle_file}",
|
78
|
+
"#{opt.data_src_dir}")
|
79
|
+
SUBST
|
80
|
+
end
|
81
|
+
|
82
|
+
def deploy_mk_stub(opt)
|
83
|
+
<<~SUBST
|
84
|
+
Tebako::Packager.deploy("#{opt.data_src_dir}", "#{opt.data_pre_dir}",
|
85
|
+
rv, "#{File.join(opt.deps, "src", "tebako", "local")}", "stub.rb", nil)
|
86
|
+
Tebako::Packager.mkdwarfs("#{opt.deps_bin_dir}", "#{opt.data_stub_file}", "#{opt.data_src_dir}")
|
87
|
+
SUBST
|
64
88
|
end
|
65
89
|
|
66
90
|
def deploy_rb(opt, scm)
|
@@ -71,22 +95,41 @@ module Tebako
|
|
71
95
|
Tebako::Packager::init("#{opt.stash_dir}", "#{opt.data_src_dir}",
|
72
96
|
"#{opt.data_pre_dir}", "#{opt.data_bin_dir}")
|
73
97
|
#{deploy_crt_implib(opt, scm)}
|
74
|
-
|
75
|
-
rv , "#{opt.root}",
|
76
|
-
"#{scm.fs_entrance}", #{deploy_cwd(opt)})
|
77
|
-
Tebako::Packager.mkdwarfs("#{opt.deps_bin_dir}", "#{opt.data_bin_file}",
|
78
|
-
"#{opt.data_src_dir}")
|
98
|
+
#{deploy_mk(opt, scm)}
|
79
99
|
SUBST
|
80
100
|
end
|
81
101
|
|
82
102
|
def deploy_rq
|
83
103
|
<<~SUBST
|
104
|
+
require "#{File.join(__dir__, "package_descriptor.rb")}"
|
84
105
|
require "#{File.join(__dir__, "packager.rb")}"
|
85
106
|
require "#{File.join(__dir__, "ruby_version.rb")}"
|
86
107
|
SUBST
|
87
108
|
end
|
88
109
|
|
110
|
+
def stub_rb(opt)
|
111
|
+
<<~SUBST
|
112
|
+
puts "Copyright (c) 2024 Ribose Inc (https://www.ribose.com)"
|
113
|
+
puts "Tebako runtime stub v#{Tebako::VERSION}"
|
114
|
+
puts "To run your application please call #{File.basename(opt.package)} --tebako-run <your tebako package>"
|
115
|
+
SUBST
|
116
|
+
end
|
117
|
+
|
118
|
+
def generate_stub_rb(options_manager)
|
119
|
+
puts " ... stub.rb"
|
120
|
+
|
121
|
+
fname = File.join(options_manager.deps, "src", "tebako", "local", "stub.rb")
|
122
|
+
FileUtils.mkdir_p(File.dirname(fname))
|
123
|
+
|
124
|
+
File.open(fname, "w") do |file|
|
125
|
+
file.write(COMMON_RUBY_HEADER)
|
126
|
+
file.write(stub_rb(options_manager))
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
89
130
|
def generate_deploy_rb(options_manager, scenario_manager)
|
131
|
+
puts " ... deploy.rb"
|
132
|
+
|
90
133
|
fname = File.join(options_manager.deps, "bin", "deploy.rb")
|
91
134
|
FileUtils.mkdir_p(File.dirname(fname))
|
92
135
|
|
@@ -96,7 +139,20 @@ module Tebako
|
|
96
139
|
end
|
97
140
|
end
|
98
141
|
|
142
|
+
def generate_package_descriptor(options_manager, scenario_manager)
|
143
|
+
puts " ... package_descriptor"
|
144
|
+
fname = File.join(options_manager.deps, "src", "tebako", "package_descriptor")
|
145
|
+
FileUtils.mkdir_p(File.dirname(fname))
|
146
|
+
descriptor = Tebako::PackageDescriptor.new(options_manager.ruby_ver, Tebako::VERSION,
|
147
|
+
scenario_manager.fs_mount_point, scenario_manager.fs_entry_point,
|
148
|
+
options_manager.cwd)
|
149
|
+
File.binwrite(fname, descriptor.serialize)
|
150
|
+
fname
|
151
|
+
end
|
152
|
+
|
99
153
|
def generate_tebako_fs_cpp(options_manager, scenario_manager)
|
154
|
+
puts " ... tebako-fs.cpp"
|
155
|
+
|
100
156
|
fname = File.join(options_manager.deps, "src", "tebako", "tebako-fs.cpp")
|
101
157
|
FileUtils.mkdir_p(File.dirname(fname))
|
102
158
|
|
@@ -107,6 +163,8 @@ module Tebako
|
|
107
163
|
end
|
108
164
|
|
109
165
|
def generate_tebako_version_h(options_manager, v_parts)
|
166
|
+
puts " ... tebako-version.h"
|
167
|
+
|
110
168
|
fname = File.join(options_manager.deps, "include", "tebako", "tebako-version.h")
|
111
169
|
FileUtils.mkdir_p(File.dirname(fname))
|
112
170
|
|
@@ -125,7 +183,17 @@ module Tebako
|
|
125
183
|
end
|
126
184
|
|
127
185
|
def tebako_fs_cpp(options_manager, scenario_manager)
|
186
|
+
case options_manager.mode
|
187
|
+
when "bundle"
|
188
|
+
tebako_fs_cpp_bundle(options_manager, scenario_manager)
|
189
|
+
when /runtime|both/
|
190
|
+
tebako_fs_cpp_stub(options_manager, scenario_manager)
|
191
|
+
end
|
192
|
+
end
|
193
|
+
|
194
|
+
def tebako_fs_cpp_bundle(options_manager, scenario_manager)
|
128
195
|
<<~SUBST
|
196
|
+
#include <limits.h>
|
129
197
|
#include <incbin/incbin.h>
|
130
198
|
|
131
199
|
namespace tebako {
|
@@ -135,7 +203,24 @@ module Tebako
|
|
135
203
|
const char * package_cwd = #{package_cwd(options_manager, scenario_manager)};
|
136
204
|
char original_cwd[PATH_MAX];
|
137
205
|
|
138
|
-
INCBIN(fs, "#{options_manager.
|
206
|
+
INCBIN(fs, "#{options_manager.data_bundle_file}");
|
207
|
+
}
|
208
|
+
SUBST
|
209
|
+
end
|
210
|
+
|
211
|
+
def tebako_fs_cpp_stub(options_manager, scenario_manager)
|
212
|
+
<<~SUBST
|
213
|
+
#include <limits.h>
|
214
|
+
#include <incbin/incbin.h>
|
215
|
+
|
216
|
+
namespace tebako {
|
217
|
+
const char * fs_log_level = "#{options_manager.l_level}";
|
218
|
+
const char * fs_mount_point = "#{scenario_manager.fs_mount_point}";
|
219
|
+
const char * fs_entry_point = "/local/stub.rb";
|
220
|
+
const char * package_cwd = nullptr;
|
221
|
+
char original_cwd[PATH_MAX];
|
222
|
+
|
223
|
+
INCBIN(fs, "#{options_manager.data_stub_file}");
|
139
224
|
}
|
140
225
|
SUBST
|
141
226
|
end
|
data/lib/tebako/deploy_helper.rb
CHANGED
@@ -70,7 +70,7 @@ module Tebako
|
|
70
70
|
def deploy
|
71
71
|
BuildHelpers.with_env(deploy_env) do
|
72
72
|
update_rubygems
|
73
|
-
system("#{gem_command} env")
|
73
|
+
system("#{gem_command} env") if @verbose
|
74
74
|
install_gem("tebako-runtime")
|
75
75
|
install_gem("bundler", BUNDLER_VERSION) if needs_bundler?
|
76
76
|
deploy_solution
|
@@ -73,16 +73,32 @@ module Tebako
|
|
73
73
|
@cwd ||= f_cwd
|
74
74
|
end
|
75
75
|
|
76
|
+
def cwd_announce
|
77
|
+
@cwd_announce ||= cwd.nil? ? "<Host current directory>" : cwd
|
78
|
+
end
|
79
|
+
|
76
80
|
# DATA_BIN_DIR folder is used to create packaged filesystem
|
77
81
|
# set(DATA_BIN_DIR ${CMAKE_CURRENT_BINARY_DIR}/p)
|
78
82
|
def data_bin_dir
|
79
83
|
@data_bin_dir ||= File.join(output_folder, "p")
|
80
84
|
end
|
81
85
|
|
82
|
-
#
|
83
|
-
#
|
84
|
-
|
85
|
-
|
86
|
+
# Mode File(s) Content
|
87
|
+
# bundle fs.bin Application
|
88
|
+
# both fs.bin, fs2.bin Stub, application respectively
|
89
|
+
# runtime fs.bin Stub
|
90
|
+
# app fs2.bin Application
|
91
|
+
|
92
|
+
def data_bundle_file
|
93
|
+
@data_bundle_file ||= File.join(data_bin_dir, "fs.bin")
|
94
|
+
end
|
95
|
+
|
96
|
+
def data_stub_file
|
97
|
+
@data_stub_file ||= File.join(data_bin_dir, "fs.bin")
|
98
|
+
end
|
99
|
+
|
100
|
+
def data_app_file
|
101
|
+
@data_app_file ||= File.join(data_bin_dir, "fs2.bin")
|
86
102
|
end
|
87
103
|
|
88
104
|
# DATA_PRE_DIR folder is used to build gems that need to be packaged
|
@@ -131,11 +147,11 @@ module Tebako
|
|
131
147
|
end
|
132
148
|
|
133
149
|
def l_level
|
134
|
-
@l_level ||=
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
150
|
+
@l_level ||= @options["log-level"].nil? ? "error" : @options["log-level"]
|
151
|
+
end
|
152
|
+
|
153
|
+
def mode
|
154
|
+
@mode ||= @options["mode"].nil? ? "bundle" : @options["mode"]
|
139
155
|
end
|
140
156
|
|
141
157
|
def m_files
|
@@ -179,10 +195,57 @@ module Tebako
|
|
179
195
|
end
|
180
196
|
end
|
181
197
|
|
182
|
-
def press_announce
|
183
|
-
|
184
|
-
|
198
|
+
def press_announce(is_msys)
|
199
|
+
case mode
|
200
|
+
when "application"
|
201
|
+
press_announce_application(is_msys)
|
202
|
+
when "both"
|
203
|
+
press_announce_both
|
204
|
+
when "bundle"
|
205
|
+
press_announce_bundle
|
206
|
+
when "runtime"
|
207
|
+
press_announce_runtime
|
208
|
+
end
|
209
|
+
end
|
210
|
+
|
211
|
+
def press_announce_ref(is_msys)
|
212
|
+
if is_msys
|
213
|
+
" referencing runtime at '#{ref}'"
|
214
|
+
else
|
215
|
+
""
|
216
|
+
end
|
217
|
+
end
|
218
|
+
|
219
|
+
def press_announce_application(is_msys)
|
220
|
+
<<~ANN
|
185
221
|
Running tebako press at #{prefix}
|
222
|
+
Mode: 'application'
|
223
|
+
Ruby version: '#{@ruby_ver}'
|
224
|
+
Project root: '#{root}'
|
225
|
+
Application entry point: '#{fs_entrance}'
|
226
|
+
Package file name: '#{package}.tebako'#{press_announce_ref(is_msys)}
|
227
|
+
Package working directory: '#{cwd_announce}'
|
228
|
+
ANN
|
229
|
+
end
|
230
|
+
|
231
|
+
def press_announce_both
|
232
|
+
<<~ANN
|
233
|
+
Running tebako press at #{prefix}
|
234
|
+
Mode: 'both'
|
235
|
+
Ruby version: '#{@ruby_ver}'
|
236
|
+
Project root: '#{root}'
|
237
|
+
Application entry point: '#{fs_entrance}'
|
238
|
+
Runtime file name: '#{package}'
|
239
|
+
Package file name: '#{package}.tebako'
|
240
|
+
Loging level: '#{l_level}'
|
241
|
+
Package working directory: '#{cwd_announce}'
|
242
|
+
ANN
|
243
|
+
end
|
244
|
+
|
245
|
+
def press_announce_bundle
|
246
|
+
<<~ANN
|
247
|
+
Running tebako press at #{prefix}
|
248
|
+
Mode: 'bundle'
|
186
249
|
Ruby version: '#{@ruby_ver}'
|
187
250
|
Project root: '#{root}'
|
188
251
|
Application entry point: '#{fs_entrance}'
|
@@ -192,6 +255,16 @@ module Tebako
|
|
192
255
|
ANN
|
193
256
|
end
|
194
257
|
|
258
|
+
def press_announce_runtime
|
259
|
+
<<~ANN
|
260
|
+
Running tebako press at #{prefix}
|
261
|
+
Mode: 'runtime'
|
262
|
+
Ruby version: '#{@ruby_ver}'
|
263
|
+
Runtime file name: '#{package}'
|
264
|
+
Loging level: '#{l_level}'
|
265
|
+
ANN
|
266
|
+
end
|
267
|
+
|
195
268
|
def press_options
|
196
269
|
@press_options ||= "-DPCKG:STRING='#{package}' -DLOG_LEVEL:STRING='#{l_level}' " \
|
197
270
|
end
|
@@ -200,6 +273,10 @@ module Tebako
|
|
200
273
|
Pathname.new(path).relative?
|
201
274
|
end
|
202
275
|
|
276
|
+
def ref
|
277
|
+
@ref ||= @options["ref"].nil? ? "tebako-runtime" : @options["ref"].gsub("\\", "/")
|
278
|
+
end
|
279
|
+
|
203
280
|
def remove_glibc_private
|
204
281
|
@remove_glibc_private ||= if RUBY_PLATFORM.end_with?("linux") || RUBY_PLATFORM.end_with?("linux-gnu")
|
205
282
|
"-DREMOVE_GLIBC_PRIVATE=#{@options["patchelf"] ? "ON" : "OFF"}"
|
@@ -0,0 +1,143 @@
|
|
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 "stringio"
|
29
|
+
|
30
|
+
module Tebako
|
31
|
+
# Tebako application package descriptor
|
32
|
+
class PackageDescriptor
|
33
|
+
SIGNATURE = "TAMATEBAKO"
|
34
|
+
|
35
|
+
attr_reader :ruby_version_major, :ruby_version_minor, :ruby_version_patch, :tebako_version_major,
|
36
|
+
:tebako_version_minor, :tebako_version_patch, :mount_point, :entry_point, :cwd
|
37
|
+
|
38
|
+
def initialize(*args)
|
39
|
+
if args.size == 1 && args[0].is_a?(Array)
|
40
|
+
deserialize(args[0])
|
41
|
+
elsif args.size == 5
|
42
|
+
construct_from_params(*args)
|
43
|
+
else
|
44
|
+
raise ArgumentError, "Invalid arguments"
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def serialize
|
49
|
+
buffer = StringIO.new
|
50
|
+
|
51
|
+
buffer.write(SIGNATURE)
|
52
|
+
serialize_versions(buffer)
|
53
|
+
|
54
|
+
write_string(buffer, @mount_point)
|
55
|
+
write_string(buffer, @entry_point)
|
56
|
+
|
57
|
+
serialize_cwd(buffer)
|
58
|
+
buffer.string
|
59
|
+
end
|
60
|
+
|
61
|
+
private
|
62
|
+
|
63
|
+
def deserialize(buffer)
|
64
|
+
stream = StringIO.new(buffer.pack("C*"))
|
65
|
+
|
66
|
+
signature = stream.read(SIGNATURE.size)
|
67
|
+
raise ArgumentError, "Invalid or missing signature" if signature != SIGNATURE
|
68
|
+
|
69
|
+
deserialize_versions(stream)
|
70
|
+
@mount_point = read_string(stream)
|
71
|
+
@entry_point = read_string(stream)
|
72
|
+
|
73
|
+
cwd_present = stream.read(1).unpack1("C")
|
74
|
+
@cwd = cwd_present == 1 ? read_string(stream) : nil
|
75
|
+
end
|
76
|
+
|
77
|
+
def construct_from_params(ruby_version, tebako_version, mount_point, entry_point, cwd)
|
78
|
+
parse_version(ruby_version, :@ruby_version_major, :@ruby_version_minor, :@ruby_version_patch)
|
79
|
+
parse_version(tebako_version, :@tebako_version_major, :@tebako_version_minor, :@tebako_version_patch)
|
80
|
+
|
81
|
+
@mount_point = mount_point
|
82
|
+
@entry_point = entry_point
|
83
|
+
@cwd = cwd
|
84
|
+
end
|
85
|
+
|
86
|
+
def deserialize_versions(stream)
|
87
|
+
@ruby_version_major = read_uint16(stream)
|
88
|
+
@ruby_version_minor = read_uint16(stream)
|
89
|
+
@ruby_version_patch = read_uint16(stream)
|
90
|
+
@tebako_version_major = read_uint16(stream)
|
91
|
+
@tebako_version_minor = read_uint16(stream)
|
92
|
+
@tebako_version_patch = read_uint16(stream)
|
93
|
+
end
|
94
|
+
|
95
|
+
def parse_version(version, major_sym, minor_sym, patch_sym)
|
96
|
+
major, minor, patch = version.split(".").map(&:to_i)
|
97
|
+
raise ArgumentError, "Invalid version format" unless major && minor && patch
|
98
|
+
|
99
|
+
instance_variable_set(major_sym, major)
|
100
|
+
instance_variable_set(minor_sym, minor)
|
101
|
+
instance_variable_set(patch_sym, patch)
|
102
|
+
end
|
103
|
+
|
104
|
+
def write_uint16(buffer, value)
|
105
|
+
buffer.write([value].pack("v"))
|
106
|
+
end
|
107
|
+
|
108
|
+
def read_uint16(stream)
|
109
|
+
data = stream.read(2)
|
110
|
+
raise ArgumentError, "Unexpected end of stream" if data.nil?
|
111
|
+
|
112
|
+
data.unpack1("v")
|
113
|
+
end
|
114
|
+
|
115
|
+
def serialize_cwd(buffer)
|
116
|
+
if @cwd
|
117
|
+
buffer.write([1].pack("C"))
|
118
|
+
write_string(buffer, @cwd)
|
119
|
+
else
|
120
|
+
buffer.write([0].pack("C"))
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
def serialize_versions(buffer)
|
125
|
+
write_uint16(buffer, @ruby_version_major)
|
126
|
+
write_uint16(buffer, @ruby_version_minor)
|
127
|
+
write_uint16(buffer, @ruby_version_patch)
|
128
|
+
write_uint16(buffer, @tebako_version_major)
|
129
|
+
write_uint16(buffer, @tebako_version_minor)
|
130
|
+
write_uint16(buffer, @tebako_version_patch)
|
131
|
+
end
|
132
|
+
|
133
|
+
def write_string(buffer, str)
|
134
|
+
write_uint16(buffer, str.size)
|
135
|
+
buffer.write(str)
|
136
|
+
end
|
137
|
+
|
138
|
+
def read_string(stream)
|
139
|
+
size = read_uint16(stream)
|
140
|
+
stream.read(size)
|
141
|
+
end
|
142
|
+
end
|
143
|
+
end
|
data/lib/tebako/packager.rb
CHANGED
@@ -67,9 +67,10 @@ module Tebako
|
|
67
67
|
class << self
|
68
68
|
# Create implib
|
69
69
|
def create_implib(src_dir, package_src_dir, app_name, ruby_ver)
|
70
|
-
|
70
|
+
a_name = File.basename(app_name, ".*")
|
71
|
+
create_def(src_dir, a_name)
|
71
72
|
puts " ... creating Windows import library"
|
72
|
-
params = ["dlltool", "-d", def_fname(src_dir,
|
73
|
+
params = ["dlltool", "-d", def_fname(src_dir, a_name), "-D", out_fname(a_name), "--output-lib",
|
73
74
|
lib_fname(package_src_dir, ruby_ver)]
|
74
75
|
BuildHelpers.run_with_capture(params)
|
75
76
|
end
|
@@ -85,13 +86,12 @@ module Tebako
|
|
85
86
|
end
|
86
87
|
|
87
88
|
def finalize(os_type, src_dir, app_name, ruby_ver, patchelf)
|
89
|
+
puts "-- Running finalize script"
|
90
|
+
|
88
91
|
RubyBuilder.new(ruby_ver, src_dir).final_build
|
89
92
|
exe_suffix = Packager::PatchHelpers.exe_suffix(os_type)
|
90
93
|
src_name = File.join(src_dir, "ruby#{exe_suffix}")
|
91
|
-
|
92
|
-
params = [patchelf, "--remove-needed-version", "libpthread.so.0", "GLIBC_PRIVATE", src_name]
|
93
|
-
BuildHelpers.run_with_capture(params)
|
94
|
-
end
|
94
|
+
patchelf(src_name, patchelf)
|
95
95
|
package_name = "#{app_name}#{exe_suffix}"
|
96
96
|
strip_or_copy(os_type, src_name, package_name)
|
97
97
|
puts "Created tebako package at \"#{package_name}\""
|
@@ -106,9 +106,10 @@ module Tebako
|
|
106
106
|
FileUtils.cp_r "#{stash_dir}/.", src_dir
|
107
107
|
end
|
108
108
|
|
109
|
-
def mkdwarfs(deps_bin_dir, data_bin_file, data_src_dir)
|
109
|
+
def mkdwarfs(deps_bin_dir, data_bin_file, data_src_dir, descriptor = nil)
|
110
110
|
puts "-- Running mkdwarfs script"
|
111
111
|
params = [File.join(deps_bin_dir, "mkdwarfs"), "-o", data_bin_file, "-i", data_src_dir, "--no-progress"]
|
112
|
+
params << "--header" << descriptor if descriptor
|
112
113
|
BuildHelpers.run_with_capture_v(params)
|
113
114
|
end
|
114
115
|
|
@@ -189,18 +190,11 @@ module Tebako
|
|
189
190
|
patch_map.each { |fname, mapping| PatchHelpers.patch_file("#{root}/#{fname}", mapping) }
|
190
191
|
end
|
191
192
|
|
192
|
-
def
|
193
|
-
|
194
|
-
PatchHelpers.with_env(DEPLOY_ENV) do
|
195
|
-
out, st = Open3.capture2e("#{tbd}/ruby", "--version")
|
196
|
-
raise Tebako::Error, "Failed to run ruby --version" unless st.exitstatus.zero?
|
197
|
-
|
198
|
-
match = out.match(/ruby (\d+\.\d+\.\d+)/)
|
199
|
-
raise Tebako::Error, "Failed to parse Ruby version from #{out}" unless match
|
193
|
+
def patchelf(src_name, patchelf)
|
194
|
+
return if patchelf.nil?
|
200
195
|
|
201
|
-
|
202
|
-
|
203
|
-
ruby_version
|
196
|
+
params = [patchelf, "--remove-needed-version", "libpthread.so.0", "GLIBC_PRIVATE", src_name]
|
197
|
+
BuildHelpers.run_with_capture(params)
|
204
198
|
end
|
205
199
|
|
206
200
|
def strip_or_copy(os_type, src_name, package_name)
|
@@ -0,0 +1,78 @@
|
|
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 "pathname"
|
29
|
+
require "fileutils"
|
30
|
+
|
31
|
+
require_relative "options_manager"
|
32
|
+
require_relative "scenario_manager"
|
33
|
+
require_relative "package_descriptor"
|
34
|
+
require_relative "packager"
|
35
|
+
|
36
|
+
module Tebako
|
37
|
+
# Tebako application package descriptor
|
38
|
+
class PackagerLite
|
39
|
+
def initialize(options_manager, scenario_manager)
|
40
|
+
@opts = options_manager
|
41
|
+
@scm = scenario_manager
|
42
|
+
@scm.configure_scenario
|
43
|
+
end
|
44
|
+
|
45
|
+
def codegen
|
46
|
+
puts "-- Generating files"
|
47
|
+
Tebako::Codegen.generate_package_descriptor(@opts, @scm)
|
48
|
+
end
|
49
|
+
|
50
|
+
def create_implib
|
51
|
+
rv = Tebako::RubyVersion.new(@opts.ruby_ver)
|
52
|
+
bname = if @opts.mode == "application"
|
53
|
+
@opts.ref
|
54
|
+
else # @opts.mode == "both"
|
55
|
+
@opts.package
|
56
|
+
end
|
57
|
+
Tebako::Packager.create_implib(@opts.ruby_src_dir, @opts.data_src_dir, bname, rv)
|
58
|
+
end
|
59
|
+
|
60
|
+
def create_package
|
61
|
+
deploy
|
62
|
+
FileUtils.rm_f(name)
|
63
|
+
Tebako::Packager.mkdwarfs(@opts.deps_bin_dir, name, @opts.data_src_dir, codegen)
|
64
|
+
puts "Created tebako package at \"#{name}\""
|
65
|
+
end
|
66
|
+
|
67
|
+
def deploy
|
68
|
+
Tebako::Packager.init(@opts.stash_dir, @opts.data_src_dir, @opts.data_pre_dir, @opts.data_bin_dir)
|
69
|
+
create_implib if @scm.msys?
|
70
|
+
Tebako::Packager.deploy(@opts.data_src_dir, @opts.data_pre_dir, @opts.rv, @opts.root, @scm.fs_entrance, @opts.cwd)
|
71
|
+
end
|
72
|
+
|
73
|
+
def name
|
74
|
+
bname = Pathname.new(@opts.package).cleanpath.to_s
|
75
|
+
@name ||= "#{bname}.tebako"
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
@@ -35,7 +35,7 @@ module Tebako
|
|
35
35
|
class ScenarioManager
|
36
36
|
def initialize(fs_root, fs_entrance)
|
37
37
|
initialize_root(fs_root)
|
38
|
-
initialize_entry_point(fs_entrance)
|
38
|
+
initialize_entry_point(fs_entrance || "stub.rb")
|
39
39
|
end
|
40
40
|
|
41
41
|
attr_reader :fs_entry_point, :fs_mount_point, :fs_entrance
|