tebako 0.12.16 → 0.13.1

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.
Files changed (77) hide show
  1. checksums.yaml +4 -4
  2. data/CMakeLists.txt +2 -2
  3. data/CODE_OF_CONDUCT.adoc +128 -0
  4. data/CONTRIBUTING.adoc +294 -0
  5. data/Gemfile +2 -2
  6. data/INSTALLATION.adoc +233 -0
  7. data/LICENSE.md +33 -0
  8. data/README.adoc +387 -528
  9. data/Rakefile +2 -2
  10. data/cmake/copy_dir.cmake +1 -1
  11. data/common.env +1 -1
  12. data/exe/tebako +2 -2
  13. data/exe/tebako-packager +2 -2
  14. data/include/tebako/tebako-fs.h +2 -2
  15. data/include/tebako/tebako-main.h +2 -2
  16. data/lib/tebako/build_helpers.rb +2 -2
  17. data/lib/tebako/cache_manager.rb +2 -2
  18. data/lib/tebako/cli.rb +19 -10
  19. data/lib/tebako/cli_helpers.rb +1 -1
  20. data/lib/tebako/codegen.rb +2 -2
  21. data/lib/tebako/deploy_helper.rb +9 -8
  22. data/lib/tebako/error.rb +1 -1
  23. data/lib/tebako/options_manager.rb +1 -1
  24. data/lib/tebako/package_descriptor.rb +2 -2
  25. data/lib/tebako/packager/pass1_patch.rb +1 -1
  26. data/lib/tebako/packager/pass1a_patch.rb +1 -1
  27. data/lib/tebako/packager/pass2_patch.rb +1 -1
  28. data/lib/tebako/packager/pass2_patch_crt.rb +1 -1
  29. data/lib/tebako/packager/pass2msys_patch.rb +1 -1
  30. data/lib/tebako/packager/patch.rb +1 -1
  31. data/lib/tebako/packager/patch_buildsystem.rb +2 -2
  32. data/lib/tebako/packager/patch_helpers.rb +2 -2
  33. data/lib/tebako/packager/patch_libraries.rb +9 -10
  34. data/lib/tebako/packager/patch_literals.rb +1 -1
  35. data/lib/tebako/packager/patch_main.rb +2 -2
  36. data/lib/tebako/packager/rubygems_patch.rb +1 -1
  37. data/lib/tebako/packager.rb +1 -1
  38. data/lib/tebako/packager_lite.rb +1 -1
  39. data/lib/tebako/ruby_builder.rb +1 -1
  40. data/lib/tebako/ruby_version.rb +4 -3
  41. data/lib/tebako/scenario_manager.rb +1 -1
  42. data/lib/tebako/stripper.rb +1 -1
  43. data/lib/tebako/version.rb +2 -2
  44. data/lib/tebako.rb +2 -2
  45. data/src/tebako-main.cpp +2 -2
  46. data/tebako.gemspec +2 -2
  47. data/tools/.github/workflows/build-containers.yml +190 -0
  48. data/tools/.github/workflows/lint.yml +3 -3
  49. data/tools/.github/workflows/test.yml +149 -9
  50. data/tools/ci-scripts/arm-brew-install.sh +1 -1
  51. data/tools/ci-scripts/arm-brew-setup.sh +1 -1
  52. data/tools/ci-scripts/level-up.sh +1 -1
  53. data/tools/ci-scripts/patch-fbthrift.sh +5 -1
  54. data/tools/ci-scripts/patch-folly.sh +7 -2
  55. data/tools/ci-scripts/tools.sh +1 -1
  56. data/tools/ci-scripts/x86-brew-install.sh +1 -1
  57. data/tools/ci-scripts/x86-brew-setup.sh +1 -1
  58. data/tools/cmake-scripts/def-external-project.cmake +1 -1
  59. data/tools/cmake-scripts/macos-environment.cmake +2 -2
  60. data/tools/cmake-scripts/msys-environment.cmake +1 -1
  61. data/tools/cmake-scripts/setup-libarchive.cmake +4 -8
  62. data/tools/cmake-scripts/setup-libfmt.cmake +1 -1
  63. data/tools/cmake-scripts/setup-libhowardhinnerdate.cmake +1 -1
  64. data/tools/cmake-scripts/setup-libutfcpp.cmake +2 -2
  65. data/tools/cmake-scripts/setup-openssl-1.1.1.cmake +1 -1
  66. data/tools/docker/alpine-3.17-dev.Dockerfile +49 -0
  67. data/tools/docker/tools/tools.sh +66 -0
  68. data/tools/docker/ubuntu-20.04-dev.Dockerfile +51 -0
  69. data/tools/dwarfs-test-helper/CMakeLists.txt +1 -1
  70. data/tools/include/pro-statvfs.h +1 -1
  71. data/tools/tests/cmake/CMakeLists.txt +1 -1
  72. data/tools/tests/setup-libfmt/CMakeLists.txt +1 -1
  73. data/tools/tests/setup-libhowardhinnerdate/CMakeLists.txt +1 -1
  74. data/tools/tests/setup-librachive/CMakeLists.txt +1 -1
  75. data/tools/tests/setup-libutfcpp/CMakeLists.txt +1 -1
  76. data/tools/tests/setup-openssl/CMakeLists.txt +1 -1
  77. metadata +10 -2
data/README.adoc CHANGED
@@ -1,20 +1,43 @@
1
1
  = Tebako: An advanced image packager for interpretive languages
2
2
 
3
- Platform tests on GitHub:
4
- image:https://github.com/tamatebako/tebako/actions/workflows/ubuntu.yml/badge.svg["Ubuntu amd64", link="https://github.com/tamatebako/tebako/actions/workflows/ubuntu.yml"]
5
- image:https://github.com/tamatebako/tebako/actions/workflows/alpine.yml/badge.svg["Alpine", link="https://github.com/tamatebako/tebako/actions/workflows/alpine.yml"]
6
- image:https://github.com/tamatebako/tebako/actions/workflows/macos.yml/badge.svg["macOS amd64", link="https://github.com/tamatebako/tebako/actions/workflows/macos.yml"]
7
- image:https://github.com/tamatebako/tebako/actions/workflows/windows-msys.yml/badge.svg["Windows msys", link="https://github.com/tamatebako/tebako/actions/workflows/windows-msys.yml"]
3
+ .Continuous Integration Status
4
+ [cols="1,1,3"]
5
+ |===
6
+ |*Platform Tests* |Architecture |Status
7
+
8
+ |Ubuntu
9
+ |amd64 + arm64 | image:https://github.com/tamatebako/tebako/actions/workflows/ubuntu.yml/badge.svg["Ubuntu amd64", link="https://github.com/tamatebako/tebako/actions/workflows/ubuntu.yml"]
10
+
11
+ |Alpine
12
+ |amd64 + arm64 |image:https://github.com/tamatebako/tebako/actions/workflows/alpine.yml/badge.svg["Alpine", link="https://github.com/tamatebako/tebako/actions/workflows/alpine.yml"]
13
+
14
+ |macOS
15
+ |amd64 + arm64
16
+ |image:https://github.com/tamatebako/tebako/actions/workflows/macos.yml/badge.svg["macOS amd64 + arm64", link="https://github.com/tamatebako/tebako/actions/workflows/macos.yml"]
17
+
18
+ |Windows MSYS2
19
+ |amd64 |image:https://github.com/tamatebako/tebako/actions/workflows/windows-msys.yml/badge.svg["Windows MSYS2", link="https://github.com/tamatebako/tebako/actions/workflows/windows-msys.yml"]
20
+
21
+ 3+|*Tools Tests*
22
+
23
+ |Tebako containers
24
+ | |image:https://github.com/tamatebako/tebako-ci-containers/actions/workflows/build-containers.yml/badge.svg["Tebako containers", link="https://github.com/tamatebako/tebako-ci-containers/actions/workflows/build-containers.yml"]
25
+
26
+ |Runtimes
27
+ | |image:https://github.com/tamatebako/tebako-runtime-ruby/actions/workflows/build-runtime-packages.yml/badge.svg["Ruby runtimes", link="https://github.com/tamatebako/tebako-runtime-ruby/actions/workflows/build-runtime-packages.yml"]
8
28
 
9
- Platform tests on Cirrus:
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"]
29
+ 3+|*Quality*
11
30
 
12
- Tools tests on GitHub:
13
- image:https://github.com/tamatebako/tebako-ci-containers/actions/workflows/build-containers.yml/badge.svg["Tebako cobtainers", link="https://github.com/tamatebako/tebako-ci-containers/actions/workflows/build-containers.yml"]
31
+ |Lint and RSpec
32
+ | |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
33
 
15
- Quality:
16
- 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"]
17
- image:https://codecov.io/gh/tamatebako/tebako/graph/badge.svg?token=XD3emQ5qsY["Tebako cli rspec coverage", link="https://codecov.io/gh/tamatebako/tebako"]
34
+ |Code Coverage
35
+ | |image:https://codecov.io/gh/tamatebako/tebako/graph/badge.svg?token=XD3emQ5qsY["Tebako CLI RSpec coverage", link="https://codecov.io/gh/tamatebako/tebako"]
36
+
37
+ 3+|*Info*
38
+ |Gem
39
+ | |image:https://img.shields.io/gem/v/tebako.svg["Version", link="https://rubygems.org/gems/tebako"]
40
+ |===
18
41
 
19
42
  == Purpose
20
43
 
@@ -56,6 +79,8 @@ architectures.
56
79
 
57
80
  3+| **Linux**
58
81
  | Ubuntu 20.04 | amd64, aarch64 | gcc/g+\+: 10; clang/clang++: 12
82
+ | Ubuntu 22.04 | amd64, aarch64 | gcc/g+\+: 10; clang/clang++: 12
83
+ | Ubuntu 24.04 | amd64, aarch64 | gcc/g+\+: 10; clang/clang++: 12
59
84
  | Alpine 3.17 | amd64 | gcc/g+\+: default; clang/clang++: default
60
85
 
61
86
  3+| **macOS**
@@ -106,7 +131,7 @@ higher.
106
131
  | 3.1.6 | Linux, macOS, Windows
107
132
  | 3.2.{4,5,6,7} | Linux, macOS, Windows
108
133
  | 3.3.{3,4,5,6,7} | Linux, macOS, Windows
109
- | 3.4.1 | Linux, macOS, Windows
134
+ | 3.4.{1,2} | Linux, macOS, Windows
110
135
 
111
136
  |===
112
137
 
@@ -131,7 +156,8 @@ macOS packages are forward portable across different macOS versions.
131
156
  A Tebako executable package built on macOS 13 (Ventura) can be executed on
132
157
  macOS 14 (Sonoma), but not vice versa.
133
158
 
134
- `x86_64` macOS packages can be run on Apple M (ARM) systems.
159
+ macOS packages compiled on `x86_64` can be run on Apple M (ARM64/aarch64)
160
+ systems.
135
161
 
136
162
 
137
163
  === Linux distributions using `musl`
@@ -286,456 +312,80 @@ single, performant, executable binary.
286
312
  |===
287
313
 
288
314
 
289
- == Usage
290
-
291
- === Command-line interface
292
-
293
- Tebako works by packaging your project into a single executable binary that
294
- includes all the necessary dependencies.
295
-
296
- The way to work with Tebako is through its command-line interface (CLI).
297
- It provides the following commands:
298
-
299
- `setup`::
300
- Prepares the Tebako packaging environment.
301
-
302
- `press`::
303
- Packages a project into a single executable binary.
304
-
305
- `clean`::
306
- Removes Tebako artifacts.
307
-
308
- `clean_ruby`::
309
- Removes Tebako Ruby artifacts.
310
-
311
- `hash`::
312
- Calculates the Tebako script hash for use as a cache key in CI/CD environments.
313
-
314
- `version`::
315
- Displays the Tebako version.
316
-
317
- `help`::
318
- Displays the help message.
319
-
320
-
321
- == Usage
322
-
323
- === General
324
-
325
- Tebako can be used in two ways:
326
-
327
- * Through the Tebako container
328
- * Local installation
329
-
330
- Please refer to the <<installation>> section on how to install Tebako.
331
-
332
-
333
- [[installation]]
334
315
  == Installation
335
316
 
336
317
  === General
337
318
 
338
- Installation of Tebako is only needed in order to package an application.
319
+ Tebako installation is only required for packaging applications.
339
320
 
340
- There is no need to install anything for users who run the packaged application.
321
+ Users who run packaged applications do not need to install anything.
341
322
 
323
+ Tebako can be used for packaging in two ways:
342
324
 
343
- === Using Docker
344
-
345
- ==== General
346
-
347
- If you have Docker installed and available, the easiest way to run Tebako is
348
- through the official Docker containers.
349
-
350
- Docker containers with preinstalled Tebako packaging environments for Ubuntu and
351
- Alpine Linux are available at
352
- https://github.com/tamatebako/tebako-ci-containers[tebako-ci-containers].
353
-
354
-
355
- ==== Pull the container
356
-
357
- Pull the Tebako container image.
358
-
359
- [source,sh]
360
- ----
361
- docker pull ghcr.io/tamatebako/tebako-<container_tag>:latest
362
- ----
363
-
364
- `<container_tag>`:: is the desired image tag (e.g., `ubuntu-20.04` or `alpine-3.17`).
365
-
366
-
367
- ==== Running Tebako commands in the container
368
-
369
- Simply prefix the Tebako command with `docker run` and the container image.
370
-
371
- [source,sh]
372
- ----
373
- docker run -v <application_folder>:/mnt/w \
374
- -t ghcr.io/tamatebako/tebako-<container_tag>:latest \
375
- tebako {command} {parameters}
376
- ----
377
-
378
- ==== Packaging from outside the container
379
-
380
- To package your application from outside the container, just run a single Docker
381
- command.
382
-
383
- This command mounts the application folder into the container and runs the
384
- `tebako press` command, specifying the application root, entry point, output
385
- location, and Ruby version.
386
-
387
- [source,sh]
388
- ----
389
- docker run -v <application_folder>:/mnt/w \
390
- -t ghcr.io/tamatebako/tebako-<container_tag>:latest \
391
- tebako press <tebako-press-parameters>
392
- ----
393
-
394
- `<application_folder>`:: is the path to your application folder.
395
-
396
- `<container_tag>`:: is the desired image tag (e.g., `ubuntu-20.04` or `alpine-3.17`).
397
-
398
-
399
- [example]
400
- ====
401
- Assume that you have a Ruby application in the `fontist` folder of the current
402
- directory.
403
-
404
- You can package it to `./fontist-package` using the following command:
405
-
406
- [source,sh]
407
- ----
408
- docker run -v $PWD:/mnt/w \
409
- -t ghcr.io/tamatebako/tebako-ubuntu-20.04:latest \
410
- tebako press --root=/mnt/w/fontist --entry-point=fontist --output=/mnt/w/fontist-package --Ruby=3.2.4
411
- ----
412
- ====
413
-
414
- ==== Packaging from inside the container
415
-
416
- It is also possible to package an application from inside the Tebako container.
417
-
418
- Start and enter the container interactively.
419
-
420
- [source,sh]
421
- ----
422
- docker run -it --rm -v <application_folder>:/mnt/w \
423
- ghcr.io/tamatebako/tebako-<container_tag>:latest bash
424
- ----
425
-
426
- `<application_folder>`:: is the path to your application folder.
427
-
428
- `<container_tag>`:: is the desired image tag (e.g., `ubuntu-20.04` or `alpine-3.17`).
429
-
430
-
431
- Once inside, run the `tebako press` command:
432
-
433
- [source,sh]
434
- ----
435
- tebako press <tebako press parameters>
436
- ----
437
-
438
- [example]
439
- ====
440
- Assume that you have a Ruby application in the `fontist` folder of the current
441
- directory.
442
-
443
- You can package it to `./fontist-package` using the following command:
444
-
445
- [source,sh]
446
- ----
447
- $ docker run -it --rm -v $PWD:/mnt/w ghcr.io/tamatebako/tebako-<container_tag>:latest bash
448
-
449
- # Inside the container:
450
- $ tebako press --root=/mnt/w/fontist --entry-point=fontist --output=/mnt/w/fontist-package --Ruby=3.2.4
451
- ----
452
- ====
325
+ * Through the link:https://github.com/tamatebako/tebako-ci-containers[Tebako CI docker containers]
326
+ * Through local installation
453
327
 
328
+ Installation for both GNU and musl Linux distributions may heavily depend on the OS version,
329
+ so we recommend using link:https://github.com/tamatebako/tebako-ci-containers[Tebako CI docker containers]
330
+ for Linux packaging.
454
331
 
455
332
  === Local installation
456
333
 
457
- ==== General
458
-
459
- There are cases where Docker may not be suitable for your needs, such as:
460
-
461
- . Admin privileges: Running Docker requires administrative privileges, which
462
- means Docker may not be available to users on their machines.
463
-
464
- . Performance penalty: Docker introduces a performance penalty due to the
465
- overhead of running containers. This can be a concern when packaging complex
466
- applications that require heavy memory usage.
467
-
468
- In such cases, you can choose to install Tebako locally.
469
-
470
- Tebako is distributed as a Ruby gem. A Ruby environment is necessary.
471
-
472
-
473
- [source,sh]
474
- ----
475
- $ gem install tebako
476
- ----
477
-
478
-
479
- ==== Prerequisites
480
-
481
- These prerequisites are needed only for users who want to install Tebako on
482
- their machine and build all Tebako components locally.
483
-
484
- If you use Docker, there is no need to set up these prerequisites.
485
-
486
- ===== Ubuntu 20.04
487
-
488
- ====== General
489
-
490
- There are several prerequisites that need to be installed on Ubuntu 20.04 for
491
- Tebako to work correctly.
492
-
493
-
494
- ====== GNU C/C++ 10+ or Clang C/C++ 12+
495
-
496
- [source,sh]
497
- ----
498
- apt install -y gcc-10 g++-10
499
- update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-10 10
500
- update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-10 10
501
- ----
502
-
503
- or
504
-
505
- [source,sh]
506
- ----
507
- apt install -y clang-12
508
- update-alternatives --install /usr/bin/clang clang /usr/bin/clang-12 150
509
- update-alternatives --install /usr/bin/clang++ clang++ /usr/bin/clang++-12 150
510
- ----
511
-
512
- ====== CMake version 3.20+
513
-
514
- Tebako requires CMake at a version of at least 3.20+.
515
-
516
- If such CMake version is not available as a default package, set it up as
517
- follows.
334
+ To use Tebako on macOS or Windows, you need to install it locally.
518
335
 
519
- .Installing CMake 3.20+
520
- [source,sh]
521
- ----
522
- apt-get remove --purge --auto-remove cmake
523
- apt-get update
524
- apt-get install -y software-properties-common lsb-release curl
525
- apt-get clean all
526
- curl https://apt.kitware.com/kitware-archive.sh | bash
527
- apt-get install cmake
528
- ----
529
-
530
- ====== Other development tools and libraries
531
-
532
- [source,sh]
533
- ----
534
- apt-get -y install sudo git curl build-essential pkg-config bison flex autoconf \
535
- binutils-dev libevent-dev acl-dev libfmt-dev libjemalloc-dev libiberty-dev \
536
- libdouble-conversion-dev liblz4-dev liblzma-dev libssl-dev libunwind-dev \
537
- libboost-filesystem-dev libboost-program-options-dev libboost-system-dev \
538
- libboost-iostreams-dev libboost-date-time-dev libboost-context-dev \
539
- libboost-regex-dev libboost-thread-dev libbrotli-dev libdwarf-dev libelf-dev \
540
- libgoogle-glog-dev libffi-dev libgdbm-dev libyaml-dev libncurses-dev \
541
- libreadline-dev libncurses-dev libreadline-dev ruby-dev ruby-bundler \
542
- libutfcpp-dev
543
- ----
544
-
545
- ===== Alpine 3.17
546
-
547
- ====== General
548
-
549
- There are several prerequisites that need to be installed on Alpine 3.17 for
550
- Tebako to work correctly.
551
-
552
- ====== APK packages
553
-
554
- Run the following command to install all prerequisites.
555
-
556
- [source,sh]
557
- ----
558
- apk --no-cache --upgrade add build-base cmake git bash autoconf boost-static \
559
- boost-dev flex-dev bison make binutils-dev libevent-dev acl-dev sed python3 \
560
- pkgconfig lz4-dev openssl-dev zlib-dev xz ninja zip unzip curl libdwarf-dev \
561
- libunwind-dev gflags-dev elfutils-dev libevent-static openssl-libs-static \
562
- lz4-static xz-dev zlib-static libunwind-static acl-static tar libffi-dev \
563
- gdbm-dev yaml-dev yaml-static ncurses-dev ncurses-static readline-dev \
564
- readline-static p7zip ruby-dev gcompat gettext-dev gperf brotli-dev \
565
- brotli-static jemalloc-dev fmt-dev xz-static
566
- ----
567
-
568
- ===== macOS
569
-
570
- ====== General
571
-
572
- There are several prerequisites that need to be installed on macOS for Tebako to work correctly.
573
-
574
- The following instructions work for:
575
-
576
- * macOS 13 (Ventura) through macOS 15 (Sequoia)
577
-
578
-
579
- ====== Homebrew packages
580
-
581
- We use Homebrew to install the necessary packages on macOS.
582
-
583
- Tebako provides a `Brewfile` at the repository root that you can install all
584
- dependencies using the `brew bundle` command.
585
-
586
- [source,sh]
587
- ----
588
- $ brew bundle
589
- ----
590
-
591
- Alternatively, you can install the packages manually.
336
+ On Linux, there may be cases where Docker is not suitable for your needs, such as:
592
337
 
593
- [source,sh]
594
- ----
595
- $ brew update
596
- $ brew install gnu-sed bash pkg-config bison flex binutils libffi gdbm zlib \
597
- ncurses double-conversion boost jemalloc fmt glog libevent libsodium lz4 xz \
598
- libyaml openssl@3
599
- ----
600
-
601
- ====== Bison 3+
602
-
603
- Tebako requires Bison 3+.
604
-
605
- On macOS 14, the default Bison version is 2.3, and the Homebrew formula is
606
- keg-only, which means that the full path to the Bison binary must be used to
607
- utilize the correct version.
608
-
609
- Run the following command prior to using Tebako, or add it into your shell
610
- profile.
611
-
612
- [source,sh]
613
- ----
614
- export PATH="$(brew --prefix bison)/bin:$PATH"
615
- ----
616
-
617
- ====== jemalloc library build
618
-
619
- On macOS, the `libdwarfs` build script creates an additional `jemalloc`
620
- installation. This is done to satisfy the magic applied by folly during linking
621
- but uses a static library.
622
-
623
- If the `jemalloc` library is built within an emulated environment (QEMU,
624
- Rosetta, etc.), there are known issues
625
- (link:https://github.com/jemalloc/jemalloc/issues/1997[jemalloc issue #1997])
626
- where `jemalloc` incorrectly detects the number of significant virtual address
627
- bits and therefore defines them wrongly (`lg-vaddr` parameter).
628
-
629
- Technically, these issues can be fixed by explicitly setting the
630
- `--with-lg-vaddr` parameter for the `jemalloc` build. However, we decided not to
631
- automate this since we do not feel that we can provide reasonable test coverage.
632
-
633
- Instead, our build script accepts the `LG_VADDR` environment variable and passes
634
- it to the jemalloc build as `--with-lg-vaddr=${LG_VADDR}`.
338
+ 1. Administrative privileges: Running Docker requires administrative privileges,
339
+ which may not be available to all users on their machines.
635
340
 
636
- The `LG_VADDR` parameter specifies the number of significant virtual address
637
- bits, which can vary based on the CPU architecture and emulation status.
341
+ 2. Performance impact: Docker introduces performance overhead due to
342
+ containerization. This can be a concern when packaging complex
343
+ applications that require significant memory resources.
638
344
 
639
- This is a simple example script to set `LG_VADDR`.
345
+ In such cases, you can choose to install Tebako locally on Linux as well.
640
346
 
641
- NOTE: This is provided for illustration only.
347
+ Please refer to the separate document link:INSTALLATION.adoc[INSTALLATION.adoc]
348
+ for instructions on how to install Tebako.
642
349
 
643
- [example]
644
- ====
645
- [source,sh]
646
- ----
647
- #!/bin/bash
648
-
649
- # Check the CPU architecture
650
- ARCH=$(uname -m)
651
-
652
- # Check if running under Rosetta 2 emulation
653
- if [[ "$ARCH" == "x86_64" && $(sysctl -n sysctl.proc_translated) == "1" ]]; then
654
- echo "Running on Apple Silicon under Rosetta 2 emulation"
655
- export LG_VADDR=39
656
- elif [[ "$ARCH" == "arm64" ]]; then
657
- echo "Running on Apple Silicon"
658
- export LG_VADDR=39
659
- else
660
- echo "Running on Intel Silicon"
661
- export LG_VADDR=48
662
- fi
663
-
664
- echo "Setting lg-vaddr to $LG_VADDR"
665
- ----
666
- ====
667
-
668
-
669
- ===== Windows
670
-
671
- ====== General
350
+ == Usage
672
351
 
673
- The following instructions work for:
352
+ === Command-line interface
674
353
 
675
- * Windows 10, 11
676
- * Windows Server 2019, 2022
354
+ Tebako works by packaging your project into a single executable binary that
355
+ includes all the necessary dependencies.
677
356
 
678
- ====== Ruby
357
+ You interact with Tebako through its command-line interface (CLI),
358
+ which provides the following commands:
679
359
 
680
- To run Tebako you need to have Ruby installed.
681
- It is simplest to use the Ruby development environment provided by
682
- https://rubyinstaller.org[RubyInstaller].
360
+ Basic use:
683
361
 
684
- For example, Ruby+Devkit 3.1.4-1.
362
+ `press`::
363
+ Packages a project into a single executable binary.
364
+ See <<press>> section for details.
685
365
 
686
- ====== MinGW ucrt64
366
+ Advanced use:
687
367
 
688
- Enable MinGW ucrt64 and install the necessary packages.
368
+ `setup`::
369
+ Runs post-install setup and creates the Tebako packaging environment.
370
+ See <<setup>> section for details.
689
371
 
690
- The `ridk` command originates from the RubyInstaller installation.
372
+ `clean`::
373
+ Removes Tebako artifacts.
374
+ See <<clean>> section for details.
691
375
 
692
- [source,sh]
693
- ----
694
- $ ridk enable ucrt64
695
- $ pacman -S git tar bison flex toolchain make cmake
696
- boost diffutils libevent double-conversion
697
- fmt glog dlfcn gtest autotools ncurses libyaml
698
- ----
376
+ `clean_ruby`::
377
+ Removes Tebako Ruby artifacts.
378
+ See <<clean_ruby>> section for details.
699
379
 
380
+ `hash`::
381
+ Calculates the Tebako script hash for use as a cache key in CI/CD environments.
382
+ See <<hash>> section for details.
700
383
 
384
+ `help`::
385
+ Displays the help message.
701
386
 
702
387
  == Packaging
703
388
 
704
- [[root-folder-selection]]
705
- === Tebako root folder (aka prefix) selection
706
-
707
- The Tebako prefix determines the base directory for the tebako packaging environment. It contain build artifacts for
708
- Tebako run-time, libraries and other components and is an essential part of configuring how Tebako operates within your system.
709
-
710
- The selection of the Tebako prefix follows a specific order of precedence to
711
- ensure flexibility and ease of use:
712
-
713
- . *User-specified prefix*:
714
- The most direct way to set the root folder is by specifying it through a
715
- command-line argument.
716
-
717
- . *Current Working Directory (PWD)*:
718
- If the prefix option is explicitly set to `PWD`, Tebako uses the current working
719
- directory as Tebako root folder.
720
-
721
- . *Environment variable (`TEBAKO_PREFIX`)*:
722
- In the absence of a user-specified option, Tebako looks for an environment
723
- variable named `TEBAKO_PREFIX`. If found, its value is used as the root folder.
724
-
725
- . *Default value*:
726
- If no prefix is specified and the `TEBAKO_DIR` environment variable is not set,
727
- Tebako defaults to using a directory named `.tebako` in the user's home
728
- directory.
729
-
730
- Path Expansion: Regardless of the method used to set the Tebako prefix, Tebako
731
- expands the provided path to an absolute path. This expansion includes resolving
732
- relative paths based on the current working directory and expanding user
733
- directory shortcuts like `~`.
734
-
735
- Please do not use Tebako prefix under your application root (`--root` parameter). It is not an error
736
- but it will cause Tebako to place all build-time artifacts to tebako package dramatically increasing its size.
737
- You do not need it unless under very special circumstances like tebako packaging tebako itself.
738
-
739
389
  === Commands
740
390
 
741
391
  Tebako provides several commands to manage the packaging and deployment process.
@@ -862,6 +512,8 @@ to be separately packaged.
862
512
  `application`::: Create the application package only. The output file is named according to the `-o` option.
863
513
  `runtime`::: Create the runtime package only. The output file is named according to the `-o` option.
864
514
 
515
+ More information on the `mode` option is available in the <<Tebako runtime and application packages. Splitting and bundling.>> section.
516
+
865
517
  `--ref`::
866
518
  (optional)
867
519
  Defaults to `tebako-runtime`.
@@ -895,21 +547,20 @@ tebako press \
895
547
 
896
548
  ==== Setup
897
549
 
898
- This command sets up the Tebako packaging environment.
550
+ Tebako requires post-install setup after gem installation .
551
+ Post-intall setup is called automatically during the first packaging.
552
+ There is no need run setup manually unless you need pristine Tebako
553
+ packaging environment to implement caching strategy.
554
+ We recommended to build cache based on `tebako setup` output. Building cache
555
+ based on `tebako press` may create inconsistent environment upon restore.
556
+
899
557
 
900
- Collects required packages, builds the and creates packaging environment. This
558
+ Setup collects required packages, builds the and creates packaging environment. This
901
559
  is a lengthy task that can take significant time, up to 1 hour.
902
560
 
903
561
  Tebako supports several configurations at a single system given that their root
904
562
  directories differ and multiple Ruby versions within single configuration
905
563
 
906
- This command is optional, tebako creates packaging environment automatically
907
- upon the first invocation of press command.
908
-
909
- However, if you plan to use tebako in CI/CD environment with caching it is
910
- highly recommended to build cache based on `tebako setup` output. Building cache
911
- based on `tebako press` may create inconsistent environment upon restore.
912
-
913
564
  [source,sh]
914
565
  ----
915
566
  $ tebako setup \
@@ -965,7 +616,7 @@ tebako clean --prefix='~/.tebako'
965
616
  ----
966
617
  ====
967
618
 
968
-
619
+ <<clean_ruby>>
969
620
  ==== Clean Ruby
970
621
 
971
622
  This command cleans up only the Ruby artifacts from the specified prefix
@@ -1007,6 +658,7 @@ tebako clean_ruby --prefix='~/.tebako'
1007
658
  ----
1008
659
  ====
1009
660
 
661
+ <<hash>>
1010
662
  ==== Build script hash
1011
663
 
1012
664
  This command outputs a hash value for the Tebako build script, which can be used
@@ -1017,6 +669,117 @@ as a cache key in CI/CD pipelines.
1017
669
  $ tebako hash
1018
670
  ----
1019
671
 
672
+ === Using Docker
673
+
674
+ ==== General
675
+
676
+ If you have Docker installed and available, the easiest way to run Tebako is
677
+ through the official Docker containers.
678
+
679
+ Docker containers with preinstalled Tebako packaging environments for Ubuntu and
680
+ Alpine Linux are available at
681
+ https://github.com/tamatebako/tebako-ci-containers[tebako-ci-containers].
682
+
683
+
684
+ ==== Pull the container
685
+
686
+ Pull the Tebako container image.
687
+
688
+ [source,sh]
689
+ ----
690
+ docker pull ghcr.io/tamatebako/tebako-<container_tag>:latest
691
+ ----
692
+
693
+ `<container_tag>`:: is the desired image tag (e.g., `ubuntu-20.04` or `alpine-3.17`).
694
+
695
+
696
+ ==== Running Tebako commands in the container
697
+
698
+ Simply prefix the Tebako command with `docker run` and the container image.
699
+
700
+ [source,sh]
701
+ ----
702
+ docker run -v <application_folder>:/mnt/w \
703
+ -t ghcr.io/tamatebako/tebako-<container_tag>:latest \
704
+ tebako {command} {parameters}
705
+ ----
706
+
707
+ ==== Packaging from outside the container
708
+
709
+ To package your application from outside the container, just run a single Docker
710
+ command.
711
+
712
+ This command mounts the application folder into the container and runs the
713
+ `tebako press` command, specifying the application root, entry point, output
714
+ location, and Ruby version.
715
+
716
+ [source,sh]
717
+ ----
718
+ docker run -v <application_folder>:/mnt/w \
719
+ -t ghcr.io/tamatebako/tebako-<container_tag>:latest \
720
+ tebako press <tebako-press-parameters>
721
+ ----
722
+
723
+ `<application_folder>`:: is the path to your application folder.
724
+
725
+ `<container_tag>`:: is the desired image tag (e.g., `ubuntu-20.04` or `alpine-3.17`).
726
+
727
+
728
+ [example]
729
+ ====
730
+ Assume that you have a Ruby application in the `fontist` folder of the current
731
+ directory.
732
+
733
+ You can package it to `./fontist-package` using the following command:
734
+
735
+ [source,sh]
736
+ ----
737
+ docker run -v $PWD:/mnt/w \
738
+ -t ghcr.io/tamatebako/tebako-ubuntu-20.04:latest \
739
+ tebako press --root=/mnt/w/fontist --entry-point=fontist --output=/mnt/w/fontist-package --Ruby=3.2.4
740
+ ----
741
+ ====
742
+
743
+ ==== Packaging from inside the container
744
+
745
+ It is also possible to package an application from inside the Tebako container.
746
+
747
+ Start and enter the container interactively.
748
+
749
+ [source,sh]
750
+ ----
751
+ docker run -it --rm -v <application_folder>:/mnt/w \
752
+ ghcr.io/tamatebako/tebako-<container_tag>:latest bash
753
+ ----
754
+
755
+ `<application_folder>`:: is the path to your application folder.
756
+
757
+ `<container_tag>`:: is the desired image tag (e.g., `ubuntu-20.04` or `alpine-3.17`).
758
+
759
+
760
+ Once inside, run the `tebako press` command:
761
+
762
+ [source,sh]
763
+ ----
764
+ tebako press <tebako press parameters>
765
+ ----
766
+
767
+ [example]
768
+ ====
769
+ Assume that you have a Ruby application in the `fontist` folder of the current
770
+ directory.
771
+
772
+ You can package it to `./fontist-package` using the following command:
773
+
774
+ [source,sh]
775
+ ----
776
+ $ docker run -it --rm -v $PWD:/mnt/w ghcr.io/tamatebako/tebako-<container_tag>:latest bash
777
+
778
+ # Inside the container:
779
+ $ tebako press --root=/mnt/w/fontist --entry-point=fontist --output=/mnt/w/fontist-package --Ruby=3.2.4
780
+ ----
781
+ ====
782
+
1020
783
  === Tebako configuration file
1021
784
 
1022
785
  It is possible to provide all or some options for the `tebako
@@ -1047,7 +810,20 @@ options:
1047
810
  ----
1048
811
  ====
1049
812
 
1050
- === Options prefernce order
813
+ [[root-folder-selection]]
814
+ === Tebako root folder (aka prefix) selection
815
+
816
+ The Tebako prefix determines the base directory for the tebako packaging environment. It contain build artifacts for
817
+ Tebako run-time, libraries and other components and is an essential part of configuring how Tebako operates within your system.
818
+
819
+ The selection of the Tebako prefix follows a specific order of precedence to
820
+ ensure flexibility and ease of use as described in the next section.
821
+
822
+ Please do not use Tebako prefix under your application root (`--root` parameter). It is not an error
823
+ but it will cause Tebako to place all build-time artifacts to tebako package dramatically increasing its size.
824
+ You do not need it unless under very special circumstances like tebako packaging tebako itself.
825
+
826
+ === Options preference order
1051
827
 
1052
828
  Tebako supports several methods to set options. The table below show preference order and limitations for specific options.
1053
829
  samller order means higher proirity.
@@ -1139,115 +915,135 @@ and the bundler version requirements specified in the Gemfile.
1139
915
 
1140
916
  == Packaging scenarios
1141
917
 
1142
- Depending on the configuration files that are present in the root project folder, the Tebako Ruby packager supports different packaging scenarios.
918
+ There are two common methods for distributing a Ruby application:
1143
919
 
1144
- These scenarios differ in what files are packaged and where the entry point is located.
920
+ * Copying the entire directory tree of the application to the target system.
921
+ * Creating a Ruby gem from the application and publishing or distributing it
922
+ as a gem.
1145
923
 
1146
- Here is a summary of the scenarios:
924
+ Tebako supports both methods, but with an important distinction: during
925
+ packaging, it does not deploy the application to the target system. Instead,
926
+ it places it in a pristine Ruby environment that functions as an in-memory
927
+ filesystem ("memfs").
1147
928
 
1148
- [cols="a,2a,4a,3a,a,a,a"]
929
+ Regardless of the packaging scenario, Tebako requires two inputs:
930
+
931
+ * A root folder containing the application to be packaged.
932
+ * An entry point — a Ruby file that will be executed when the packaged
933
+ application starts.
934
+
935
+ The appropriate packaging scenario is determined by the contents of the
936
+ root folder:
937
+
938
+ [cols="3", options="header"]
1149
939
  |===
1150
- | Scenario | Description | Packaging | Entry point | `*.gemspec` | `Gemfile` | `*.gem`
940
+ | #
941
+ | Conditions
942
+ | Scenario Description
1151
943
 
1152
944
  | 1
1153
- | Simple ruby script
1154
- | Copy `<project-root>` with all sub-folders to packaged filesystem
1155
- | `<mount_point>/local/<entry_point base name>`
1156
- | No
1157
- | No
1158
- | No
1159
-
945
+ | No `Gemfile`, `.gemspec`, or `.gem` files
946
+ | <<1-simple-script,Simple Script>>
1160
947
 
1161
948
  | 2
1162
- | Packaged gem
1163
- | Install the gem with `gem install` to packaged filesystem
1164
- | `<mount_point>/bin/<entry_point base name>` (i.e., binstub is expected)
1165
- | No
1166
- | No
1167
- | One
1168
-
949
+ | `Gemfile` present, no `.gemspec` files
950
+ | <<2-bundled-project, Bundled Project>>
1169
951
 
1170
952
  | 3
1171
- | Gem source, no `bundler`
1172
- |
1173
- . Build the gem using `gem build` command at the host
1174
- . Install it with `gem install` to packaged filesystem
1175
-
1176
- | `<mount_point>/bin/<entry_point base name>` (i.e., binstub is expected)
1177
- | One
1178
- | No
1179
- | Any
1180
-
953
+ | `.gemspec` present, no `Gemfile`
954
+ | <<3-gem, Gem>>
1181
955
 
1182
956
  | 4
1183
- | Gem source, `bundler`
1184
- |
1185
- . Collect dependencies at the host with `bundle install`
1186
- . Build the gem using `gem build` command
1187
- . Install it with `gem install` to packaged file system
957
+ | Both `.gemspec` and `Gemfile` present
958
+ | <<4-bundled-gem, Bundled Gem>>
1188
959
 
1189
- | `<mount_point>/bin/<entry_point base name>` (i.e., binstub is expected)
1190
- | One
1191
- | One
1192
- | Any
960
+ | 5
961
+ | `.gem` files present, no `Gemfile` or `.gemspec`
962
+ | <<5-prebuilt-gem, Prebuilt Gem>>
1193
963
 
964
+ |===
1194
965
 
1195
- | Error
1196
- | Error: Two or more `*.gem` files present
1197
- | -
1198
- | -
1199
- | No
1200
- | No
1201
- | Two or more
966
+ === 1. Simple Script
967
+ If the root folder does not contain a `Gemfile`, `.gemspec`, or `.gem`
968
+ files, Tebako treats the application as a simple script.
1202
969
 
970
+ In this case:
1203
971
 
1204
- | Error
1205
- | Error: Two or more `*.gemspec` files present
1206
- | -
1207
- | -
1208
- | Two or more
1209
- | Any
1210
- | Any
972
+ * The entire root folder (including subdirectories) is copied to
973
+ `<memfs root>/local`.
974
+ * On startup, Tebako executes `<memfs root>/local/<entry point>`.
1211
975
 
1212
- |===
976
+ === 2. Bundled Project
977
+ If the root folder contains a `Gemfile` but no `.gemspec` files, the
978
+ application is considered a bundled project. This is common for Rails or
979
+ Sinatra projects.
1213
980
 
1214
- These scenarios determine how the project is packaged and where the entry point is located within the packaged filesystem.
981
+ In this scenario, Tebako:
1215
982
 
1216
- == Run-time options
983
+ * Runs `bundle install` using the provided `Gemfile` within the pristine
984
+ Ruby environment.
985
+ * Copies the root folder and all subdirectories to `<memfs root>/local`.
986
+ * Executes `<memfs root>/local/<entry point>` on startup.
1217
987
 
1218
- === General
988
+ === 3. Gem
989
+ If the root folder contains a `.gemspec` file but no `Gemfile`, Tebako
990
+ assumes it is packaging a gem.
1219
991
 
1220
- Generally Tebako package passes command line options to the packaged application.
992
+ In this case:
1221
993
 
1222
- [example]
1223
- ====
1224
- For example, if the package was created with the following command
994
+ * Tebako runs the following commands within the pristine Ruby environment:
1225
995
 
1226
996
  [source,sh]
1227
997
  ----
1228
- tebako press \
1229
- --root='~/projects/myproject' \
1230
- --entry=start.rb \
1231
- --output=/temp/myproject.tebako
998
+ gem build
999
+ gem install
1232
1000
  ----
1233
- running
1234
1001
 
1235
- [source,sh]
1236
- ----
1237
- /temp/myproject.tebako --option --parameter value
1238
- ----
1002
+ * The entry point is assumed to be one of the gem’s executables, placed in
1003
+ the binary folder during installation. Within Tebako’s in-memory
1004
+ filesystem, this folder is `<memfs root>/bin`.
1005
+ * On startup, Tebako executes `<memfs root>/bin/<entry point>`.
1239
1006
 
1240
- will be translated by Tebako bootstrap code to
1007
+ NOTE: Multiple `.gemspec` files in the root folder are not supported.
1008
+
1009
+ === 4. Bundled Gem
1010
+ If the root folder contains both a `.gemspec` file and a `Gemfile`, Tebako
1011
+ assumes it is packaging a bundled gem.
1012
+
1013
+ In this case:
1014
+
1015
+ * Tebako runs the following commands within the pristine Ruby environment:
1241
1016
 
1242
1017
  [source,sh]
1243
1018
  ----
1244
- myproject --option --parameter value
1019
+ bundle install
1020
+ bundle exec gem build
1021
+ bundle exec gem install
1245
1022
  ----
1246
- ====
1247
1023
 
1248
- However there are several command-line parameters that are intercepted processed
1249
- by Tebako bootstrap code as described below.
1024
+ * The entry point follows the same logic as in the Gem Packaging scenario
1025
+ (`<memfs root>/bin/<entry point>`).
1026
+
1027
+ NOTE: Multiple `.gemspec` files in the root folder are not supported.
1028
+
1029
+ === 5. Prebuilt Gem
1030
+ If the root folder contains `.gem` files but no `Gemfile` or `.gemspec`,
1031
+ Tebako assumes it is packaging prebuilt gems.
1250
1032
 
1033
+ In this case:
1034
+
1035
+ * Tebako runs `gem install` for all `.gem` files in the root folder, in
1036
+ a random order.
1037
+ * The entry point follows the same logic as in the Gem Packaging scenario
1038
+ (`<memfs root>/bin/<entry point>`).
1039
+
1040
+
1041
+ == Tebako runtime and application packages. Splitting and bundling.
1042
+
1043
+ === General
1044
+
1045
+ Tebako provides a method either to create a single bundle package that contains Ruby run-time and the application or create separate
1046
+ reusable runtime package and application package that can be deployed without a runtime.
1251
1047
 
1252
1048
  === Creating a bundle package
1253
1049
 
@@ -1394,10 +1190,68 @@ Hello, Maxim!
1394
1190
  ----
1395
1191
  ====
1396
1192
 
1193
+ == Packaging Ruby Gems with Post-Installation Requirements
1194
+
1195
+ Unlike the traditional approach to Ruby program distribution, Tebako is designed with a clear separation between the build and
1196
+ target environments. We assume that a Tebako package created in the build environment should remain independent of it and run unchanged
1197
+ in the target environment.
1198
+
1199
+ While this approach is appealing, it imposes certain limitations on some Ruby gems, including Tebako itself. Specifically, gems that
1200
+ require a post-installation setup step often establish a strong dependency on the target environment. This setup might involve installing
1201
+ native libraries, linking to existing system components, or otherwise relying on the target system’s configuration.
1202
+
1203
+ To be packaged by Tebako, gems that require post-installation setup must meet two additional requirements:
1204
+
1205
+ 1. *Ability to run post-installation setup from a read-only filesystem, outside the gem installation folder.*
1206
+ For example, Tebako uses the location specified by the `prefix` parameter to create any necessary files during post-installation.
1207
+
1208
+ 2. *Automatic execution of the post-installation setup when required.*
1209
+ For instance, when the `tebako press` command is executed, it first checks whether `tebako setup` has been run and triggers it if necessary.
1210
+
1211
+ By adhering to these principles, gems that require post-installation setup will not only be compatible with Tebako but will also provide a more
1212
+ robust and consistent runtime experience, allowing them to run seamlessly across different environments.
1213
+
1214
+
1215
+ == Run-time options
1216
+
1217
+ === General
1218
+
1219
+ Generally, Tebako packages pass command line options to the packaged application.
1220
+
1221
+ [example]
1222
+ ====
1223
+ For example, if the package was created with the following command
1224
+
1225
+ [source,sh]
1226
+ ----
1227
+ tebako press \
1228
+ --root='~/projects/myproject' \
1229
+ --entry=start.rb \
1230
+ --output=/temp/myproject.tebako
1231
+ ----
1232
+ running
1233
+
1234
+ [source,sh]
1235
+ ----
1236
+ /temp/myproject.tebako --option --parameter value
1237
+ ----
1238
+
1239
+ will be translated by Tebako bootstrap code to
1240
+
1241
+ [source,sh]
1242
+ ----
1243
+ myproject --option --parameter value
1244
+ ----
1245
+ ====
1246
+
1247
+ However, there are several command-line parameters that are intercepted and processed
1248
+ by Tebako bootstrap code as described below.
1249
+
1250
+
1397
1251
  === Image extraction (`--tebako-extract` option)
1398
1252
 
1399
1253
  Tebako provides an option to extract its DwarFS filesystem from a package to
1400
- a local folder for verification or execution.
1254
+ a local folder for verification or examination.
1401
1255
 
1402
1256
  [source,sh]
1403
1257
  ----
@@ -1450,11 +1304,11 @@ change the paths for temporary files, caches, and sockets.
1450
1304
  To address this inevitable limitation for Ruby applications,
1451
1305
  Tebako provides an option to mount a host folder to the memfs tree.
1452
1306
 
1453
- When using Tebako, consider the packaging scenario mentioned above, as it
1454
- defines the layout of the application tree.
1307
+ When using Tebako, be aware of how your application's directory structure is packaged,
1308
+ as this affects which paths may need mounting.
1455
1309
 
1456
- The `--tebako-extract` option may be useful for understanding the placement of
1457
- files and folders.
1310
+ You can use the `--tebako-extract` option described earlier to better understand
1311
+ your application's file structure before deciding which folders to mount.
1458
1312
 
1459
1313
  [example]
1460
1314
  ====
@@ -1479,8 +1333,8 @@ The `--tebako-mount` option has the following syntax:
1479
1333
  The `--tebako-mount` option can be repeated multiple times to mount more than
1480
1334
  one object. The `memfs path` is relative to the memfs root, and it is
1481
1335
  recommended to use absolute paths for host objects. Both directories and files
1482
- can be mounted in this way. Tebako allows overlaying existing memfs objects, so
1483
- there are no significant limitations.
1336
+ can be mounted in this way. Tebako allows you to overlay host directories on existing memfs objects,
1337
+ providing a flexible solution for handling read-write requirements in packaged applications.
1484
1338
 
1485
1339
  == Trivia: origin of name
1486
1340
 
@@ -1497,11 +1351,16 @@ Since "tamatebako" is rather long for the non-Japanese speaker, we use "tebako"
1497
1351
 
1498
1352
  == Contributing
1499
1353
 
1500
- We welcome contributions! Please see our contributing guidelines for more
1501
- information.
1354
+ We welcome contributions!
1355
+
1356
+ Please see our link:CONTRIBUTING.adoc[contribution guidelines] and our
1357
+ link:CODE_OF_CONDUCT.adoc[code of conduct] for more information,.
1358
+
1359
+ NOTE: Our guidelines are aligned with the contribution guidelines from the RNP project.
1502
1360
 
1503
1361
  == License
1504
1362
 
1505
1363
  Copyright Ribose. All rights reserved.
1506
1364
 
1507
- Tebako is released under the BSD 2-Clause License. See the LICENSE file for details.
1365
+ Tebako is released under the BSD 2-Clause License. See the
1366
+ link:LICENSE.md[LICENSE.md] file for details.