Wiki: https://fedoraproject.org/wiki/Changes/SplitRubyBuild
Discussion Thread: https://discussion.fedoraproject.org/t/177635 **This is a proposed Change for Fedora Linux.** This document represents a proposed Change. As part of the Changes process, proposals are publicly announced in order to receive community feedback. This proposal will only be implemented if approved by the Fedora Engineering Steering Committee. == Summary == The `ruby-build` package will be split into a main package and several subpackages (`ruby-build-jruby`, `ruby-build-truffleruby`, ...). This allows users to install only the build dependencies required for their specific Ruby implementation, significantly reducing the default installation size and dependency footprint. == Owner == * Name: [[User:mikelo2| Mikel Olasagasti]] * Email: [email protected] == Detailed Description == === Motivation === Currently, the `ruby-build` spec file utilizes a comprehensive list of `Recommends` to ensure all possible Ruby implementations can be built. This monolithic approach forces the package manager to pull in a massive dependency chain by default. For example, a default installation of `ruby-build` (which is a 323 KiB package) currently results in a transaction of 146 packages, requiring 404 MiB of downloads and occupying 2 GiB of disk space. <pre> # dnf install ruby-build Updating and loading repositories: Repositories loaded. Package Arch Version Repository Size Installing: ruby-build x86_64 0:20251023-1.fc44 rawhide 323.4 KiB Installing dependencies: alsa-lib x86_64 0:1.2.15-4.fc44 rawhide 1.5 MiB avahi-libs x86_64 0:0.9~rc2-6.fc43 rawhide 171.6 KiB binutils x86_64 0:2.45.50-9.fc44 rawhide 27.0 MiB clang-libs x86_64 0:21.1.7-1.fc44 rawhide 114.9 MiB clang-resource-filesystem x86_64 0:21.1.7-1.fc44 rawhide 15.3 KiB cmake-filesystem x86_64 0:3.31.10-3.fc44 rawhide 0.0 B cpp x86_64 0:15.2.1-5.fc44 rawhide 38.0 MiB cups-filesystem noarch 1:2.4.16-4.fc44 rawhide 0.0 B cups-libs x86_64 1:2.4.16-4.fc44 rawhide 618.4 KiB dbus-libs x86_64 1:1.16.0-4.fc43 rawhide 345.5 KiB ed x86_64 0:1.22.3-1.fc44 rawhide 148.9 KiB elfutils-debuginfod-client x86_64 0:0.194-2.fc44 rawhide 84.0 KiB expat x86_64 0:2.7.3-1.fc44 rawhide 301.1 KiB gcc x86_64 0:15.2.1-5.fc44 rawhide 111.9 MiB gcc-c++ x86_64 0:15.2.1-5.fc44 rawhide 41.4 MiB glibc-devel x86_64 0:2.42.9000-16.fc44 rawhide 2.3 MiB groff-base x86_64 0:1.23.0-11.fc44 rawhide 3.8 MiB info x86_64 0:7.2-7.fc44 rawhide 357.9 KiB jansson x86_64 0:2.14-3.fc43 rawhide 89.1 KiB javapackages-filesystem noarch 0:6.4.1-4.fc44 rawhide 2.0 KiB kernel-headers x86_64 0:6.19.0-0.rc1.15.fc44 rawhide 6.9 MiB libedit x86_64 0:3.1-57.20251016cvs.fc44 rawhide 240.2 KiB libedit-devel x86_64 0:3.1-57.20251016cvs.fc44 rawhide 59.4 KiB libmpc x86_64 0:1.3.1-8.fc43 rawhide 160.6 KiB libpkgconf x86_64 0:2.3.0-3.fc43 rawhide 78.1 KiB libstdc++-devel x86_64 0:15.2.1-5.fc44 rawhide 37.2 MiB libxcrypt-devel x86_64 0:4.5.2-2.fc44 rawhide 31.0 KiB libzstd-devel x86_64 0:1.5.7-3.fc44 rawhide 217.6 KiB lksctp-tools x86_64 0:1.0.21-2.fc44 rawhide 251.0 KiB llvm x86_64 0:21.1.7-1.fc44 rawhide 89.3 MiB llvm-filesystem x86_64 0:21.1.7-1.fc44 rawhide 0.0 B llvm-googletest x86_64 0:21.1.7-1.fc44 rawhide 2.4 MiB llvm-libs x86_64 0:21.1.7-1.fc44 rawhide 138.6 MiB llvm-static x86_64 0:21.1.7-1.fc44 rawhide 377.5 MiB llvm-test x86_64 0:21.1.7-1.fc44 rawhide 2.3 MiB make x86_64 1:4.4.1-11.fc43 rawhide 1.8 MiB mpdecimal x86_64 0:4.0.1-2.fc43 rawhide 217.2 KiB ncurses x86_64 0:6.5-8.20250614.fc44 rawhide 609.8 KiB ncurses-c++-libs x86_64 0:6.5-8.20250614.fc44 rawhide 153.6 KiB nspr x86_64 0:4.38.2-1.fc44 rawhide 315.5 KiB nss x86_64 0:3.119.0-1.fc44 rawhide 1.9 MiB nss-softokn x86_64 0:3.119.0-1.fc44 rawhide 2.0 MiB nss-softokn-freebl x86_64 0:3.119.0-1.fc44 rawhide 990.8 KiB nss-sysinit x86_64 0:3.119.0-1.fc44 rawhide 18.1 KiB nss-util x86_64 0:3.119.0-1.fc44 rawhide 204.8 KiB perl-AutoLoader noarch 0:5.74-520.fc43 rawhide 20.6 KiB perl-B x86_64 0:1.89-520.fc43 rawhide 501.3 KiB perl-Carp noarch 0:1.54-520.fc43 rawhide 46.6 KiB perl-Class-Struct noarch 0:0.68-520.fc43 rawhide 25.4 KiB perl-Data-Dumper x86_64 0:2.191-521.fc43 rawhide 115.6 KiB perl-Digest noarch 0:1.20-520.fc43 rawhide 35.3 KiB perl-Digest-MD5 x86_64 0:2.59-520.fc43 rawhide 59.7 KiB perl-DynaLoader x86_64 0:1.57-520.fc43 rawhide 32.1 KiB perl-Encode x86_64 4:3.21-520.fc43 rawhide 4.7 MiB perl-Errno x86_64 0:1.38-520.fc43 rawhide 8.4 KiB perl-Exporter noarch 0:5.79-520.fc43 rawhide 54.3 KiB perl-Fcntl x86_64 0:1.20-520.fc43 rawhide 48.8 KiB perl-File-Basename noarch 0:2.86-520.fc43 rawhide 14.0 KiB perl-File-Path noarch 0:2.18-521.fc44 rawhide 63.5 KiB perl-File-Temp noarch 1:0.231.200-1.fc44 rawhide 163.7 KiB perl-File-stat noarch 0:1.14-520.fc43 rawhide 12.5 KiB perl-FileHandle noarch 0:2.05-520.fc43 rawhide 9.4 KiB perl-Getopt-Long noarch 1:2.58-520.fc43 rawhide 144.5 KiB perl-Getopt-Std noarch 0:1.14-520.fc43 rawhide 11.2 KiB perl-HTTP-Tiny noarch 0:0.090-521.fc43 rawhide 154.4 KiB perl-IO x86_64 0:1.55-520.fc43 rawhide 147.4 KiB perl-IO-Socket-IP noarch 0:0.43-521.fc43 rawhide 100.3 KiB perl-IO-Socket-SSL noarch 0:2.095-2.fc43 rawhide 714.5 KiB perl-IPC-Open3 noarch 0:1.24-520.fc43 rawhide 27.7 KiB perl-MIME-Base32 noarch 0:1.303-24.fc43 rawhide 30.7 KiB perl-MIME-Base64 x86_64 0:3.16-520.fc43 rawhide 42.0 KiB perl-Net-SSLeay x86_64 0:1.94-11.fc43 rawhide 1.3 MiB perl-POSIX x86_64 0:2.23-520.fc43 rawhide 231.4 KiB perl-PathTools x86_64 0:3.94-520.fc43 rawhide 180.0 KiB perl-Pod-Escapes noarch 1:1.07-520.fc43 rawhide 24.9 KiB perl-Pod-Perldoc noarch 0:3.28.01-521.fc43 rawhide 163.7 KiB perl-Pod-Simple noarch 1:3.47-3.fc43 rawhide 565.3 KiB perl-Pod-Usage noarch 4:2.05-520.fc43 rawhide 86.3 KiB perl-Scalar-List-Utils x86_64 5:1.70-1.fc43 rawhide 144.9 KiB perl-SelectSaver noarch 0:1.02-520.fc43 rawhide 2.2 KiB perl-Socket x86_64 4:2.040-2.fc43 rawhide 120.3 KiB perl-Storable x86_64 1:3.37-521.fc43 rawhide 231.2 KiB perl-Symbol noarch 0:1.09-520.fc43 rawhide 6.8 KiB perl-Term-ANSIColor noarch 0:5.01-521.fc43 rawhide 97.5 KiB perl-Term-Cap noarch 0:1.18-520.fc43 rawhide 29.3 KiB perl-Text-ParseWords noarch 0:3.31-520.fc43 rawhide 13.6 KiB perl-Text-Tabs+Wrap noarch 0:2024.001-520.fc43 rawhide 22.6 KiB perl-Time-Local noarch 2:1.350-520.fc43 rawhide 69.0 KiB perl-URI noarch 0:5.34-2.fc44 rawhide 268.0 KiB perl-base noarch 0:2.27-520.fc43 rawhide 12.6 KiB perl-constant noarch 0:1.33-521.fc43 rawhide 26.2 KiB perl-if noarch 0:0.61.000-520.fc43 rawhide 5.8 KiB perl-interpreter x86_64 4:5.42.0-520.fc43 rawhide 118.6 KiB perl-libnet noarch 0:3.15-521.fc43 rawhide 289.4 KiB perl-libs x86_64 4:5.42.0-520.fc43 rawhide 11.5 MiB perl-locale noarch 0:1.13-520.fc43 rawhide 6.1 KiB perl-mro x86_64 0:1.29-520.fc43 rawhide 41.6 KiB perl-overload noarch 0:1.40-520.fc43 rawhide 71.6 KiB perl-overloading noarch 0:0.02-520.fc43 rawhide 4.9 KiB perl-parent noarch 1:0.244-520.fc43 rawhide 10.3 KiB perl-podlators noarch 1:6.0.2-520.fc43 rawhide 317.5 KiB perl-vars noarch 0:1.05-520.fc43 rawhide 3.9 KiB pkgconf x86_64 0:2.3.0-3.fc43 rawhide 88.5 KiB pkgconf-m4 noarch 0:2.3.0-3.fc43 rawhide 14.4 KiB pkgconf-pkg-config x86_64 0:2.3.0-3.fc43 rawhide 989.0 B python-pip-wheel noarch 0:25.3-1.fc44 rawhide 1.2 MiB python3 x86_64 0:3.14.2-1.fc44 rawhide 28.9 KiB python3-libs x86_64 0:3.14.2-1.fc44 rawhide 43.1 MiB ruby-default-gems noarch 0:3.4.7-28.fc44 rawhide 66.1 KiB ruby-libs x86_64 0:3.4.7-28.fc44 rawhide 15.1 MiB rubygem-io-console x86_64 0:0.8.1-28.fc44 rawhide 33.2 KiB rubygem-irb noarch 0:1.14.3-28.fc44 rawhide 290.3 KiB rubygem-json x86_64 0:2.15.1-1.fc44 rawhide 222.3 KiB rubygem-psych x86_64 0:5.2.2-28.fc44 rawhide 132.6 KiB rubygem-rbs x86_64 0:3.8.0-28.fc44 rawhide 5.0 MiB rubygem-rdoc noarch 0:6.14.2-201.fc44 rawhide 1.9 MiB rubygems noarch 0:3.6.9-28.fc44 rawhide 1.4 MiB rubypick noarch 0:1.1.1-23.fc43 rawhide 4.4 KiB rust-std-static x86_64 0:1.92.0-1.fc44 rawhide 165.6 MiB tzdata-java noarch 0:2025c-1.fc44 rawhide 100.2 KiB Installing weak dependencies: clang x86_64 0:21.1.7-1.fc44 rawhide 65.5 MiB compiler-rt x86_64 0:21.1.7-1.fc44 rawhide 41.0 MiB gdbm-devel x86_64 1:1.23-10.fc43 rawhide 82.0 KiB java-25-openjdk-headless x86_64 1:25.0.1.0.8-1.fc44 rawhide 236.3 MiB libatomic x86_64 0:15.2.1-5.fc44 rawhide 36.7 KiB libffi-devel x86_64 0:3.5.2-1.fc44 rawhide 33.9 KiB libomp x86_64 0:21.1.7-1.fc44 rawhide 2.8 MiB libomp-devel x86_64 0:21.1.7-1.fc44 rawhide 1.5 MiB libyaml-devel x86_64 0:0.2.5-17.fc43 rawhide 1.1 MiB llvm-devel x86_64 0:21.1.7-1.fc44 rawhide 33.5 MiB ncurses-devel x86_64 0:6.5-8.20250614.fc44 rawhide 893.4 KiB openssl-devel x86_64 1:3.5.4-1.fc44 rawhide 4.6 MiB patch x86_64 0:2.8-3.fc44 rawhide 226.6 KiB perl-File-Compare noarch 0:1.100.800-520.fc43 rawhide 5.6 KiB perl-FindBin noarch 0:1.54-520.fc43 rawhide 6.8 KiB perl-NDBM_File x86_64 0:1.18-520.fc43 rawhide 28.5 KiB python-unversioned-command noarch 0:3.14.2-1.fc44 rawhide 23.0 B readline-devel x86_64 0:8.3-2.fc43 rawhide 595.8 KiB ruby x86_64 0:3.4.7-28.fc44 rawhide 85.5 KiB ruby-bundled-gems x86_64 0:3.4.7-28.fc44 rawhide 2.2 MiB rubygem-bigdecimal x86_64 0:3.1.8-28.fc44 rawhide 134.7 KiB rubygem-bundler noarch 0:2.6.9-28.fc44 rawhide 1.5 MiB rubygem-rake noarch 0:13.3.0-101.fc43 rawhide 134.1 KiB rust x86_64 0:1.92.0-1.fc44 rawhide 93.5 MiB zlib-ng-compat-devel x86_64 0:2.3.2-2.fc44 rawhide 107.0 KiB Transaction Summary: Installing: 146 packages Total size of inbound packages is 404 MiB. Need to download 404 MiB. After this operation, 2 GiB extra will be used (install 2 GiB, remove 0 B). </pre> This includes heavy dependencies like `java-headless`, `rust`, `llvm`, and `clang`, even if the user only intends to build a standard MRI Ruby version. This is the content of the spec that pulls all those dependencies: <pre> # ruby-build can build various ruby interpreters from source, which in turn can # require additional dependencies Recommends: bzip2 Recommends: clang Recommends: gdbm-devel Recommends: java-headless Recommends: libffi-devel Recommends: libyaml-devel Recommends: llvm-devel Recommends: make Recommends: ncurses-devel Recommends: openssl-devel Recommends: patch Recommends: perl-File-Compare Recommends: perl-FindBin Recommends: readline-devel Recommends: ruby Recommends: rubygem-rake Recommends: rust Recommends: zlib-devel </pre> === Proposed Solution === The `ruby-build` package works by providing a collection of build definition files (simple text files) located in `/usr/share/ruby-build`. Each file defines how to download and compile a specific version of a Ruby interpreter like `3.2.2`, `jruby-9.4.0.0` or `truffleruby-22.3`. This proposal changes the packaging structure to split `ruby-build` into modular subpackages based on these definition types. Each subpackage will provide the necessary build dependencies for a specific subset of definition files, matched by naming patterns. This ensures that if a user only intends to build standard MRI Ruby, they are not forced to install the build chain for JRuby or TruffleRuby. The new package structure will be as follows: * **ruby-build (Main Package)** ** Would be a meta-package requiring `ruby-build-core` and recommending `ruby-build-ruby`. * **ruby-build-core** ** Contains the core binary (`/usr/bin/ruby-build`) and the man page. ** All target subpackages require this package and not `ruby-build` meta-package to avoid pulling `ruby-build-ruby` and its dependencies as recommended package. * **ruby-build-ruby** ** Targets standard MRI/CRuby versions (definitions matching `^[0-9]*`). ** Requires: `gcc`, `perl-interpreter`, `perl(FindBin)`, `perl(lib)`, `perl(IPC::Cmd)`, `perl(File::Compare)`, `perl(File::Copy)`, `zlib-ng-compat-devel`, `libffi-devel`, `libyaml-devel`. * **ruby-build-jruby** ** Targets JRuby versions (definitions matching `^jruby`). ** Requires: `java-latest-openjdk-headless`, `make`, `gcc-c++`. * **ruby-build-mruby** ** Targets mruby versions (definitions matching `^mruby`). ** Requires: `ruby`, `rubygem-rake`. * **ruby-build-picoruby** ** Targets PicoRuby versions (definitions matching `^pico`). ** Requires: `ruby`, `rubygem-rake`, `gcc`, `git-core`. * **ruby-build-truffleruby** ** Targets TruffleRuby versions (definitions matching `^truffle`). ** Requires: `gcc`, `libyaml-devel`. * **ruby-build-others** ** Targets less common implementations available via `rbenv install -L` (such as rbx, ree, etc.). ** Keeps the main dependency set clean. * **ruby-build-all** ** Metapackage to install all subpackages * **ruby-build-rbenv** ** Already exists ** Contains the ruby-build plugin for rbenv The dependency lists are optimized for modern releases of these Ruby implementations. == Feedback == == Benefit to Fedora == * Bloat Reduction: A default installation of `ruby-build` will drop from ~2 GiB to a few megabytes, respecting user resources. * Modularity: Users and CI/CD systems can install exactly what they need without pulling in the entire Java ecosystem or Rust toolchain unnecessarily. * Security: Reduces the attack surface on systems that do not need the JVM or legacy build tools. == Scope == * Proposal owners: Change the spec to create the subpackages. * Other developers: Nothing * Release engineering: Nothing * Policies and guidelines: N/A (not needed for this Change) * Trademark approval: N/A (not needed for this Change) * Alignment with the Fedora Strategy: == Upgrade/compatibility impact == * The new package `ruby-build-ruby` would be installed and multiple dependencies could be removed from the system automatically as nothing else may depend on them. * For users wanting to build a Ruby implementation other than CRuby would need to install the required subpackage to get the definitions. == Early Testing (Optional) == Test package available in Copr at https://copr.fedorainfracloud.org/coprs/mikelo2/split-ruby-build/ and code at https://src.fedoraproject.org/fork/mikelo2/rpms/ruby-build/commits/split-rubybuild == How To Test == 1. Install the package: `dnf copr enable mikelo2/split-ruby-build` `dnf install ruby-build` *Verify that it does NOT pull in `java-headless` or `rust` by default.* 2. Test Standard Ruby: `dnf install rbenv` `rbenv install 3.4.8` *This should work out of the box (via `ruby-build-ruby`).* 3. Test JRuby (Optional): `rbenv install jruby-9.4.0.0` *This should fail initially.* `dnf install ruby-build-jruby` `rbenv install jruby-9.4.0.0` *This should now succeed.* == User Experience == - Users will notice a significantly faster and smaller installation process for `ruby-build`. - Advanced users may need to manually install specific subpackages (like `ruby-build-truffleruby`) if they are working with non-standard Ruby implementations, but the vast majority of users (MRI Ruby) will see no change in workflow, only in disk savings. == Dependencies == N/A == Contingency Plan == * Contingency mechanism: Revert the changes to the spec file to the monolithic dependency list * Contingency deadline: Beta Freeze * Blocks release? No == Documentation == N/A (not a System Wide Change) == Release Notes == \n
-- _______________________________________________ devel-announce mailing list -- [email protected] To unsubscribe send an email to [email protected] Fedora Code of Conduct: https://docs.fedoraproject.org/en-US/project/code-of-conduct/ List Guidelines: https://fedoraproject.org/wiki/Mailing_list_guidelines List Archives: https://lists.fedoraproject.org/archives/list/[email protected] Do not reply to spam, report it: https://pagure.io/fedora-infrastructure/new_issue
-- _______________________________________________ devel mailing list -- [email protected] To unsubscribe send an email to [email protected] Fedora Code of Conduct: https://docs.fedoraproject.org/en-US/project/code-of-conduct/ List Guidelines: https://fedoraproject.org/wiki/Mailing_list_guidelines List Archives: https://lists.fedoraproject.org/archives/list/[email protected] Do not reply to spam, report it: https://pagure.io/fedora-infrastructure/new_issue
