crystal: 0.23.0 -> 0.23.1

Due to https://github.com/crystal-lang/crystal/issues/4719,
when building Crystal with LLVM 4 with debug infos from prebuilt binary (w/ LLVM 3.8) will always be failed.
The temporary solution is to build a LLVM 4 version without debug info,
then use it to build Crystal with debug info on LLVM 4.

This will cause building phrase going longer then normal.
We can remove this hack after Crystal fix the issue.
This commit is contained in:
David Kuo 2017-10-01 02:44:39 +08:00 committed by Orivej Desh
parent d514aa5c6a
commit bc2ac2ae5e

View File

@ -1,8 +1,9 @@
{ stdenv, fetchurl, boehmgc, libatomic_ops, pcre, libevent, libiconv, llvm_4, makeWrapper }: { stdenv, fetchurl, boehmgc, libatomic_ops, pcre, libevent, libiconv, llvm_4, makeWrapper }:
stdenv.mkDerivation rec { stdenv.mkDerivation rec {
version = "0.23.0"; version = "0.23.1";
name = "crystal-${version}-1"; patch = "3";
name = "crystal-${version}-${patch}";
arch = arch =
{ {
"x86_64-linux" = "linux-x86_64"; "x86_64-linux" = "linux-x86_64";
@ -11,18 +12,18 @@ stdenv.mkDerivation rec {
}."${stdenv.system}" or (throw "system ${stdenv.system} not supported"); }."${stdenv.system}" or (throw "system ${stdenv.system} not supported");
prebuiltBinary = fetchurl { prebuiltBinary = fetchurl {
url = "https://github.com/crystal-lang/crystal/releases/download/${version}/crystal-${version}-1-${arch}.tar.gz"; url = "https://github.com/crystal-lang/crystal/releases/download/${version}/crystal-${version}-${patch}-${arch}.tar.gz";
sha256 = sha256 =
{ {
"x86_64-linux" = "0nhs7swbll8hrk15kmmywngkhij80x62axiskb1gjmiwvzhlh0qx"; "x86_64-linux" = "6a84cc866838ffa5250e28c3ce1a918a93f89c06393fe8cfd4068fcbbc66f3ab";
"i686-linux" = "03xp8d3lqflzzm26lpdn4yavj87qzgd6xyrqxp2pn9ybwrq8fx8a"; "i686-linux" = "268a39b8d37385ff60d113d4d9fc966472160faa1e3bbf7ae58860ab6678aceb";
"x86_64-darwin" = "1prz6c1gs8z7dgpdy2id2mjn1c8f5p2bf9b39985bav448njbyjz"; "x86_64-darwin" = "d3f964ebfc5cd48fad73ab2484ea2a00268812276293dd0f7e9c7d184c8aad8a";
}."${stdenv.system}" or (throw "system ${stdenv.system} not supported"); }."${stdenv.system}" or (throw "system ${stdenv.system} not supported");
}; };
src = fetchurl { src = fetchurl {
url = "https://github.com/crystal-lang/crystal/archive/${version}.tar.gz"; url = "https://github.com/crystal-lang/crystal/archive/${version}.tar.gz";
sha256 = "05ymwmjkl1b4m888p725kybpiap5ag2vj8l07d59j02inm5r0rcv"; sha256 = "8cf1b9a4eab29fca2f779ea186ae18f7ce444ce189c621925fa1a0c61dd5ff55";
}; };
# crystal on Darwin needs libiconv to build # crystal on Darwin needs libiconv to build
@ -46,27 +47,43 @@ stdenv.mkDerivation rec {
sourceRoot = "."; sourceRoot = ".";
fixPrebuiltBinary = if stdenv.isDarwin then '' fixPrebuiltBinary = if stdenv.isDarwin then ''
wrapProgram $(pwd)/crystal-${version}-1/embedded/bin/crystal \ wrapProgram $(pwd)/crystal-${version}-${patch}/embedded/bin/crystal \
--suffix DYLD_LIBRARY_PATH : $libPath --suffix DYLD_LIBRARY_PATH : $libPath
'' ''
else '' else ''
patchelf --set-interpreter $(cat $NIX_CC/nix-support/dynamic-linker) \ patchelf --set-interpreter $(cat $NIX_CC/nix-support/dynamic-linker) \
crystal-${version}-1/embedded/bin/crystal crystal-${version}-${patch}/embedded/bin/crystal
patchelf --set-rpath ${ stdenv.lib.makeLibraryPath [ stdenv.cc.cc ] } \ patchelf --set-rpath ${ stdenv.lib.makeLibraryPath [ stdenv.cc.cc ] } \
crystal-${version}-1/embedded/bin/crystal crystal-${version}-${patch}/embedded/bin/crystal
''; '';
newline = "\n";
buildPhase = '' buildPhase = ''
# patch the script which launches the prebuilt compiler # patch the script which launches the prebuilt compiler
substituteInPlace $(pwd)/crystal-${version}-1/bin/crystal --replace \ patchShebangs $(pwd)/crystal-${version}-${patch}/bin/crystal
"/usr/bin/env bash" "${stdenv.shell}" patchShebangs $(pwd)/crystal-${version}/bin/crystal
substituteInPlace $(pwd)/crystal-${version}/bin/crystal --replace \ # Due to https://github.com/crystal-lang/crystal/issues/4719,
"/usr/bin/env bash" "${stdenv.shell}" # when building Crystal with LLVM 4 with debug infos from prebuilt binary (w/ LLVM 3.8) will always be failed.
# So we are going to build a LLVM 4 version without debug info,
# and use it to build Crystal with debug info on LLVM 4.
substituteInPlace $(pwd)/crystal-${version}/Makefile --replace \
"release ?=" "no_debug ?= ##${newline}force_rebuild ?= ##${newline}release ?="
substituteInPlace $(pwd)/crystal-${version}/Makefile --replace \
"FLAGS := " "FLAGS := \$(if \$(no_debug),--no-debug )"
substituteInPlace $(pwd)/crystal-${version}/Makefile --replace \
"$(O)/crystal:" "\$(O)/crystal: \$(if \$(force_rebuild),../rebuild.tmp)"
${fixPrebuiltBinary} ${fixPrebuiltBinary}
cd crystal-${version} cd crystal-${version}
make release=1 PATH="../crystal-${version}-1/bin:$PATH" # Build without debug infos on LLVM 4
make release=1 no_debug=1 PATH="../crystal-${version}-${patch}/bin:$PATH"
# Rebuild Crystal with debug infos from the binary we just built
touch $(pwd)/../rebuild.tmp
wrapProgram .build/crystal \
--suffix LIBRARY_PATH : $libPath
make release=1 force_rebuild=1
make doc make doc
''; '';
@ -75,7 +92,6 @@ stdenv.mkDerivation rec {
wrapProgram $out/bin/crystal \ wrapProgram $out/bin/crystal \
--suffix CRYSTAL_PATH : $out/lib/crystal \ --suffix CRYSTAL_PATH : $out/lib/crystal \
--suffix LIBRARY_PATH : $libPath --suffix LIBRARY_PATH : $libPath
install -dm755 $out/lib/crystal install -dm755 $out/lib/crystal
cp -r src/* $out/lib/crystal/ cp -r src/* $out/lib/crystal/
@ -97,8 +113,7 @@ stdenv.mkDerivation rec {
description = "A compiled language with Ruby like syntax and type inference"; description = "A compiled language with Ruby like syntax and type inference";
homepage = https://crystal-lang.org/; homepage = https://crystal-lang.org/;
license = stdenv.lib.licenses.asl20; license = stdenv.lib.licenses.asl20;
maintainers = with stdenv.lib.maintainers; [ sifmelcara ]; maintainers = with stdenv.lib.maintainers; [ sifmelcara david50407 ];
platforms = [ "x86_64-linux" "i686-linux" "x86_64-darwin" ]; platforms = [ "x86_64-linux" "i686-linux" "x86_64-darwin" ];
}; };
} }