tebako 0.8.1 → 0.8.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 91362403f264faf856ec42bf6eb6d8411a595ba037e8d102132147301975f4b1
4
- data.tar.gz: 559b3f4aa269c5b0d0b271ebce87046f591adf229afb51a2f5715ac184b2e3de
3
+ metadata.gz: cf7f343e3ed1cef12b766eaa2cc0834c31882f7cf78629b5079856d9c5b94765
4
+ data.tar.gz: 852554fa13a1c95a22bef4234a2063f0879b66ffd53b0cc2635b232c8dbfa1bd
5
5
  SHA512:
6
- metadata.gz: 40d38a252bd29670656293ba1d5beb9bf166159a15380e2e8862448d0312146364882bb441c20891d53aa9742ff07c918f3ff2bb5bb1963b7978392376eb8ea4
7
- data.tar.gz: 91228cf1d10a6392b0725418eacfb35a00f982f8a111ed95811c37353a10720f7e786bc169036e41f335faf38e148caf7cdb63410b0fa025bdbf032401b481c5
6
+ metadata.gz: ad25d6a39cb8a2b3ff00d2f109299682da1cdceda1b852e9ea6b144b6bfbc4e087a70e9441295196623e10f5f9281390fefa2c9d9b40858e7beb622d6a860275
7
+ data.tar.gz: fdcf01004d51fafd178f76fc7684140653cdf84dc8ea400c2956713c7034e0b8f99b7ff46f236babc1b8b313ac4f199b128d0c6fb8d5f71af93baa215c23e743
data/CMakeLists.txt CHANGED
@@ -194,7 +194,7 @@ string(SUBSTRING ${RUBY_VER} 0 3 RUBY_VER_BASE)
194
194
  string(CONCAT RUBY_API_VER ${RUBY_VER_BASE} ".0")
195
195
 
196
196
  #if(DWARFS_PRELOAD)
197
- # def_ext_prj_t(LIBDWARFS_WR "0.5.5" "7bf8e5b4432f35b65f6034f614067c2018995c1bebaf935e8cdddc1a3e045c01")
197
+ # def_ext_prj_t(LIBDWARFS_WR "0.5.8" "7bf8e5b4432f35b65f6034f614067c2018995c1bebaf935e8cdddc1a3e045c01")
198
198
  #
199
199
  # string(REGEX REPLACE "^([0-9]+)\\.([0-9]+)\\.([0-9]+).*" "\\1;\\2;\\3" LIBDWARFS_WR_VER_COMPONENTS ${LIBDWARFS_WR_VER})
200
200
  #
@@ -203,7 +203,7 @@ string(CONCAT RUBY_API_VER ${RUBY_VER_BASE} ".0")
203
203
  # list(GET LIBDWARFS_WR_VER_COMPONENTS 2 LIBDWARFS_WR_VER_PATCH)
204
204
  # set (LIBDWARFS_WR_VER_M ${LIBDWARFS_WR_VER_MAJOR}.${LIBDWARFS_WR_VER_MINOR}.${LIBDWARFS_WR_VER_PATCH})
205
205
  #else(DWARFS_PRELOAD)
206
- def_ext_prj_g(DWARFS_WR "v0.5.7")
206
+ def_ext_prj_g(DWARFS_WR "v0.5.8")
207
207
  #endif(DWARFS_PRELOAD)
208
208
 
209
209
  set(LIBYAML_RUBY_OPTION "")
@@ -246,6 +246,14 @@ else(${IS_MSYS})
246
246
  set(FS_MOUNT_POINT "/__tebako_memfs__")
247
247
  endif(${IS_MSYS})
248
248
 
249
+ if(PACKAGE_NEEDS_CWD)
250
+ set(NEEDS_CWD true)
251
+ set(PACKAGE_CWD_FULL ${FS_MOUNT_POINT}/${PACKAGE_CWD})
252
+ else(PACKAGE_NEEDS_CWD)
253
+ set(NEEDS_CWD false)
254
+ set(PACKAGE_CWD "")
255
+ set(PACKAGE_CWD_FULL "")
256
+ endif(PACKAGE_NEEDS_CWD)
249
257
 
250
258
  message(STATUS "DATA_SRC_DIR: ${DATA_SRC_DIR}")
251
259
  message(STATUS "DATA_PRE_DIR: ${DATA_PRE_DIR}")
@@ -435,6 +443,7 @@ else (${SETUP_MODE})
435
443
  COMMAND ruby ${EXE}/tebako-packager deploy ${OSTYPE_TXT} ${RUBY_SOURCE_DIR} ${RUBY_STASH_DIR}
436
444
  ${DATA_SRC_DIR} ${DATA_PRE_DIR} ${DATA_BIN_DIR}
437
445
  ${FS_ROOT} ${FS_ENTRANCE} ${FS_MOUNT_POINT} ${APP_NAME} ${RUBY_VER}
446
+ ${PACKAGE_CWD}
438
447
  DEPENDS ${RUBY_PRJ}
439
448
  )
440
449
 
@@ -481,19 +490,7 @@ else (${SETUP_MODE})
481
490
 
482
491
  add_dependencies(tebako-fs packaged_filesystem)
483
492
 
484
- if (${RUBY_VER} VERSION_LESS "3.0.0")
485
- add_custom_target(tebako
486
- COMMAND ${CMAKE_COMMAND} -E chdir ${RUBY_SOURCE_DIR} make -j${NCORES}
487
- COMMAND ruby ${EXE}/tebako-packager finalize ${OSTYPE_TXT} ${RUBY_SOURCE_DIR} ${APP_NAME}
488
- )
489
- else()
490
- add_custom_target(tebako
491
- COMMAND ${CMAKE_COMMAND} -E chdir ${RUBY_SOURCE_DIR} make ruby -j${NCORES}
492
- COMMAND ${CMAKE_COMMAND} -E chdir ${RUBY_SOURCE_DIR} make -j${NCORES}
493
- COMMAND ruby ${EXE}/tebako-packager finalize ${OSTYPE_TXT} ${RUBY_SOURCE_DIR} ${APP_NAME}
494
- )
495
- endif()
496
-
493
+ add_custom_target(tebako COMMAND ruby ${EXE}/tebako-packager finalize ${OSTYPE_TXT} ${RUBY_SOURCE_DIR} ${APP_NAME} ${RUBY_VER})
497
494
  add_dependencies(tebako setup tebako-fs)
498
495
 
499
496
  endif(${SETUP_MODE})
data/Gemfile CHANGED
@@ -29,7 +29,3 @@ source "https://rubygems.org"
29
29
 
30
30
  # Specify your gem's dependencies in tebako.gemspec
31
31
  gemspec
32
- gem "hoe"
33
- gem "minitest"
34
- gem "rubocop", "~> 1.52"
35
- gem "rubocop-rubycw"
data/README.adoc CHANGED
@@ -10,7 +10,8 @@ Platform tests on Cirrus:
10
10
  image:https://api.cirrus-ci.com/github/tamatebako/tebako.svg?branch=main&task=ubuntu-aarch64["Ubuntu aarch64", link="https://cirrus-ci.com/github/tamatebako/tebako"]
11
11
 
12
12
  Quality:
13
- image:https://github.com/tamatebako/tebako/actions/workflows/lint.yml/badge.svg["lint", link="https://github.com/tamatebako/tebako/actions/workflows/lint.yml"]
13
+ image:https://github.com/tamatebako/tebako/actions/workflows/lint-and-rspec.yml/badge.svg["lint and rspec", link="https://github.com/tamatebako/tebako/actions/workflows/lint-and-rspec.yml"]
14
+ image:https://codecov.io/gh/tamatebako/tebako/graph/badge.svg?token=XD3emQ5qsY["Tebako cli rspec coverage", link="https://codecov.io/gh/tamatebako/tebako"]
14
15
 
15
16
  == Purpose
16
17
 
@@ -86,8 +87,8 @@ with debug information unstripped. You can opt to run 'strip -S' manually, it mo
86
87
 
87
88
  | 2.7.8 | Linux, macOS
88
89
  | 3.0.7 | Linux, macOS
89
- | 3.1.{4,5,6} | Linux, macOS, Windows
90
- | 3.2.{3,4} | Linux, macOS, Windows
90
+ | 3.1.6 | Linux, macOS, Windows
91
+ | 3.2.{4,5} | Linux, macOS, Windows
91
92
  | 3.3.{3,4} | Linux, macOS, Windows
92
93
 
93
94
  |===
@@ -232,8 +233,6 @@ Displays the Tebako version.
232
233
  Displays the help message.
233
234
 
234
235
 
235
-
236
-
237
236
  == Usage
238
237
 
239
238
  === General
@@ -291,9 +290,6 @@ docker run -v <application_folder>:/mnt/w \
291
290
  tebako {command} {parameters}
292
291
  ----
293
292
 
294
-
295
-
296
-
297
293
  ==== Packaging from outside the container
298
294
 
299
295
  To package your application from outside the container, just run a single Docker
@@ -659,7 +655,9 @@ tebako press \
659
655
  [-R|--Ruby=<ruby-version>] \
660
656
  [-o|--output=<packaged-file-name>] \
661
657
  [-l|--log-level=<error|warn|debug|trace>] \
662
- [-D|--devmode]
658
+ [-c|--cwd=<package current working directory>]
659
+ [-D|--devmode] \
660
+ [-t|--tebafile=<path-to-tebafile>]
663
661
  ----
664
662
 
665
663
  Where:
@@ -668,13 +666,13 @@ Where:
668
666
  the Tebako root folder (see details in the Tebako Root Folder Selection section)
669
667
 
670
668
  `Ruby`::
671
- This parameter defines Ruby version that will be packaged (optional, defaults to
669
+ this parameter defines Ruby version that will be packaged (optional, defaults to
672
670
  `3.1.6`)
673
671
 
674
- `<project-root>`::
672
+ `project-root`::
675
673
  a folder at the host source file system where project files are located
676
674
 
677
- `<entry-point>`::
675
+ `entry-point`::
678
676
  an executable file (binary executable or script) that shall be started when
679
677
  packaged file is called
680
678
 
@@ -685,11 +683,22 @@ the output file name (optional, defaults to `<current folder>/<entry point base
685
683
  logging level for the Tebako built-in memory filesystem driver
686
684
  (optional, defaults to `error`)
687
685
 
686
+ `cwd`::
687
+ a folder within Tebako memfs where the packaged application will start. This folder should be specified relative to the memfs root.
688
+ If not provided, the application will start within the current folder of the host (i.e., at $PWD).
689
+ This option is required because it is not possible to change the directory to a memfs folder until the package is started, as opposed to any host folder
690
+ that can be set as the current directory before Tebako package invocation. Tebako saves original working directory in a global Ruby variable `$tebako_original_pwd`.
691
+
692
+ `tebafile`::
693
+ the tebako configuration file (optional, defaults to `$PWD/.tebako.yml`).
694
+ Please refer to the separate section below for tebafile description.
695
+
688
696
  `devmode`:: flag that activates development mode, in which Tebako's cache and
689
697
  packaging consistency checks are relaxed.
690
698
  +
691
- NOTE: Development mode is *not intended for production use* and should only be
692
- used during development.
699
+ NOTES:
700
+ * Development mode is *not intended for production use* and should only be used during development.
701
+ * `entry-point` and `project-root-folder` are required parameters and may be provided either via command-line or in `tebafile`.
693
702
 
694
703
  [example]
695
704
  ====
@@ -724,16 +733,21 @@ based on `tebako press` may create inconsistent environment upon restore.
724
733
  $ tebako setup \
725
734
  [-p|--prefix=<tebako-root-folder>] \
726
735
  [-R|--Ruby=<ruby-version>] \
727
- [-D|--devmode]
736
+ [-D|--devmode] \
737
+ [-t|--tebafile=<path-to-tebafile>]
728
738
  ----
729
739
 
730
740
  Where:
731
741
 
732
742
  `<tebako-root-folder>`:: the Tebako root folder (see details in the Tebako Root Folder Selection section)
733
743
 
734
- `Ruby` parameter defines Ruby version that will be packaged (optional, defaults to 3.1.6)
744
+ `Ruby`:: parameter defines Ruby version that will be packaged (optional, defaults to 3.1.6)
745
+
746
+ `tebafile`::
747
+ the tebako configuration file (optional, defaults to `$PWD/.tebako.yml`).
748
+ Please refer to the separate section below for tebafile description.
735
749
 
736
- `devmode` flag activates development mode, in which Tebako's cache and packaging consistency checks are relaxed.
750
+ `devmode`:: flag activates development mode, in which Tebako's cache and packaging consistency checks are relaxed.
737
751
  Please note that this mode is not intended for production use and should only be used during development.
738
752
 
739
753
  ==== Clean
@@ -746,13 +760,18 @@ Normally you do not need to do it since tebako packager optimizes artifacts life
746
760
  [source,sh]
747
761
  ----
748
762
  $ tebako clean \
749
- [-p|--prefix=<tebako-root-folder>]
763
+ [-p|--prefix=<tebako-root-folder>] \
764
+ [-t|--tebafile=<path-to-tebafile>]
750
765
  ----
751
766
 
752
767
  Where:
753
768
 
754
769
  `<tebako-root-folder>`:: the Tebako root folder (see details in the Tebako Root Folder Selection section)
755
770
 
771
+ `tebafile`::
772
+ the tebako configuration file (optional, defaults to `$PWD/.tebako.yml`).
773
+ Please refer to the separate section below for tebafile description.
774
+
756
775
  [example]
757
776
  ====
758
777
  [source,sh]
@@ -777,7 +796,9 @@ NOTE: Compiled DwarFS libraries are not cleaned.
777
796
  ----
778
797
  $ tebako clean_ruby
779
798
  [-p|--prefix=<tebako-root-folder>] \
780
- [-R|--Ruby=<ruby-version>]
799
+ [-R|--Ruby=<ruby-version>] \
800
+ [-t|--tebafile=<path-to-tebafile>]
801
+
781
802
  ----
782
803
 
783
804
  Where:
@@ -788,6 +809,10 @@ the Tebako setup folder (optional, defaults to current folder)
788
809
  `Ruby`::
789
810
  defines Ruby version that will cleaned (optional, cleans all versions by default)
790
811
 
812
+ `tebafile`::
813
+ the tebako configuration file (optional, defaults to `$PWD/.tebako.yml`).
814
+ Please refer to the separate section below for tebafile description.
815
+
791
816
  [example]
792
817
  ====
793
818
  [source,sh]
@@ -806,6 +831,26 @@ as a cache key in CI/CD pipelines.
806
831
  $ tebako hash
807
832
  ----
808
833
 
834
+ === Tebako configuration file
835
+
836
+ It is possible to provide all or some options for the `tebako setup/press/clean/clean_ruby` commands via Tebako configuration file ('tebafile').
837
+ Tebafile is a YAML file with a single section 'options'. The options are the same as long names for the command line. For, example for the prefix option
838
+
839
+ [source]
840
+ ----
841
+ -p|--prefix=<tebako-root-folder>
842
+ ----
843
+ the key in the YAML file would be 'prefix'.
844
+
845
+ Below is an example tebafile that sets values for prefix and Ruby options
846
+ [source,yaml]
847
+ ----
848
+ options:
849
+ prefix: /tmp/tebako
850
+ Ruby: 3.2.4
851
+ ----
852
+
853
+ Please note that the options provided on the command line have preference over tebafile settings.
809
854
 
810
855
  === Image extraction
811
856
 
data/Rakefile 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-2024 [Ribose Inc](https://www.ribose.com).
4
4
  # All rights reserved.
5
5
  # This file is a part of tebako
6
6
  #
@@ -27,10 +27,12 @@
27
27
 
28
28
  require "bundler/gem_tasks"
29
29
  require "rubocop/rake_task"
30
+ require "rspec/core/rake_task"
30
31
 
31
32
  RuboCop::RakeTask.new
33
+ RSpec::Core::RakeTask.new(:spec)
32
34
 
33
- task default: %i[rubocop]
35
+ task default: %i[rubocop spec]
34
36
 
35
37
  desc "Generate version.txt"
36
38
  task "generate_version_txt" do
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.7
5
- RUBY_VER=3.1.6
4
+ DWARFS_WR_TAG=v0.5.8
5
+ RUBY_VER=3.2.5
data/exe/tebako-packager CHANGED
@@ -28,6 +28,7 @@
28
28
 
29
29
  require_relative "../lib/tebako/packager"
30
30
  require_relative "../lib/tebako/stripper"
31
+ require_relative "../lib/tebako/build_helpers"
31
32
 
32
33
  begin
33
34
  unless ARGV.length.positive?
@@ -46,8 +47,8 @@ begin
46
47
  raise Tebako::Error,
47
48
  "tebako-packager pass1 command expects 6 arguments, #{ARGV.length} has been provided."
48
49
  end
49
-
50
- Tebako::Packager.pass1(ARGV[1], ARGV[2], ARGV[3], ARGV[4], ARGV[5])
50
+ ruby_ver = Tebako::RubyVersion.new(ARGV[5])
51
+ Tebako::Packager.pass1(ARGV[1], ARGV[2], ARGV[3], ARGV[4], ruby_ver)
51
52
 
52
53
  when "pass1a"
53
54
  # ARGV[0] -- command
@@ -69,9 +70,9 @@ begin
69
70
  raise Tebako::Error,
70
71
  "tebako-packager pass2 command expects 7 arguments, #{ARGV.length} has been provided."
71
72
  end
72
-
73
+ ruby_ver = Tebako::RubyVersion.new(ARGV[6])
73
74
  Tebako::Packager.stash(ARGV[4], ARGV[5])
74
- Tebako::Packager.pass2(ARGV[1], ARGV[2], ARGV[3], ARGV[6])
75
+ Tebako::Packager.pass2(ARGV[1], ARGV[2], ARGV[3], ruby_ver)
75
76
  when "deploy"
76
77
  # ARGV[0] -- command
77
78
  # ARGV[1] -- OSTYPE
@@ -85,26 +86,31 @@ begin
85
86
  # ARGV[9] -- FS_MOUNT_POINT
86
87
  # ARGV[10] -- APP_NAME
87
88
  # ARGV[11] -- RUBY_VER
88
- unless ARGV.length == 12
89
+ # ARGV[12] -- CWD
90
+ unless ARGV.length == 13 || ARGV.length == 12
89
91
  raise Tebako::Error,
90
- "tebako-packager deploy command expects 12 arguments, #{ARGV.length} has been provided."
92
+ "tebako-packager deploy command expects 12 or 13 arguments, #{ARGV.length} has been provided."
91
93
  end
94
+ ruby_ver = Tebako::RubyVersion.new(ARGV[11])
92
95
  Tebako::Packager.init(ARGV[3], ARGV[4], ARGV[5], ARGV[6])
93
- Tebako::Packager.create_implib(ARGV[2], ARGV[4], File.basename(ARGV[10]), ARGV[11]) if ARGV[1] =~ /msys/
96
+ Tebako::Packager.create_implib(ARGV[2], ARGV[4], File.basename(ARGV[10]), ruby_ver) if ARGV[1] =~ /msys/
94
97
  # Assume that "<TARGET_BIN_DIR (TBD)>" is <DATA_SRC_DIR>/bin"
95
98
  # That shall match CMakeLists.txt settings
96
- Tebako::Packager.deploy(ARGV[1], ARGV[4], ARGV[5], ARGV[11], ARGV[7], ARGV[8], ARGV[9])
99
+ Tebako::Packager.deploy(ARGV[1], ARGV[4], ARGV[5], ruby_ver, ARGV[7], ARGV[8], ARGV[9],
100
+ ARGV.length == 13 ? ARGV[12] : nil)
97
101
 
98
102
  when "finalize"
99
103
  # ARGV[0] -- command
100
104
  # ARGV[1] -- OSTYPE
101
105
  # ARGV[2] -- RUBY_SOURCE_DIR
102
106
  # ARGV[3] -- APP_NAME
103
- unless ARGV.length == 4
107
+ # ARGV[4] -- RUBY_VER
108
+ unless ARGV.length == 5
104
109
  raise Tebako::Error,
105
- "tebako-packager finalize command expects 4 arguments, #{ARGV.length} has been provided."
110
+ "tebako-packager finalize command expects 5 arguments, #{ARGV.length} has been provided."
106
111
  end
107
- Tebako::Packager.finalize(ARGV[1], ARGV[2], ARGV[3])
112
+ ruby_ver = Tebako::RubyVersion.new(ARGV[4])
113
+ Tebako::Packager.finalize(ARGV[1], ARGV[2], ARGV[3], ruby_ver)
108
114
  else
109
115
  raise Tebako::Error, "tebako-packager cannot process #{ARGV[0]} command"
110
116
  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
  *
@@ -37,4 +37,7 @@ namespace tebako {
37
37
  extern const char* fs_log_level;
38
38
  extern const char* fs_mount_point;
39
39
  extern const char* fs_entry_point;
40
+ extern bool needs_cwd;
41
+ extern const char* package_cwd;
42
+ extern char original_cwd[PATH_MAX];
40
43
  }
@@ -33,6 +33,7 @@ extern "C" {
33
33
  int tebako_main(int* argc, char*** argv);
34
34
  const char* tebako_mount_point(void);
35
35
  int tebako_is_running_miniruby(void);
36
+ const char* tebako_original_pwd(void);
36
37
  #ifdef RB_W32
37
38
  int tebako_file_load_ok(const char *path);
38
39
  #endif
@@ -0,0 +1,123 @@
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 "open3"
29
+
30
+ # Tebako - an executable packager
31
+ module Tebako
32
+ # Ruby build helpers
33
+ module BuildHelpers
34
+ class << self
35
+ def ncores
36
+ if RUBY_PLATFORM.include?("darwin")
37
+ out, st = Open3.capture2e("sysctl", "-n", "hw.ncpu")
38
+ else
39
+ out, st = Open3.capture2e("nproc", "--all")
40
+ end
41
+
42
+ if st.exitstatus.zero?
43
+ out.strip.to_i
44
+ else
45
+ 4
46
+ end
47
+ end
48
+
49
+ def run_with_capture(args)
50
+ puts " ... @ #{args.join(" ")}"
51
+ out, st = Open3.capture2e(*args)
52
+ raise Tebako::Error, "Failed to run #{args.join(" ")} (#{st}):\n #{out}" unless st.exitstatus.zero?
53
+
54
+ out
55
+ end
56
+
57
+ def run_with_capture_v(args)
58
+ if @verbose
59
+ args_v = args.dup
60
+ args_v.push("--verbose")
61
+ puts run_with_capture(args_v)
62
+ else
63
+ run_with_capture(args)
64
+ end
65
+ end
66
+
67
+ # Sets up temporary environment variables and yields to the
68
+ # block. When the block exits, the environment variables are set
69
+ # back to their original values.
70
+ def with_env(hash)
71
+ old = {}
72
+ hash.each do |k, v|
73
+ old[k] = ENV.fetch(k, nil)
74
+ ENV[k] = v
75
+ end
76
+ begin
77
+ yield
78
+ ensure
79
+ hash.each_key { |k| ENV[k] = old[k] }
80
+ end
81
+ end
82
+ end
83
+ end
84
+
85
+ # Ruby version checks
86
+ class RubyVersion
87
+ def initialize(ruby_ver)
88
+ unless ruby_ver =~ /^\d+\.\d+\.\d+$/
89
+ raise Tebako::Error, "Invalid Ruby version format '#{ruby_ver}'. Expected format: x.y.z"
90
+ end
91
+
92
+ @ruby_ver = ruby_ver
93
+ end
94
+
95
+ def ruby3x?
96
+ @ruby3x ||= @ruby_ver[0] == "3"
97
+ end
98
+
99
+ def ruby31?
100
+ @ruby31 ||= ruby3x? && @ruby_ver[2].to_i >= 1
101
+ end
102
+
103
+ def ruby32?
104
+ @ruby32 ||= ruby3x? && @ruby_ver[2].to_i >= 2
105
+ end
106
+
107
+ def ruby32only?
108
+ @ruby32only ||= ruby3x? && @ruby_ver[2] == "2"
109
+ end
110
+
111
+ def ruby33?
112
+ @ruby33 ||= ruby3x? && @ruby_ver[2].to_i >= 3
113
+ end
114
+
115
+ def api_version
116
+ @api_version ||= "#{@ruby_ver.split(".")[0..1].join(".")}.0"
117
+ end
118
+
119
+ def lib_version
120
+ @lib_version ||= "#{@ruby_ver.split(".")[0..1].join}0"
121
+ end
122
+ end
123
+ end
data/lib/tebako/cli.rb CHANGED
@@ -40,7 +40,7 @@ require_relative "version"
40
40
  # Tebako - an executable packager
41
41
  # Implementation of tebako command-line interface
42
42
  module Tebako
43
- OPTIONS_FILE = ".tebako.yml"
43
+ DEFAULT_TEBAFILE = ".tebako.yml"
44
44
  # Tebako packager front-end
45
45
  class Cli < Thor
46
46
  package_name "Tebako"
@@ -48,7 +48,8 @@ module Tebako
48
48
  desc: "A path to tebako packaging environment, '~/.tebako' ('$HOME/.tebako') by default"
49
49
  class_option :devmode, type: :boolean, aliases: "-D", required: false,
50
50
  desc: "Developer mode, please do not use if unsure"
51
-
51
+ class_option :tebafile, type: :string, aliases: "-t", required: false,
52
+ desc: "tebako configuration file 'tebafile', '$PWD/.tebako.yml' by default"
52
53
  desc "clean", "Clean tebako packaging environment"
53
54
  def clean
54
55
  clean_cache
@@ -72,7 +73,14 @@ module Tebako
72
73
  print Digest::SHA256.hexdigest [File.read(File.join(source, "CMakeLists.txt")), Tebako::VERSION].join
73
74
  end
74
75
 
76
+ CWD_DESCRIPTION = <<~DESC
77
+ Current working directory for packaged application. This directory shall be specified relative to root.
78
+ #{" " * 62}# If this parameter is not set, the application will start in the current directory of the host file system.
79
+ DESC
80
+
75
81
  desc "press", "Press tebako image"
82
+ method_option :cwd, type: :string, aliases: "-c", required: false,
83
+ desc: CWD_DESCRIPTION
76
84
  method_option :"entry-point", type: :string, aliases: ["-e", "--entry"], required: true,
77
85
  desc: "Ruby application entry point"
78
86
  method_option :"log-level", type: :string, aliases: "-l", required: false, enum: %w[error warn debug trace],
@@ -123,35 +131,19 @@ module Tebako
123
131
 
124
132
  def options
125
133
  original_options = super
126
-
127
- return original_options unless File.exist?(OPTIONS_FILE)
128
-
129
- defaults = ::YAML.load_file(OPTIONS_FILE) || {}
130
- Thor::CoreExt::HashWithIndifferentAccess.new(defaults.merge(original_options))
134
+ tebafile = original_options["tebafile"].nil? ? DEFAULT_TEBAFILE : original_options["tebafile"]
135
+ if File.exist?(tebafile)
136
+ Thor::CoreExt::HashWithIndifferentAccess.new(options_from_tebafile(tebafile).merge(original_options))
137
+ else
138
+ puts "Warning: Tebako configuration file '#{tebafile}' not found." unless original_options["tebafile"].nil?
139
+ original_options
140
+ end
131
141
  end
132
142
  end
133
143
 
134
- private
135
-
136
144
  no_commands do
137
- def do_press
138
- cfg_cmd = "cmake -DSETUP_MODE:BOOLEAN=OFF #{cfg_options} #{press_options}"
139
- build_cmd = "cmake --build #{output} --target tebako --parallel #{Etc.nprocessors}"
140
- merged_env = ENV.to_h.merge(b_env)
141
- Tebako.packaging_error(103) unless system(merged_env, cfg_cmd)
142
- Tebako.packaging_error(104) unless system(merged_env, build_cmd)
143
- end
144
-
145
- def do_setup
146
- cfg_cmd = "cmake -DSETUP_MODE:BOOLEAN=ON #{cfg_options}"
147
- build_cmd = "cmake --build \"#{output}\" --target setup --parallel #{Etc.nprocessors}"
148
- merged_env = ENV.to_h.merge(b_env)
149
- Tebako.packaging_error(101) unless system(merged_env, cfg_cmd)
150
- Tebako.packaging_error(102) unless system(merged_env, build_cmd)
151
- end
145
+ include Tebako::CliHelpers
146
+ include Tebako::CliRubies
152
147
  end
153
-
154
- include Tebako::CliHelpers
155
- include Tebako::CliRubies
156
148
  end
157
149
  end