2020-04-24 23:36:52 +00:00
{ stdenv , buildPackages , lib
, fetchurl , fetchpatch , fetchFromSavannah , fetchFromGitHub
, zlib , openssl , gdbm , ncurses , readline , groff , libyaml , libffi , autoreconfHook , bison
, autoconf , libiconv , libobjc , libunwind , Foundation
, buildEnv , bundler , bundix
, makeWrapper , buildRubyGem , defaultGemConfig , removeReferencesTo
} @ args :
let
op = lib . optional ;
ops = lib . optionals ;
opString = lib . optionalString ;
patchSet = import ./rvm-patchsets.nix { inherit fetchFromGitHub ; } ;
config = import ./config.nix { inherit fetchFromSavannah ; } ;
rubygems = import ./rubygems { inherit stdenv lib fetchurl fetchpatch ; } ;
# Contains the ruby version heuristics
rubyVersion = import ./ruby-version.nix { inherit lib ; } ;
# Needed during postInstall
buildRuby =
if stdenv . hostPlatform == stdenv . buildPlatform
then " $ o u t / b i n / r u b y "
else " ${ buildPackages . ruby } / b i n / r u b y " ;
generic = { version , sha256 }: let
ver = version ;
tag = ver . gitTag ;
atLeast27 = lib . versionAtLeast ver . majMin " 2 . 7 " ;
baseruby = self . override {
useRailsExpress = false ;
docSupport = false ;
rubygemsSupport = false ;
} ;
self = lib . makeOverridable (
{ stdenv , buildPackages , lib
, fetchurl , fetchpatch , fetchFromSavannah , fetchFromGitHub
, useRailsExpress ? true
, rubygemsSupport ? true
, zlib , zlibSupport ? true
, openssl , opensslSupport ? true
, gdbm , gdbmSupport ? true
, ncurses , readline , cursesSupport ? true
, groff , docSupport ? true
, libyaml , yamlSupport ? true
, libffi , fiddleSupport ? true
2020-11-19 00:13:47 +00:00
# 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. 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
2020-04-24 23:36:52 +00:00
, autoreconfHook , bison , autoconf
, buildEnv , bundler , bundix
, libiconv , libobjc , libunwind , Foundation
, makeWrapper , buildRubyGem , defaultGemConfig
} :
stdenv . mkDerivation rec {
pname = " r u b y " ;
inherit version ;
src = if useRailsExpress then fetchFromGitHub {
owner = " r u b y " ;
repo = " r u b y " ;
rev = tag ;
sha256 = sha256 . git ;
} else fetchurl {
url = " h t t p s : / / c a c h e . r u b y - l a n g . o r g / p u b / r u b y / ${ ver . majMin } / r u b y - ${ ver } . t a r . g z " ;
sha256 = sha256 . src ;
} ;
# Have `configure' avoid `/usr/bin/nroff' in non-chroot builds.
NROFF = if docSupport then " ${ groff } / b i n / n r o f f " else null ;
outputs = [ " o u t " ] ++ lib . optional docSupport " d e v d o c " ;
nativeBuildInputs = [ autoreconfHook bison ]
++ ( op docSupport groff )
++ op ( stdenv . buildPlatform != stdenv . hostPlatform ) buildPackages . ruby ;
buildInputs = [ autoconf ]
++ ( op fiddleSupport libffi )
++ ( ops cursesSupport [ ncurses readline ] )
++ ( op zlibSupport zlib )
++ ( op opensslSupport openssl )
++ ( op gdbmSupport gdbm )
++ ( op yamlSupport libyaml )
# Looks like ruby fails to build on darwin without readline even if curses
# support is not enabled, so add readline to the build inputs if curses
# support is disabled (if it's enabled, we already have it) and we're
# running on darwin
++ op ( ! cursesSupport && stdenv . isDarwin ) readline
++ ops stdenv . isDarwin [ libiconv libobjc libunwind Foundation ] ;
enableParallelBuilding = true ;
patches =
( import ./patchsets.nix {
inherit patchSet useRailsExpress ops fetchpatch ;
patchLevel = ver . patchLevel ;
} ) . ${ ver . majMinTiny } ;
postUnpack = opString rubygemsSupport ''
rm - rf $ sourceRoot / { lib , test } /rubygems *
cp - r $ { rubygems } /lib/rubygems * $ sourceRoot/lib
cp - r $ { rubygems } /test/rubygems $ sourceRoot/test
'' ;
postPatch = ''
sed - i configure . ac - e ' /config.guess/d '
cp - - remove-destination $ { config } /config.guess tool /
cp - - remove-destination $ { config } /config.sub tool /
2020-11-12 09:05:59 +00:00
# Make the build reproducible for ruby <= 2.7
# See https://github.com/ruby/io-console/commit/679a941d05d869f5e575730f6581c027203b7b26#diff-d8422f096931c58d4463e2489f62a228b0f24f0492950ba88c8c89a0d741cfe6
sed - i ext/io/console/io-console.gemspec - e ' /s \ .date/d '
2020-04-24 23:36:52 +00:00
'' ;
# Force the revision.h generation. Somehow `revision.tmp` is an empty
# file and because we don't add `git` to buildInputs, hence the check is
# always true.
# https://github.com/ruby/ruby/commit/97a5af62a318fcd93a4e5e4428d576c0280ddbae
buildFlags = lib . optionals atLeast27 [ " R E V I S I O N _ L A T E S T = 0 " ] ;
2020-08-20 17:08:02 +00:00
configureFlags = [ " - - e n a b l e - s h a r e d " " - - e n a b l e - p t h r e a d " " - - w i t h - s o n a m e = r u b y - ${ version } " ]
2020-04-24 23:36:52 +00:00
++ op useRailsExpress " - - w i t h - b a s e r u b y = ${ baseruby } / b i n / r u b y "
2020-11-19 00:13:47 +00:00
++ op ( ! jitSupport ) " - - d i s a b l e - j i t - s u p p o r t "
2020-04-24 23:36:52 +00:00
++ op ( ! docSupport ) " - - d i s a b l e - i n s t a l l - d o c "
++ ops stdenv . isDarwin [
# on darwin, we have /usr/include/tk.h -- so the configure script detects
# that tk is installed
" - - w i t h - o u t - e x t = t k "
# on yosemite, "generating encdb.h" will hang for a very long time without this flag
" - - w i t h - s e t j m p - t y p e = s e t j m p "
]
++ op ( stdenv . hostPlatform != stdenv . buildPlatform )
" - - w i t h - b a s e r u b y = ${ buildRuby } " ;
preConfigure = opString docSupport ''
configureFlagsArray + = ( " - - w i t h - r i d i r = $ d e v d o c / s h a r e / r i " )
'' ;
# fails with "16993 tests, 2229489 assertions, 105 failures, 14 errors, 89 skips"
# mostly TZ- and patch-related tests
# TZ- failures are caused by nix sandboxing, I didn't investigate others
doCheck = false ;
preInstall = ''
# Ruby installs gems here itself now.
mkdir - pv " $ o u t / ${ passthru . gemPath } "
export GEM_HOME = " $ o u t / ${ passthru . gemPath } "
'' ;
2021-02-05 17:12:51 +00:00
installFlags = lib . optional docSupport " i n s t a l l - d o c " ;
2020-04-24 23:36:52 +00:00
# Bundler tries to create this directory
postInstall = ''
# Remove unnecessary groff reference from runtime closure, since it's big
sed - i ' /NROFF/d ' $ out/lib/ruby /* / */ rbconfig . rb
$ {
2020-11-19 00:13:47 +00:00
lib . optionalString ( ! jitSupport ) ''
2020-04-24 23:36:52 +00:00
# Get rid of the CC runtime dependency
$ { removeReferencesTo } /bin/remove-references-to \
- t $ { stdenv . cc } \
$ out/lib/libruby *
2020-11-19 00:13:47 +00:00
$ { removeReferencesTo } /bin/remove-references-to \
- t $ { stdenv . cc } \
$ out / $ { passthru . libPath } / $ { stdenv . targetPlatform . system } /rbconfig.rb
2020-04-24 23:36:52 +00:00
''
}
# Bundler tries to create this directory
mkdir - p $ out/nix-support
cat > $ out/nix-support/setup-hook < < EOF
addGemPath ( ) {
addToSearchPath GEM_PATH \ $ 1 / $ { passthru . gemPath }
}
addRubyLibPath ( ) {
addToSearchPath RUBYLIB \ $ 1/lib/ruby/site_ruby
addToSearchPath RUBYLIB \ $ 1/lib/ruby/site_ruby / $ { ver . libDir }
addToSearchPath RUBYLIB \ $ 1/lib/ruby/site_ruby / $ { ver . libDir } / $ { stdenv . targetPlatform . system }
}
addEnvHooks " $ h o s t O f f s e t " addGemPath
addEnvHooks " $ h o s t O f f s e t " addRubyLibPath
EOF
rbConfig = $ ( find $ out/lib/ruby - name rbconfig . rb )
'' + o p S t r i n g d o c S u p p o r t ''
# Prevent the docs from being included in the closure
sed - i " s | \$ ( D E S T D I R ) $ d e v d o c | \$ ( d a t a r o o t d i r ) / \$ ( R I _ B A S E _ N A M E ) | " $ rbConfig
sed - i " s | ' - - w i t h - r i d i r = $ d e v d o c / s h a r e / r i ' | | " $ rbConfig
# Add rbconfig shim so ri can find docs
mkdir - p $ devdoc/lib/ruby/site_ruby
cp $ { ./rbconfig.rb } $ devdoc/lib/ruby/site_ruby/rbconfig.rb
'' + o p S t r i n g u s e R a i l s E x p r e s s ''
# Prevent the baseruby from being included in the closure.
sed - i ' / ^ CONFIG \ [ " B A S E R U B Y " \ ] /d ' $ rbConfig
sed - i " s | ' - - w i t h - b a s e r u b y = ${ baseruby } / b i n / r u b y ' | | " $ rbConfig
'' ;
2020-11-21 19:51:51 +00:00
disallowedRequisites = op ( ! jitSupport ) stdenv . cc . cc ;
2021-02-05 17:12:51 +00:00
meta = with lib ; {
2020-04-24 23:36:52 +00:00
description = " T h e R u b y l a n g u a g e " ;
homepage = " h t t p : / / w w w . r u b y - l a n g . o r g / e n / " ;
license = licenses . ruby ;
2020-10-07 09:15:18 +00:00
maintainers = with maintainers ; [ vrthra manveru marsam ] ;
2020-04-24 23:36:52 +00:00
platforms = platforms . all ;
} ;
passthru = rec {
version = ver ;
rubyEngine = " r u b y " ;
baseRuby = baseruby ;
libPath = " l i b / ${ rubyEngine } / ${ ver . libDir } " ;
gemPath = " l i b / ${ rubyEngine } / g e m s / ${ ver . libDir } " ;
devEnv = import ./dev.nix {
inherit buildEnv bundler bundix ;
ruby = self ;
} ;
inherit ( import ../../ruby-modules/with-packages {
inherit lib stdenv makeWrapper buildRubyGem buildEnv ;
gemConfig = defaultGemConfig ;
ruby = self ;
} ) withPackages gems ;
# deprecated 2016-09-21
majorVersion = ver . major ;
minorVersion = ver . minor ;
teenyVersion = ver . tiny ;
patchLevel = ver . patchLevel ;
} ;
}
) args ; in self ;
in {
ruby_2_5 = generic {
version = rubyVersion " 2 " " 5 " " 8 " " " ;
sha256 = {
src = " 1 6 m d 4 j s p j w i x j l b h x 3 p n d 5 i w p c a 0 7 p 2 3 g h k x k q d 8 2 s b c h w 3 x y 2 v c " ;
git = " 1 9 g k k 3 q 9 l 3 3 c w k f s p 5 k 8 f 8 f i p q 7 g k y q k q i r m 9 f a r b v y 4 2 5 5 1 9 r v 2 " ;
} ;
} ;
ruby_2_6 = generic {
version = rubyVersion " 2 " " 6 " " 6 " " " ;
sha256 = {
src = " 1 4 9 2 x 7 9 5 q z g p 3 z h p l 5 8 0 k d 1 s d p 5 0 n 5 h f s m p b f h d s q 2 r n x w y i 8 j r n " ;
git = " 1 j r 9 v 9 9 a 7 a w s s q m w 7 5 3 1 a f b x 4 a 8 i 9 x 5 y f q y f f h a 5 4 5 g 7 r 4 s 7 k j 5 0 " ;
} ;
} ;
ruby_2_7 = generic {
2020-10-07 09:15:18 +00:00
version = rubyVersion " 2 " " 7 " " 2 " " " ;
2020-04-24 23:36:52 +00:00
sha256 = {
2020-10-07 09:15:18 +00:00
src = " 1 m 6 3 4 6 1 m x i 3 f g 4 y 3 b s p b g m b 0 c k b b b 1 l d g f 9 x i 0 p i w k p f s k 8 0 c m v f " ;
git = " 0 k b g z n f 1 y p r f p 9 6 4 5 k 3 1 r a 5 f 4 7 5 7 b 7 f i c h z i 0 h d g 6 n x k j 9 0 8 5 3 s 0 " ;
2020-04-24 23:36:52 +00:00
} ;
} ;
}