tebako 0.8.8 → 0.9.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 32bc84615f87ea1dba23c659ef4efe66906fd3ff2d913c5bb5710533a7f2e947
4
- data.tar.gz: 4ee0c2ea6565dd76fd797df814c11c190155eeb90b3beba05e3a94183e4368a5
3
+ metadata.gz: 70cd276a2d74a3086661f5782913bde506b242fed8528c8f17464a532d48853a
4
+ data.tar.gz: 9fbc81cbba0eeaf6e031bebee172bdb7cfe95bc8bf8994c73f83f9ba65a04dfc
5
5
  SHA512:
6
- metadata.gz: 7a96e28c1eed3205db11cc6dd16c91ca13a01959fb792ed5f504d057bd252e0618b1d0eb2d787ddc6a7ca6627743b8187dc6c060c6d34bcabf64343a176dcb2f
7
- data.tar.gz: 5e94107188ab47055ae4dc07bd3acea650288ed4964e16a2752962bc9306c6b29ecf4303b03f74df9b01f2560110a1e6a432c8fd53bbea5fe01a5683ffdf88a6
6
+ metadata.gz: 9fecf0012bb0a77a3404378b5dcba60d94776a7a0ece2b207d5bf8b94e21fb59aa81f8dfb9a577b0db4e4a743f6ba40a128ee520cb91db07d303e73477b21c21
7
+ data.tar.gz: 00136a6bb18176f4dfa9f475aec00295b2d1c31cc2663cd99528a4d10e324048debf4346f6640742f8e8d62eb0341c4c00830cec80605155f4489142f98fbc9b
data/.clang-format ADDED
@@ -0,0 +1,4 @@
1
+ BasedOnStyle: Chromium
2
+ BreakBeforeBraces: Stroustrup
3
+ SortIncludes: Never
4
+ ColumnLimit: 120
data/CMakeLists.txt CHANGED
@@ -209,7 +209,7 @@ string(CONCAT RUBY_API_VER ${RUBY_VER_BASE} ".0")
209
209
  # list(GET LIBDWARFS_WR_VER_COMPONENTS 2 LIBDWARFS_WR_VER_PATCH)
210
210
  # set (LIBDWARFS_WR_VER_M ${LIBDWARFS_WR_VER_MAJOR}.${LIBDWARFS_WR_VER_MINOR}.${LIBDWARFS_WR_VER_PATCH})
211
211
  #else(DWARFS_PRELOAD)
212
- def_ext_prj_g(DWARFS_WR "v0.5.9")
212
+ def_ext_prj_g(DWARFS_WR "v0.7.1")
213
213
  #endif(DWARFS_PRELOAD)
214
214
 
215
215
  def_ext_prj_g(PATCHELF "65e14792061c298f1d2bc44becd48a10cbf0bc81")
@@ -436,6 +436,10 @@ else (${SETUP_MODE})
436
436
  DEPENDS ${DWARFS_WR_PRJ} ${RUBY_PRJ}
437
437
  )
438
438
 
439
+ set(CMAKE_CXX_STANDARD 20)
440
+ set(CMAKE_CXX_STANDARD_REQUIRED ON)
441
+ set(CMAKE_CXX_EXTENSIONS OFF)
442
+
439
443
  file(GLOB GEMSPECS LIST_DIRECTORIES false ${FS_ROOT}/*.gemspec)
440
444
  file(GLOB GEMFILES LIST_DIRECTORIES false ${FS_ROOT}/Gemfile)
441
445
  file(GLOB GEMS LIST_DIRECTORIES false ${FS_ROOT}/*.gem)
data/README.adoc CHANGED
@@ -662,7 +662,7 @@ $ pacman -S git tar bison flex toolchain make cmake
662
662
 
663
663
 
664
664
 
665
- == Usage
665
+ == Packaging
666
666
 
667
667
  === Tebako root folder (aka prefix) selection
668
668
 
@@ -932,39 +932,6 @@ options:
932
932
 
933
933
  Please note that the options provided on the command line have preference over tebafile settings.
934
934
 
935
- === Image extraction
936
-
937
- Tebako provides an option to an extract its DwarFS filesystem from a package to
938
- a local folder for verification or execution.
939
-
940
- [source,sh]
941
- ----
942
- $ <tebako-packaged-executable> --tebako-extract [<root folder for extracted filesystem>]
943
- ----
944
-
945
- Where,
946
-
947
- `<root folder for extracted filesystem>`::
948
- The root folder for the extracted filesystem (optional, defaults to `source_filesystem`)
949
-
950
- [example]
951
- ====
952
- Extracting Tebako content from the `metanorma` package:
953
-
954
- [source,sh]
955
- ----
956
- metanorma --tebako-extract temp-image
957
- ----
958
- ====
959
-
960
- The `--tebako-extract` option actually runs the following Ruby script:
961
-
962
- [source,ruby]
963
- ----
964
- require 'fileutils'
965
- FileUtils.copy_entry '<in-memory filesystem root>', ARGV[2] || 'source_filesystem'
966
- ----
967
-
968
935
  === Exit codes
969
936
 
970
937
  The Tebako CLI exits with different exit codes to indicate the status of the
@@ -1080,9 +1047,110 @@ Here is a summary of the scenarios:
1080
1047
 
1081
1048
  |===
1082
1049
 
1083
-
1084
1050
  These scenarios determine how the project is packaged and where the entry point is located within the packaged filesystem.
1085
1051
 
1052
+ == Run-time options
1053
+
1054
+ Generally Tebako package passes command line options to the packaged application
1055
+
1056
+ [example]
1057
+ ====
1058
+ For example, if the package was created with the following command
1059
+
1060
+ [source,sh]
1061
+ ----
1062
+ tebako press \
1063
+ --root='~/projects/myproject' \
1064
+ --entry=start.rb \
1065
+ --output=/temp/myproject.tebako
1066
+ ----
1067
+ running
1068
+
1069
+ [source,sh]
1070
+ ----
1071
+ /temp/myproject.tebako --option --parameter value
1072
+ ----
1073
+
1074
+ will be translated by Tebako bootstrap code to
1075
+
1076
+ [source,sh]
1077
+ ----
1078
+ myproject --option --parameter value
1079
+ ----
1080
+ ====
1081
+
1082
+ However there are several command-line parameters that are intercepted processed by Tebako bootstrap code as follows
1083
+
1084
+ === Image extraction (--tebako-extract option)
1085
+
1086
+ Tebako provides an option to an extract its DwarFS filesystem from a package to
1087
+ a local folder for verification or execution.
1088
+
1089
+ [source,sh]
1090
+ ----
1091
+ $ <tebako-packaged-executable> --tebako-extract [<root folder for extracted filesystem>]
1092
+ ----
1093
+
1094
+ Where,
1095
+
1096
+ `<root folder for extracted filesystem>`::
1097
+ The root folder for the extracted filesystem (optional, defaults to `source_filesystem`)
1098
+
1099
+ [example]
1100
+ ====
1101
+ Extracting Tebako content from the `metanorma` package:
1102
+
1103
+ [source,sh]
1104
+ ----
1105
+ metanorma --tebako-extract temp-image
1106
+ ----
1107
+ ====
1108
+
1109
+ The `--tebako-extract` option actually runs the following Ruby script:
1110
+
1111
+ [source,ruby]
1112
+ ----
1113
+ require 'fileutils'
1114
+ FileUtils.copy_entry '<in-memory filesystem root>', ARGV[2] || 'source_filesystem'
1115
+ ----
1116
+
1117
+ === Mounting Host Folder to Tebako Memfs (`--tebako-mount` option)
1118
+
1119
+ Some programs unconditionally use folders located under the application root, and when processed by Tebako
1120
+ or similar tools, these folders are included in the packaging.
1121
+
1122
+ For example, there is no configuration option to change where Rails expects the `tmp` folder to be.
1123
+ The location is hardcoded in multiple places within the Rails codebase, residing under the application root,
1124
+ and as a result, it gets included in the read-only Tebako memfs. Although patches have been proposed
1125
+ (e.g., https://github.com/rails/rails/issues/39583), there is currently no way to change the paths for
1126
+ temporary files, caches, and sockets.
1127
+
1128
+ To address this limitation in Rails and similar issues in other applications, Tebako provides an option
1129
+ to mount a host folder to the memfs tree.
1130
+
1131
+ When using Tebako, consider the packaging scenario mentioned above, as it defines the layout of the application
1132
+ tree. The `--tebako-extract` option may be useful for understanding the placement of files and folders.
1133
+
1134
+ [example]
1135
+ ====
1136
+ The following command starts a `rails.tebako` package with `$PWD/tmp` mounted as `local/tmp` in the memfs.
1137
+ Any remaining command-line parameters are passed to the application.
1138
+ [source,sh]
1139
+ ----
1140
+ rails.tebako --tebako-mount local/tmp:$PWD/tmp server
1141
+ ----
1142
+ ====
1143
+
1144
+ The `--tebako-mount` option has the following syntax:
1145
+ [source,sh]
1146
+ ----
1147
+ --tebako-mount <memfs path>:<host path>
1148
+ ----
1149
+
1150
+ The `--tebako-mount` option can be repeated multiple times to mount more than one object. The `memfs path`
1151
+ is relative to the memfs root, and it is recommended to use absolute paths for host objects. Both directories
1152
+ and files can be mounted in this way. Tebako allows overlaying existing memfs objects, so there are no significant
1153
+ limitations.
1086
1154
 
1087
1155
  == Trivia: origin of name
1088
1156
 
data/common.env CHANGED
@@ -1,5 +1,5 @@
1
1
  BUILD_TYPE=Release
2
2
  DEPS=deps
3
3
  INCBIN_TAG=348e36b
4
- DWARFS_WR_TAG=v0.5.9
4
+ DWARFS_WR_TAG=v0.7.1
5
5
  RUBY_VER=3.2.5
@@ -48,8 +48,10 @@ module Tebako
48
48
  DARWIN_DEP_LIBS_2 = ["glog", "gflags", "brotlienc", "brotlidec", "brotlicommon", "fmt"].freeze
49
49
  # rubocop:enable Style/WordArray
50
50
 
51
+ LIBTEBAKOFS = "-Wl,--push-state,--whole-archive -l:libtebako-fs.a -Wl,--pop-state"
52
+
51
53
  COMMON_LINUX_LIBRARIES = [
52
- "-l:libdwarfs-wr.a", "-l:libtebako-fs.a", "-l:libdwarfs.a", "LIBCOMPRESSION",
54
+ LIBTEBAKOFS, "-l:libdwarfs-wr.a", "-l:libdwarfs.a", "LIBCOMPRESSION",
53
55
  "-l:libfolly.a", "-l:libfsst.a", "-l:libmetadata_thrift.a", "-l:libthrift_light.a",
54
56
  "-l:libxxhash.a", "-l:libfmt.a", "-l:libdouble-conversion.a", "-l:libglog.a",
55
57
  "-l:libgflags.a", "-l:libevent.a"
@@ -80,7 +82,7 @@ module Tebako
80
82
  MSYS_LIBRARIES = [
81
83
  "-l:liblz4.a", "-l:libz.a", "-l:libzstd.a", "-l:liblzma.a",
82
84
  "-l:libncurses.a", "-l:libunwind.a", "-l:liblzma.a", "-l:libiberty.a",
83
- "LIBYAML", "-l:libffi.a", "-l:libboost_system-mt.a", "-l:libboost_chrono-mt.a",
85
+ "LIBYAML", "-l:libffi.a", "-l:libboost_chrono-mt.a", # "-l:libboost_system-mt.a",
84
86
  "-l:libstdc++.a", "-l:libdl.a", "-static-libgcc", "-static-libstdc++",
85
87
  "-l:libssl.a", "-l:libcrypto.a", "-l:libz.a", "-l:libwinpthread.a",
86
88
  "-lcrypt32", "-lshlwapi", "-lwsock32", "-liphlpapi",
@@ -26,5 +26,5 @@
26
26
  # POSSIBILITY OF SUCH DAMAGE.
27
27
 
28
28
  module Tebako
29
- VERSION = "0.8.8"
29
+ VERSION = "0.9.0"
30
30
  end
data/src/tebako-main.cpp CHANGED
@@ -35,146 +35,114 @@
35
35
  #include <sys/stat.h>
36
36
  #include <fcntl.h>
37
37
 
38
-
39
38
  #include <string>
40
39
  #include <cstdint>
40
+ #include <vector>
41
+ #include <stdexcept>
42
+ #include <tuple>
41
43
 
42
44
  #ifdef _WIN32
43
- #include <winsock2.h>
44
- #include <windows.h>
45
+ #include <winsock2.h>
46
+ #include <windows.h>
45
47
  #endif
46
48
 
47
-
48
49
  #include <tebako/tebako-config.h>
49
50
  #include <tebako/tebako-io.h>
50
51
 
51
52
  #include <tebako/tebako-version.h>
52
53
  #include <tebako/tebako-main.h>
53
54
  #include <tebako/tebako-fs.h>
55
+ #include <tebako/tebako-cmdline-helpers.h>
54
56
 
55
57
  static int running_miniruby = 0;
56
58
 
57
- extern "C" int tebako_main(int* argc, char*** argv) {
58
- int ret = -1, fsret = -1;
59
- char** new_argv = NULL;
60
- char* argv_memory = NULL;
61
-
62
- if (strstr((*argv)[0], "miniruby") != NULL) {
63
- // Ruby build script is designed in such a way that this patch is also applied towards miniruby
64
- // Just pass through in such case
65
- ret = 0;
66
- running_miniruby = -1;
67
- }
68
- else {
69
- try {
70
- fsret = load_fs(&gfsData[0],
71
- gfsSize,
72
- tebako::fs_log_level,
73
- NULL /* cachesize*/,
74
- NULL /* workers */,
75
- NULL /* mlock */,
76
- NULL /* decompress_ratio*/,
77
- NULL /* image_offset */
78
- );
79
-
80
- if (fsret == 0) {
81
- if ((*argc > 1) && strcmp((*argv)[1], "--tebako-extract")==0) {
82
- // ruby -e "require 'fileutils'; FileUtils.copy_entry '<tebako::fs_mount_point>',argv[2] || 'source_filesystem'"
83
- std::string dest = std::string(((*argc) < 3 ? "source_filesystem" : (*argv)[2]));
84
- std::string cmd = std::string("require 'fileutils'; FileUtils.copy_entry '") + (tebako::fs_mount_point) + "', '" + dest + "'";
85
- printf("Extracting tebako image to '%s' \n", dest.c_str());
86
- size_t new_argv_size = 3 + cmd.size() + 1 + strlen((*argv)[0]) + 1;
87
- char** new_argv = new char* [3];
88
- char* argv_memory = new char[new_argv_size];
89
- if (new_argv != NULL && argv_memory != NULL) {
90
- strcpy(argv_memory, (*argv)[0]);
91
- new_argv[0] = argv_memory;
92
- argv_memory += (strlen((*argv)[0]) + 1);
93
- strcpy(argv_memory, "-e");
94
- new_argv[1] = argv_memory;
95
- argv_memory += 3;
96
- strcpy(argv_memory, cmd.c_str());
97
- new_argv[2] = argv_memory;
98
- ret = 0;
99
- *argv = new_argv;
100
- (*argc) = 3;
101
- }
102
- }
103
- else {
104
- size_t new_argv_size = strlen(tebako::fs_mount_point) + strlen(tebako::fs_entry_point) + 1;
105
- for (int i = 0; i < (*argc); i++) {
106
- new_argv_size += (strlen((*argv)[i]) + 1);
107
- }
108
- /* argv memory should be adjacent */
109
- char** new_argv = new char* [(*argc) + 1];
110
- char* argv_memory = new char[new_argv_size];
111
- if (new_argv != NULL && argv_memory != NULL) {
112
- memcpy(argv_memory, (*argv)[0], strlen((*argv)[0]) + 1);
113
- new_argv[0] = argv_memory;
114
- argv_memory += (strlen((*argv)[0]) + 1);
115
- memcpy(argv_memory, tebako::fs_mount_point, strlen(tebako::fs_mount_point));
116
- new_argv[1] = argv_memory;
117
- argv_memory += strlen(tebako::fs_mount_point);
118
- memcpy(argv_memory, tebako::fs_entry_point, strlen(tebako::fs_entry_point) + 1);
119
- argv_memory += (strlen(tebako::fs_entry_point) + 1);
120
- for (int i = 1; i < (*argc); i++) {
121
- memcpy(argv_memory, (*argv)[i], strlen((*argv)[i]) + 1);
122
- new_argv[i+1] = argv_memory;
123
- argv_memory += (strlen((*argv)[i]) + 1);
124
- }
125
- *argv = new_argv;
126
- (*argc) += 1;
127
- ret = 0;
128
- }
129
- }
130
- atexit(drop_fs);
131
- }
132
- }
133
- catch (...) {
134
-
135
- }
136
-
137
- if (!tebako_is_running_miniruby()) {
138
- if (getcwd(tebako::original_cwd, sizeof(tebako::original_cwd)) == NULL) {
139
- printf("Failed to get current directory: %s\n", strerror(errno));
140
- return -1;
141
- }
142
-
143
- if (tebako::needs_cwd) {
144
- if (tebako_chdir(tebako::package_cwd) != 0) {
145
- printf("Failed to chdir to '%s' : %s\n", tebako::package_cwd, strerror(errno));
146
- ret = -1;
147
- }
148
- }
149
- }
150
-
151
- if (ret != 0) {
152
- try {
153
- printf("Tebako initialization failed\n");
154
- if (new_argv) delete new_argv;
155
- if (argv_memory) delete argv_memory;
156
- if (fsret == 0) {
157
- drop_fs();
158
- }
159
- }
160
- catch (...) {
161
- // Nested error, no recovery :(
162
- }
163
- }
164
- }
165
- return ret;
59
+ extern "C" int tebako_main(int* argc, char*** argv)
60
+ {
61
+ int ret = -1, fsret = -1;
62
+ char** new_argv = nullptr;
63
+ char* argv_memory = nullptr;
64
+
65
+ if (strstr((*argv)[0], "miniruby") != nullptr) {
66
+ // Ruby build script is designed in such a way that this patch is also applied towards miniruby
67
+ // Just pass through in such case
68
+ ret = 0;
69
+ running_miniruby = -1;
70
+ }
71
+ else {
72
+ try {
73
+ fsret = load_fs(&gfsData[0], gfsSize, tebako::fs_log_level, nullptr /* cachesize*/, nullptr /* workers */,
74
+ nullptr /* mlock */, nullptr /* decompress_ratio*/, nullptr /* image_offset */
75
+ );
76
+
77
+ if (fsret == 0) {
78
+ if ((*argc > 1) && strcmp((*argv)[1], "--tebako-extract") == 0) {
79
+ ret = tebako::build_arguments_for_extract(argc, argv, tebako::fs_mount_point);
80
+ }
81
+ else {
82
+ auto [mountpoints, parsed_argv] = tebako::parse_arguments(*argc, *argv);
83
+ // for (auto& mp : mountpoints) {
84
+ // printf("Mountpoint: %s\n", mp.c_str());
85
+ // }
86
+ tebako::process_mountpoints(mountpoints);
87
+ std::tie(*argc, *argv) = tebako::build_arguments(parsed_argv, tebako::fs_mount_point, tebako::fs_entry_point);
88
+ ret = 0;
89
+ }
90
+ }
91
+ atexit(drop_fs);
92
+ }
93
+
94
+ catch (std::exception e) {
95
+ printf("Failed to process command line: %s\n", e.what());
96
+ }
97
+
98
+ if (getcwd(tebako::original_cwd, sizeof(tebako::original_cwd)) == nullptr) {
99
+ printf("Failed to get current directory: %s\n", strerror(errno));
100
+ ret = -1;
101
+ }
102
+
103
+ if (tebako::needs_cwd) {
104
+ if (tebako_chdir(tebako::package_cwd) != 0) {
105
+ printf("Failed to chdir to '%s' : %s\n", tebako::package_cwd, strerror(errno));
106
+ ret = -1;
107
+ }
108
+ }
109
+ }
110
+
111
+ if (ret != 0) {
112
+ try {
113
+ printf("Tebako initialization failed\n");
114
+ if (new_argv) {
115
+ delete new_argv;
116
+ new_argv = nullptr;
117
+ }
118
+ if (argv_memory) {
119
+ delete argv_memory;
120
+ argv_memory = nullptr;
121
+ }
122
+ if (fsret == 0) {
123
+ drop_fs();
124
+ }
125
+ }
126
+ catch (...) {
127
+ // Nested error, no recovery :(
128
+ }
129
+ }
130
+ return ret;
166
131
  }
167
132
 
168
- extern "C" const char* tebako_mount_point(void) {
169
- return tebako::fs_mount_point;
133
+ extern "C" const char* tebako_mount_point(void)
134
+ {
135
+ return tebako::fs_mount_point;
170
136
  }
171
137
 
172
- extern "C" const char* tebako_original_pwd(void) {
173
- return tebako::original_cwd;
138
+ extern "C" const char* tebako_original_pwd(void)
139
+ {
140
+ return tebako::original_cwd;
174
141
  }
175
142
 
176
- extern "C" int tebako_is_running_miniruby(void) {
177
- return running_miniruby;
143
+ extern "C" int tebako_is_running_miniruby(void)
144
+ {
145
+ return running_miniruby;
178
146
  }
179
147
 
180
148
  #ifdef RB_W32_PRE_33
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tebako
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.8
4
+ version: 0.9.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ribose Inc.
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-09-12 00:00:00.000000000 Z
11
+ date: 2024-10-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: thor
@@ -148,6 +148,7 @@ executables:
148
148
  extensions: []
149
149
  extra_rdoc_files: []
150
150
  files:
151
+ - ".clang-format"
151
152
  - CMakeLists.txt
152
153
  - Gemfile
153
154
  - README.adoc