nixpkgs/pkgs/development/interpreters/ruby/gem.nix

137 lines
3.5 KiB
Nix
Raw Normal View History

2014-10-31 02:44:57 +01:00
{ lib, ruby, rubygemsFun, fetchurl, makeWrapper, git } @ defs:
lib.makeOverridable (
2014-08-08 00:13:56 +02:00
{ name
2014-10-31 02:44:57 +01:00
, ruby ? defs.ruby
, rubygems ? (rubygemsFun ruby)
2014-11-09 22:31:48 +01:00
, stdenv ? ruby.stdenv
2014-10-28 02:22:17 +01:00
, namePrefix ? "${ruby.name}" + "-"
2014-08-08 00:13:56 +02:00
, buildInputs ? []
2014-10-28 05:16:14 +01:00
, doCheck ? false
, dontBuild ? true
2014-08-08 00:13:56 +02:00
, meta ? {}
, gemPath ? []
, ...} @ attrs:
2014-11-09 22:31:48 +01:00
stdenv.mkDerivation (attrs // {
inherit ruby rubygems;
2014-08-08 00:13:56 +02:00
inherit doCheck;
2014-11-18 04:05:44 +01:00
buildInputs = [ ruby rubygems makeWrapper git ] ++ buildInputs;
2014-08-08 00:13:56 +02:00
name = namePrefix + name;
src = if attrs ? src
then attrs.src
else fetchurl {
url = "http://rubygems.org/downloads/${attrs.name}.gem";
inherit (attrs) sha256;
};
2015-01-15 03:19:53 +01:00
phases = [ "unpackPhase" "patchPhase" "buildPhase" "checkPhase" "installPhase" "fixupPhase" ];
2014-09-17 15:06:37 +02:00
# The source is expected to either be a gem package or a directory.
#
# - Gem packages are already built, so they don't even need to be unpacked.
# They will skip the buildPhase.
# - A directory containing the sources will need to go through all of the
# usual phases.
unpackPhase= ''
gemRegex="\.gem"
if [[ $src =~ $gemRegex ]]
then
runHook preUnpack
2015-01-15 03:19:53 +01:00
echo "source is a gem package, won't unpack"
2014-09-17 15:06:37 +02:00
gempkg=$src
dontBuild=1
runHook postUnpack
2014-08-13 21:13:27 +02:00
else
2014-09-17 15:06:37 +02:00
# Fall back to the original thing for everything else.
unpackPhase
2014-08-13 21:13:27 +02:00
fi
2014-08-08 00:13:56 +02:00
'';
2014-10-27 23:13:36 +01:00
checkPhase = "true";
2014-09-17 15:06:37 +02:00
buildPhase = ''
runHook preBuild
# TODO: Investigate. The complete working tree is touched by fetchgit.
if [ -d .git ]; then
git reset
fi
2015-01-15 03:19:53 +01:00
gemspec=$(find . -name '*.gemspec')
echo "found the following gemspecs:"
echo "$gemspec"
gemspec=$(echo "$gemspec" | head -n1)
echo "building $gemspec"
exec 3>&1
output=$(gem build $gemspec | tee >(cat - >&3))
exec 3>&-
2014-10-28 02:22:17 +01:00
2015-01-15 03:19:53 +01:00
gempkg=$(echo "$output" | grep -oP 'File: \K(.*)')
2014-09-17 15:06:37 +02:00
2015-01-15 03:19:53 +01:00
echo "gem package built: $gempkg"
2014-09-17 15:06:37 +02:00
runHook postBuild
'';
2014-08-08 00:13:56 +02:00
installPhase = ''
runHook preInstall
# NOTE: This does NOT build the unpacked gem, but installs $src directly.
# Gems that have not been downloaded from rubygems.org may need a
# separate buildPhase.
# --ignore-dependencies is necessary as rubygems otherwise always
# connects to the repository, thus breaking pure builds.
2014-11-02 23:05:37 +01:00
GEM_HOME=$out/${ruby.gemPath} \
2014-10-26 21:13:10 +01:00
gem install \
--local \
--force \
--http-proxy "http://nodtd.invalid" \
--ignore-dependencies \
--build-root "/" \
--backtrace \
2014-09-17 15:06:37 +02:00
$gempkg $gemFlags -- $buildFlags
2014-10-26 21:13:10 +01:00
2015-01-15 03:19:53 +01:00
# Yes, we really do need the $out/${ruby.gemPath}/cache.
# This is very important in order for many parts of RubyGems/Bundler to not blow up.
# See https://github.com/bundler/bundler/issues/3327
2014-08-08 00:13:56 +02:00
2014-11-02 23:05:37 +01:00
mkdir -p $out/bin
for prog in $out/${ruby.gemPath}/gems/*/bin/*; do
makeWrapper $prog $out/bin/$(basename $prog) \
--prefix GEM_PATH : "$out/${ruby.gemPath}:$GEM_PATH" \
2014-08-08 00:13:56 +02:00
--prefix RUBYLIB : "${rubygems}/lib" \
$extraWrapperFlags ''${extraWrapperFlagsArray[@]}
done
#--prefix RUBYOPT rubygems \
2014-08-08 00:13:56 +02:00
# looks like useless files which break build repeatability and consume space
2014-11-02 23:05:37 +01:00
rm -fv $out/${ruby.gemPath}/doc/*/*/created.rid || true
rm -fv $out/${ruby.gemPath}/gems/*/ext/*/mkmf.log || true
2014-08-08 00:13:56 +02:00
2014-08-08 03:46:17 +02:00
mkdir -p $out/nix-support
cat > $out/nix-support/setup-hook <<EOF
2014-10-28 02:22:17 +01:00
if [[ "\$GEM_PATH" != *$out* ]]; then
addToSearchPath GEM_PATH $out/${ruby.gemPath}
fi
2014-08-08 03:46:17 +02:00
EOF
2014-08-08 00:13:56 +02:00
runHook postInstall
'';
2014-08-08 00:13:56 +02:00
propagatedBuildInputs = gemPath;
propagatedUserEnvPkgs = gemPath;
2013-02-06 01:08:04 +01:00
2014-08-08 00:13:56 +02:00
passthru.isRubyGem = true;
inherit meta;
})
2014-10-31 02:44:57 +01:00
)