dmd: Enable tests and integrate bootstrap into one derivation

- Merge bootstrap dmd into default derivation.
- Reenable all tests by using a fixed-output derivation for phobos tests because of network checks in sandbox mode.
- Adding supported platforms.
This commit is contained in:
Thomas Mader 2017-11-19 23:18:00 +01:00
parent 48dcf2620d
commit 54f1b753b3
3 changed files with 267 additions and 330 deletions

View File

@ -1,167 +0,0 @@
{ stdenv, fetchFromGitHub
, makeWrapper, unzip, which
, curl, tzdata
}:
stdenv.mkDerivation rec {
name = "dmd-${version}";
# This is the last version of dmd which is buildable without a D compiler.
# So we use this as a bootstrap version.
# The DMD frontend has been ported to D in 2.069.0 but idgen was already
# ported in 2.068.0.
version = "2.067.1";
srcs = [
(fetchFromGitHub {
owner = "dlang";
repo = "dmd";
rev = "v${version}";
sha256 = "0fm29lg8axfmzdaj0y6vg70lhwb5d9rv4aavnvdd15xjschinlcz";
name = "dmd-v${version}-src";
})
(fetchFromGitHub {
owner = "dlang";
repo = "druntime";
rev = "v${version}";
sha256 = "1n2qfw9kmnql0fk2nxikispqs7vh85nhvyyr00fk227n9lgnqf02";
name = "druntime-v${version}-src";
})
(fetchFromGitHub {
owner = "dlang";
repo = "phobos";
rev = "v${version}";
sha256 = "0fywgds9xvjcgnqxmpwr67p3wi2m535619pvj159cgwv5y0nr3p1";
name = "phobos-v${version}-src";
})
];
sourceRoot = ".";
postUnpack = ''
mv dmd-v${version}-src dmd
mv druntime-v${version}-src druntime
mv phobos-v${version}-src phobos
'';
# Compile with PIC to prevent colliding modules with binutils 2.28.
# https://issues.dlang.org/show_bug.cgi?id=17375
usePIC = "-fPIC";
ROOT_HOME_DIR = "$(echo ~root)";
postPatch = ''
# Ugly hack so the dlopen call has a chance to succeed.
# https://issues.dlang.org/show_bug.cgi?id=15391
substituteInPlace phobos/std/net/curl.d \
--replace libcurl.so ${curl.out}/lib/libcurl.so
# Ugly hack to fix the hardcoded path to zoneinfo in the source file.
# https://issues.dlang.org/show_bug.cgi?id=15391
substituteInPlace phobos/std/datetime.d \
--replace /usr/share/zoneinfo/ ${tzdata}/share/zoneinfo/
substituteInPlace druntime/test/shared/Makefile \
--replace "DFLAGS:=" "DFLAGS:=${usePIC} "
# phobos uses curl, so we need to patch the path to the lib.
substituteInPlace phobos/posix.mak \
--replace "-soname=libcurl.so.4" "-soname=${curl.out}/lib/libcurl.so.4"
# Use proper C++ compiler
substituteInPlace dmd/src/posix.mak \
--replace g++ $CXX
''
+ stdenv.lib.optionalString stdenv.hostPlatform.isLinux ''
substituteInPlace dmd/src/root/port.c \
--replace "#include <bits/mathdef.h>" "#include <complex.h>"
# See https://github.com/NixOS/nixpkgs/issues/29443
substituteInPlace phobos/std/path.d \
--replace "\"/root" "\"${ROOT_HOME_DIR}"
''
+ stdenv.lib.optionalString stdenv.hostPlatform.isDarwin ''
substituteInPlace dmd/src/posix.mak \
--replace MACOSX_DEPLOYMENT_TARGET MACOSX_DEPLOYMENT_TARGET_
# Was not able to compile on darwin due to "__inline_isnanl"
# being undefined.
substituteInPlace dmd/src/root/port.c --replace __inline_isnanl __inline_isnan
'';
nativeBuildInputs = [ makeWrapper unzip which ];
buildInputs = [ curl tzdata ];
# Buid and install are based on http://wiki.dlang.org/Building_DMD
buildPhase = ''
cd dmd
make -f posix.mak INSTALL_DIR=$out
export DMD=$PWD/src/dmd
cd ../druntime
make -f posix.mak PIC=${usePIC} INSTALL_DIR=$out DMD=$DMD
cd ../phobos
make -f posix.mak PIC=${usePIC} INSTALL_DIR=$out DMD=$DMD
cd ..
'';
# disable check phase because some tests are not working with sandboxing
doCheck = false;
checkPhase = ''
cd dmd
export DMD=$PWD/src/dmd
cd ../druntime
make -f posix.mak unittest PIC=${usePIC} DMD=$DMD BUILD=release
cd ../phobos
make -f posix.mak unittest PIC=${usePIC} DMD=$DMD BUILD=release
cd ..
'';
installPhase = ''
cd dmd
mkdir $out
mkdir $out/bin
cp $PWD/src/dmd $out/bin
mkdir -p $out/share/man/man1
mkdir -p $out/share/man/man5
cp -r docs/man/man1/* $out/share/man/man1/
cp -r docs/man/man5/* $out/share/man/man5/
cd ../druntime
mkdir $out/include
mkdir $out/include/d2
cp -r import/* $out/include/d2
cd ../phobos
mkdir $out/lib
${
let bits = builtins.toString stdenv.hostPlatform.parsed.cpu.bits;
osname = if stdenv.hostPlatform.isDarwin then "osx" else stdenv.hostPlatform.parsed.kernel.name;
extension = if stdenv.hostPlatform.isDarwin then "a" else "{a,so}"; in
"cp generated/${osname}/release/${bits}/libphobos2.${extension} $out/lib"
}
cp -r std $out/include/d2
cp -r etc $out/include/d2
wrapProgram $out/bin/dmd \
--prefix PATH ":" "${stdenv.cc}/bin" \
--set-default CC "$CC"
cd $out/bin
tee dmd.conf << EOF
[Environment]
DFLAGS=-I$out/include/d2 -L-L$out/lib ${stdenv.lib.optionalString (!stdenv.cc.isClang) "-L--export-dynamic"} -fPIC
EOF
'';
meta = with stdenv.lib; {
description = "Official reference compiler for the D language";
homepage = http://dlang.org/;
# Everything is now Boost licensed, even the backend.
# https://github.com/dlang/dmd/pull/6680
license = licenses.boost;
platforms = platforms.unix;
};
}

View File

@ -1,173 +1,287 @@
{ stdenv, fetchFromGitHub
{ stdenv, fetchFromGitHub, overrideCC, gcc5
, makeWrapper, unzip, which
, curl, tzdata, gdb, darwin
# Versions 2.070.2 and up require a working dmd compiler to build:
, bootstrapDmd }:
, callPackage
, bootstrapVersion ? false
, version ? "2.075.1"
, dmdSha256 ? "0kq6r8rcghvzk5jcphg89l85rg734s29bssd2rcw3fygx0k9a9k5"
, druntimeSha256 ? "0idn2v1lmp7hl637g3i7pdfj9mjk4sclkz4cm77nl8873k2fhk8j"
, phobosSha256 ? "1a7q5fd15yspgs5plxgx54jyrcwgzlyw3rahmz04jd2s5h56dj04"
}:
stdenv.mkDerivation rec {
name = "dmd-${version}";
version = "2.075.1";
let
srcs = [
(fetchFromGitHub {
owner = "dlang";
repo = "dmd";
rev = "v${version}";
sha256 = "0kq6r8rcghvzk5jcphg89l85rg734s29bssd2rcw3fygx0k9a9k5";
name = "dmd-v${version}-src";
})
(fetchFromGitHub {
owner = "dlang";
repo = "druntime";
rev = "v${version}";
sha256 = "0idn2v1lmp7hl637g3i7pdfj9mjk4sclkz4cm77nl8873k2fhk8j";
name = "druntime-v${version}-src";
})
(fetchFromGitHub {
owner = "dlang";
repo = "phobos";
rev = "v${version}";
sha256 = "1a7q5fd15yspgs5plxgx54jyrcwgzlyw3rahmz04jd2s5h56dj04";
name = "phobos-v${version}-src";
})
];
bootstrapDmd = if !bootstrapVersion then
# Versions 2.070.2 and up require a working dmd compiler to build so we just
# use the last dmd without any D code to bootstrap the actual build.
callPackage ./default.nix {
stdenv = if stdenv.hostPlatform.isDarwin then
stdenv
else
# Doesn't build with gcc6 on linux
overrideCC stdenv gcc5;
bootstrapVersion = true;
version = "2.067.1";
dmdSha256 = "0fm29lg8axfmzdaj0y6vg70lhwb5d9rv4aavnvdd15xjschinlcz";
druntimeSha256 = "1n2qfw9kmnql0fk2nxikispqs7vh85nhvyyr00fk227n9lgnqf02";
phobosSha256 = "0fywgds9xvjcgnqxmpwr67p3wi2m535619pvj159cgwv5y0nr3p1";
}
else
"";
sourceRoot = ".";
dmdBuild = stdenv.mkDerivation rec {
name = "dmdBuild-${version}";
inherit version;
postUnpack = ''
mv dmd-v${version}-src dmd
mv druntime-v${version}-src druntime
mv phobos-v${version}-src phobos
enableParallelBuilding = true;
# Remove cppa test for now because it doesn't work.
rm dmd/test/runnable/cppa.d
rm dmd/test/runnable/extra-files/cppb.cpp
'';
srcs = [
(fetchFromGitHub {
owner = "dlang";
repo = "dmd";
rev = "v${version}";
sha256 = dmdSha256;
name = "dmd";
})
(fetchFromGitHub {
owner = "dlang";
repo = "druntime";
rev = "v${version}";
sha256 = druntimeSha256;
name = "druntime";
})
(fetchFromGitHub {
owner = "dlang";
repo = "phobos";
rev = "v${version}";
sha256 = phobosSha256;
name = "phobos";
})
];
# Compile with PIC to prevent colliding modules with binutils 2.28.
# https://issues.dlang.org/show_bug.cgi?id=17375
usePIC = "-fPIC";
sourceRoot = ".";
postPatch = ''
# Ugly hack so the dlopen call has a chance to succeed.
# https://issues.dlang.org/show_bug.cgi?id=15391
substituteInPlace phobos/std/net/curl.d \
--replace libcurl.so ${curl.out}/lib/libcurl.so
postUnpack = ''
patchShebangs .
# Ugly hack to fix the hardcoded path to zoneinfo in the source file.
# https://issues.dlang.org/show_bug.cgi?id=15391
substituteInPlace phobos/std/datetime/timezone.d \
--replace /usr/share/zoneinfo/ ${tzdata}/share/zoneinfo/
substituteInPlace druntime/test/common.mak \
--replace "DFLAGS:=" "DFLAGS:=${usePIC} "
# phobos uses curl, so we need to patch the path to the lib.
substituteInPlace phobos/posix.mak \
--replace "-soname=libcurl.so.4" "-soname=${curl.out}/lib/libcurl.so.4"
# Use proper C++ compiler
substituteInPlace dmd/posix.mak \
--replace g++ $CXX
''
+ stdenv.lib.optionalString stdenv.hostPlatform.isDarwin ''
substituteInPlace dmd/posix.mak \
--replace MACOSX_DEPLOYMENT_TARGET MACOSX_DEPLOYMENT_TARGET_
# Remove cppa test for now because it doesn't work.
rm dmd/test/runnable/cppa.d
rm dmd/test/runnable/extra-files/cppb.cpp
'';
nativeBuildInputs = [ bootstrapDmd makeWrapper unzip which gdb ]
# Compile with PIC to prevent colliding modules with binutils 2.28.
# https://issues.dlang.org/show_bug.cgi?id=17375
usePIC = "-fPIC";
ROOT_HOME_DIR = "$(echo ~root)";
++ stdenv.lib.optional stdenv.hostPlatform.isDarwin (with darwin.apple_sdk.frameworks; [
Foundation
]);
datetimePath = if bootstrapVersion then
"phobos/std/datetime.d"
else
"phobos/std/datetime/timezone.d";
buildInputs = [ curl tzdata ];
phobosPatches = ''
substituteInPlace ${datetimePath} \
--replace "import core.time;" "import core.time;import std.path;"
# Buid and install are based on http://wiki.dlang.org/Building_DMD
buildPhase = ''
cd dmd
make -j$NIX_BUILD_CORES -f posix.mak INSTALL_DIR=$out
${
let bits = builtins.toString stdenv.hostPlatform.parsed.cpu.bits;
osname = if stdenv.hostPlatform.isDarwin then "osx" else stdenv.hostPlatform.parsed.kernel.name; in
"export DMD=$PWD/generated/${osname}/release/${bits}/dmd"
}
cd ../druntime
make -j$NIX_BUILD_CORES -f posix.mak PIC=${usePIC} INSTALL_DIR=$out DMD=$DMD
cd ../phobos
make -j$NIX_BUILD_CORES -f posix.mak PIC=${usePIC} INSTALL_DIR=$out DMD=$DMD
cd ..
'';
substituteInPlace ${datetimePath} \
--replace "tzName == \"leapseconds\"" "baseName(tzName) == \"leapseconds\""
# disable check phase because some tests are not working with sandboxing
doCheck = false;
# Ugly hack to fix the hardcoded path to zoneinfo in the source file.
# https://issues.dlang.org/show_bug.cgi?id=15391
substituteInPlace ${datetimePath} \
--replace /usr/share/zoneinfo/ ${tzdata}/share/zoneinfo/
checkPhase = ''
cd dmd
${
let bits = builtins.toString stdenv.hostPlatform.parsed.cpu.bits;
osname = if stdenv.hostPlatform.isDarwin then "osx" else stdenv.hostPlatform.parsed.kernel.name; in
"export DMD=$PWD/generated/${osname}/release/${bits}/dmd"
}
make -j$NIX_BUILD_CORES -C test -f Makefile PIC=${usePIC} DMD=$DMD BUILD=release SHARED=0
cd ../druntime
make -j$NIX_BUILD_CORES -f posix.mak unittest PIC=${usePIC} DMD=$DMD BUILD=release
cd ../phobos
make -j$NIX_BUILD_CORES -f posix.mak unittest PIC=${usePIC} DMD=$DMD BUILD=release
cd ..
'';
# Ugly hack so the dlopen call has a chance to succeed.
# https://issues.dlang.org/show_bug.cgi?id=15391
substituteInPlace phobos/std/net/curl.d \
--replace libcurl.so ${curl.out}/lib/libcurl.so
# phobos uses curl, so we need to patch the path to the lib.
substituteInPlace phobos/posix.mak \
--replace "-soname=libcurl.so.4" "-soname=${curl.out}/lib/libcurl.so.4"
''
+ stdenv.lib.optionalString (bootstrapVersion) ''
substituteInPlace ${datetimePath} \
--replace "import std.traits;" "import std.traits;import std.path;"
substituteInPlace ${datetimePath} \
--replace "tzName == \"+VERSION\"" "baseName(tzName) == \"leapseconds\" || tzName == \"+VERSION\""
''
+ stdenv.lib.optionalString stdenv.hostPlatform.isLinux ''
# See https://github.com/NixOS/nixpkgs/issues/29443
substituteInPlace phobos/std/path.d \
--replace "\"/root" "\"${ROOT_HOME_DIR}"
'';
dmdPath = if bootstrapVersion then
"dmd/src"
else
"dmd";
postPatch = ''
# Use proper C++ compiler
substituteInPlace ${dmdPath}/posix.mak \
--replace g++ $CXX
# TODO
substituteInPlace druntime/src/core/memory.d \
--replace "assert(z is null);" "//assert(z is null);"
''
+ stdenv.lib.optionalString (!bootstrapVersion) ''
substituteInPlace druntime/test/common.mak \
--replace "DFLAGS:=" "DFLAGS:=${usePIC} "
''
+ phobosPatches
+ stdenv.lib.optionalString (stdenv.hostPlatform.isLinux && bootstrapVersion) ''
substituteInPlace ${dmdPath}/root/port.c \
--replace "#include <bits/mathdef.h>" "#include <complex.h>"
''
+ stdenv.lib.optionalString stdenv.hostPlatform.isDarwin ''
substituteInPlace ${dmdPath}/posix.mak \
--replace MACOSX_DEPLOYMENT_TARGET MACOSX_DEPLOYMENT_TARGET_
''
+ stdenv.lib.optionalString (stdenv.hostPlatform.isDarwin && bootstrapVersion) ''
# Was not able to compile on darwin due to "__inline_isnanl"
# being undefined.
substituteInPlace ${dmdPath}/root/port.c --replace __inline_isnanl __inline_isnan
'';
nativeBuildInputs = [ bootstrapDmd makeWrapper unzip which gdb ]
++ stdenv.lib.optional stdenv.hostPlatform.isDarwin (with darwin.apple_sdk.frameworks; [
Foundation
]);
buildInputs = [ curl tzdata ];
bits = builtins.toString stdenv.hostPlatform.parsed.cpu.bits;
osname = if stdenv.hostPlatform.isDarwin then
"osx"
else
stdenv.hostPlatform.parsed.kernel.name;
top = "$(echo $NIX_BUILD_TOP)";
pathToDmd = if bootstrapVersion then
"${top}/dmd/src/dmd"
else
"${top}/dmd/generated/${osname}/release/${bits}/dmd";
# Buid and install are based on http://wiki.dlang.org/Building_DMD
buildPhase = ''
cd dmd
make -j$NIX_BUILD_CORES -f posix.mak INSTALL_DIR=$out
cd ../druntime
make -j$NIX_BUILD_CORES -f posix.mak PIC=1 INSTALL_DIR=$out DMD=${pathToDmd}
cd ../phobos
make -j$NIX_BUILD_CORES -f posix.mak PIC=1 INSTALL_DIR=$out DMD=${pathToDmd}
cd ..
'';
doCheck = !bootstrapVersion;
checkPhase = ''
cd dmd
make -j$NIX_BUILD_CORES -C test -f Makefile PIC=1 DMD=${pathToDmd} BUILD=release SHARED=0 SHELL=$SHELL
cd ../druntime
make -j$NIX_BUILD_CORES -f posix.mak unittest PIC=1 DMD=${pathToDmd} BUILD=release
cd ..
'';
extension = if stdenv.hostPlatform.isDarwin then "a" else "{a,so}";
installPhase = ''
cd dmd
mkdir $out
mkdir $out/bin
cp ${pathToDmd} $out/bin
mkdir -p $out/share/man/man1
mkdir -p $out/share/man/man5
cp -r docs/man/man1/* $out/share/man/man1/
cp -r docs/man/man5/* $out/share/man/man5/
cd ../druntime
mkdir $out/include
mkdir $out/include/d2
cp -r import/* $out/include/d2
cd ../phobos
mkdir $out/lib
cp generated/${osname}/release/${bits}/libphobos2.${extension} $out/lib
cp -r std $out/include/d2
cp -r etc $out/include/d2
wrapProgram $out/bin/dmd \
--prefix PATH ":" "${stdenv.cc}/bin" \
--set-default CC "$CC"
cd $out/bin
tee dmd.conf << EOF
[Environment]
DFLAGS=-I$out/include/d2 -L-L$out/lib ${stdenv.lib.optionalString (!stdenv.cc.isClang) "-L--export-dynamic"} -fPIC
EOF
'';
meta = with stdenv.lib; {
description = "Official reference compiler for the D language";
homepage = http://dlang.org/;
# Everything is now Boost licensed, even the backend.
# https://github.com/dlang/dmd/pull/6680
license = licenses.boost;
maintainers = with maintainers; [ ThomasMader ];
platforms = [ "x86_64-linux" "i686-linux" "x86_64-darwin" ];
};
};
# Need to test Phobos in a fixed-output derivation, otherwise the
# network stuff in Phobos would fail if sandbox mode is enabled.
phobosUnittests = stdenv.mkDerivation rec {
name = "phobosUnittests-${version}";
version = dmdBuild.version;
enableParallelBuilding = dmdBuild.enableParallelBuilding;
preferLocalBuild = true;
inputString = dmdBuild.outPath;
outputHashAlgo = "sha256";
outputHash = builtins.hashString "sha256" inputString;
srcs = dmdBuild.srcs;
sourceRoot = ".";
postPatch = dmdBuild.phobosPatches;
nativeBuildInputs = dmdBuild.nativeBuildInputs;
buildInputs = dmdBuild.buildInputs;
buildPhase = ''
cd phobos
make -j$NIX_BUILD_CORES -f posix.mak unittest PIC=1 DMD=${dmdBuild}/bin/dmd BUILD=release
'';
installPhase = ''
echo -n $inputString > $out
'';
};
in
stdenv.mkDerivation rec {
inherit phobosUnittests;
name = "dmd-${version}";
phases = "installPhase";
installPhase = ''
cd dmd
mkdir $out
mkdir $out/bin
${
let bits = builtins.toString stdenv.hostPlatform.parsed.cpu.bits;
osname = if stdenv.hostPlatform.isDarwin then "osx" else stdenv.hostPlatform.parsed.kernel.name; in
"cp $PWD/generated/${osname}/release/${bits}/dmd $out/bin"
}
mkdir -p $out/share/man/man1
mkdir -p $out/share/man/man5
cp -r docs/man/man1/* $out/share/man/man1/
cp -r docs/man/man5/* $out/share/man/man5/
cd ../druntime
mkdir $out/include
mkdir $out/include/d2
cp -r import/* $out/include/d2
cd ../phobos
mkdir $out/lib
${
let bits = builtins.toString stdenv.hostPlatform.parsed.cpu.bits;
osname = if stdenv.hostPlatform.isDarwin then "osx" else stdenv.hostPlatform.parsed.kernel.name;
extension = if stdenv.hostPlatform.isDarwin then "a" else "{a,so}"; in
"cp generated/${osname}/release/${bits}/libphobos2.${extension} $out/lib"
}
cp -r std $out/include/d2
cp -r etc $out/include/d2
wrapProgram $out/bin/dmd \
--prefix PATH ":" "${stdenv.cc}/bin" \
--set-default CC "$CC"
cd $out/bin
tee dmd.conf << EOF
[Environment]
DFLAGS=-I$out/include/d2 -L-L$out/lib ${stdenv.lib.optionalString (!stdenv.cc.isClang) "-L--export-dynamic"} -fPIC
EOF
mkdir $out
cp -r --symbolic-link ${dmdBuild}/* $out/
'';
meta = with stdenv.lib; {
description = "Official reference compiler for the D language";
homepage = http://dlang.org/;
# Everything is now Boost licensed, even the backend.
# https://github.com/dlang/dmd/pull/6680
license = licenses.boost;
maintainers = with maintainers; [ ThomasMader ];
platforms = platforms.unix;
};
}

View File

@ -1768,17 +1768,7 @@ with pkgs;
dleyna-server = callPackage ../development/libraries/dleyna-server { };
dmd_2_067_1 = callPackage ../development/compilers/dmd/2.067.1.nix {
stdenv = if stdenv.hostPlatform.isDarwin then
stdenv
else
# Doesn't build with gcc6 on linux
overrideCC stdenv gcc5;
};
dmd = callPackage ../development/compilers/dmd {
bootstrapDmd = dmd_2_067_1;
};
dmd = callPackage ../development/compilers/dmd { };
dmg2img = callPackage ../tools/misc/dmg2img { };