From f59f04352aace7ba228695de0ec8e716ce82134f Mon Sep 17 00:00:00 2001 From: Doron Behar Date: Sun, 7 Jun 2020 10:19:16 +0300 Subject: [PATCH 1/2] ruby: Rename removeReferencesToCC flag to `!jitSupport` If JIT support is built in to ruby, there's no choice other then to leave this cc reference as is. removeReferencesToCC didn't do it's job completely since some time ago. That's why it was practically redundant - `lib/ruby/${version}//rbconfig.rb` still referenced cc. Removing this reference from `lib/ruby/${version}//rbconfig.rb` as well might lead to breakage in some Gems that require this feature. But, if JIT support is not desired, it should be safe enough to completely remove all cc references, both in lib/ruby/${version}//rbconfig.rb and in $out/lib/libruby.so . Hence now `rubyMinimal` has JIT support disabled and it has no references at all to stdenv.cc. --- .../development/interpreters/ruby/default.nix | 28 +++++++++++++++---- pkgs/top-level/all-packages.nix | 1 + 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/pkgs/development/interpreters/ruby/default.nix b/pkgs/development/interpreters/ruby/default.nix index 189be8945fa9..ec65eaad8ce3 100644 --- a/pkgs/development/interpreters/ruby/default.nix +++ b/pkgs/development/interpreters/ruby/default.nix @@ -44,11 +44,23 @@ let , groff, docSupport ? true , libyaml, yamlSupport ? true , libffi, fiddleSupport ? true - # ruby -e "puts RbConfig::CONFIG['configure_args']" - # puts a reference to the C compiler in the binary. - # This might be required by some gems at runtime, - # but we allow to strip it out for smaller closure size. - , removeReferencesTo, removeReferenceToCC ? true + # By default, ruby has 3 observed references to stdenv.cc: + # + # - If you run: + # ruby -e "puts RbConfig::CONFIG['configure_args']" + # - In: + # $out/${passthru.libPath}/${stdenv.targetPlatform.system}/rbconfig.rb + # Or (usually): + # $(nix-build -A ruby)/lib/ruby/2.6.0/x86_64-linux/rbconfig.rb + # - In $out/lib/libruby.so and/or $out/lib/libruby.dylib + # + # Since some Gems require JIT support, there's probably no + # escape from this reference. Hence, it was decided to enable this + # feature by default, as it's enabled by default by ruby's ./configure + # script. We do disable this feature though for the other cc references + # in all of the locations given above for the `rubyMinimal` build defined + # in all-packages.nix. + , removeReferencesTo, jitSupport ? true , autoreconfHook, bison, autoconf , buildEnv, bundler, bundix , libiconv, libobjc, libunwind, Foundation @@ -121,6 +133,7 @@ let configureFlags = ["--enable-shared" "--enable-pthread" "--with-soname=ruby-${version}"] ++ op useRailsExpress "--with-baseruby=${baseruby}/bin/ruby" + ++ op (!jitSupport) "--disable-jit-support" ++ op (!docSupport) "--disable-install-doc" ++ ops stdenv.isDarwin [ # on darwin, we have /usr/include/tk.h -- so the configure script detects @@ -157,11 +170,14 @@ let # Remove unnecessary groff reference from runtime closure, since it's big sed -i '/NROFF/d' $out/lib/ruby/*/*/rbconfig.rb ${ - lib.optionalString removeReferenceToCC '' + lib.optionalString (!jitSupport) '' # Get rid of the CC runtime dependency ${removeReferencesTo}/bin/remove-references-to \ -t ${stdenv.cc} \ $out/lib/libruby* + ${removeReferencesTo}/bin/remove-references-to \ + -t ${stdenv.cc} \ + $out/${passthru.libPath}/${stdenv.targetPlatform.system}/rbconfig.rb '' } # Bundler tries to create this directory diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index 2f06713de0a5..db6e59c003fb 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -10548,6 +10548,7 @@ in rubyMinimal = ruby.override { # gem support is minimal overhead rubygemsSupport = true; + jitSupport = false; useRailsExpress = false; zlibSupport = false; opensslSupport = false; From 9db44f61a78a3a1fea720de7465787383a52d010 Mon Sep 17 00:00:00 2001 From: Doron Behar Date: Sat, 13 Jun 2020 10:55:58 +0300 Subject: [PATCH 2/2] rubyMinimal: remove Due to being unused, and seemingly unusable, added appropriate release notes. --- nixos/doc/manual/release-notes/rl-2103.xml | 12 ++++++++++++ pkgs/development/interpreters/ruby/default.nix | 5 ++--- pkgs/top-level/aliases.nix | 1 + pkgs/top-level/all-packages.nix | 14 -------------- 4 files changed, 15 insertions(+), 17 deletions(-) diff --git a/nixos/doc/manual/release-notes/rl-2103.xml b/nixos/doc/manual/release-notes/rl-2103.xml index 709b2ba5228f..f857f1e28b79 100644 --- a/nixos/doc/manual/release-notes/rl-2103.xml +++ b/nixos/doc/manual/release-notes/rl-2103.xml @@ -89,6 +89,18 @@ user D-Bus session available also for non-graphical logins. + + + rubyMinimal was removed due to being unused and + unusable. The default ruby interpreter includes JIT support, which makes + it reference it's compiler. Since JIT support is probably needed by some + Gems, it was decided to enable this feature with all cc references by + default, and allow to build a Ruby derivation without references to cc, + by setting jitSupport = false; in an overlay. See + #90151 + for more info. + + The option has been renamed to diff --git a/pkgs/development/interpreters/ruby/default.nix b/pkgs/development/interpreters/ruby/default.nix index ec65eaad8ce3..cfd5c7e5180e 100644 --- a/pkgs/development/interpreters/ruby/default.nix +++ b/pkgs/development/interpreters/ruby/default.nix @@ -57,9 +57,8 @@ let # Since some Gems require JIT support, there's probably no # escape from this reference. Hence, it was decided to enable this # feature by default, as it's enabled by default by ruby's ./configure - # script. We do disable this feature though for the other cc references - # in all of the locations given above for the `rubyMinimal` build defined - # in all-packages.nix. + # script. If you'd like to have a ruby without reference to cc, setting + # jitSupport to false should remove all known references mentioned above. , removeReferencesTo, jitSupport ? true , autoreconfHook, bison, autoconf , buildEnv, bundler, bundix diff --git a/pkgs/top-level/aliases.nix b/pkgs/top-level/aliases.nix index f8228f457012..cebec0d5e52c 100644 --- a/pkgs/top-level/aliases.nix +++ b/pkgs/top-level/aliases.nix @@ -501,6 +501,7 @@ mapAliases ({ ruby_2_5_0 = throw "ruby_2_5_0 was deprecated on 2018-02-13: use a newer version of ruby"; rubyPackages_2_4 = throw "rubyPackages_2_4 was deprecated in 2019-12: use a newer version of rubyPackages instead"; rubygems = throw "rubygems was deprecated on 2016-03-02: rubygems is now bundled with ruby"; + rubyMinimal = throw "rubyMinimal was removed due to being unused"; rxvt_unicode-with-plugins = rxvt-unicode; # added 2020-02-02 rxvt_unicode = rxvt-unicode-unwrapped; # added 2020-02-02 urxvt_autocomplete_all_the_things = rxvt-unicode-plugins.autocomplete-all-the-things; # added 2020-02-02 diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index db6e59c003fb..8eae90ddc4c7 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -10545,20 +10545,6 @@ in ruby_2_6 ruby_2_7; - rubyMinimal = ruby.override { - # gem support is minimal overhead - rubygemsSupport = true; - jitSupport = false; - useRailsExpress = false; - zlibSupport = false; - opensslSupport = false; - gdbmSupport = false; - cursesSupport = false; - docSupport = false; - yamlSupport = false; - fiddleSupport = false; - }; - ruby = ruby_2_6; rubyPackages = rubyPackages_2_6;