2015-01-07 19:31:32 +00:00
|
|
|
{ stdenv, fetchurl, ghc, pkgconfig, glibcLocales, coreutils, gnugrep, gnused
|
2015-01-13 21:15:29 +00:00
|
|
|
, jailbreak-cabal, hscolour, cpphs
|
2015-01-07 19:31:32 +00:00
|
|
|
}:
|
|
|
|
|
2015-01-10 08:12:37 +00:00
|
|
|
{ pname
|
|
|
|
, version
|
|
|
|
, sha256 ? null
|
2015-01-07 19:31:32 +00:00
|
|
|
, src ? fetchurl { url = "mirror://hackage/${pname}-${version}.tar.gz"; inherit sha256; }
|
|
|
|
, buildDepends ? []
|
|
|
|
, buildTools ? []
|
2015-01-10 08:12:37 +00:00
|
|
|
, configureFlags ? []
|
|
|
|
, description ? ""
|
|
|
|
, doCheck ? stdenv.lib.versionOlder "7.4" ghc.version
|
2015-01-09 18:35:17 +00:00
|
|
|
, doHoogle ? true
|
2015-01-10 08:12:37 +00:00
|
|
|
, editedCabalFile ? null
|
2015-01-07 19:31:32 +00:00
|
|
|
, enableLibraryProfiling ? false
|
|
|
|
, enableSharedExecutables ? stdenv.lib.versionOlder "7.7" ghc.version
|
|
|
|
, enableSharedLibraries ? stdenv.lib.versionOlder "7.7" ghc.version
|
|
|
|
, enableSplitObjs ? !stdenv.isDarwin # http://hackage.haskell.org/trac/ghc/ticket/4013
|
|
|
|
, enableStaticLibraries ? true
|
2015-01-10 08:12:37 +00:00
|
|
|
, extraLibraries ? []
|
2015-01-07 19:31:32 +00:00
|
|
|
, homepage ? "http://hackage.haskell.org/package/${pname}"
|
|
|
|
, hydraPlatforms ? ghc.meta.hydraPlatforms or ghc.meta.platforms
|
2015-01-10 08:12:37 +00:00
|
|
|
, hyperlinkSource ? true
|
|
|
|
, isExecutable ? false, isLibrary ? !isExecutable
|
|
|
|
, jailbreak ? false
|
|
|
|
, license
|
2015-01-07 19:31:32 +00:00
|
|
|
, maintainers ? []
|
2015-01-10 08:12:37 +00:00
|
|
|
, noHaddock ? false
|
2015-01-07 19:31:32 +00:00
|
|
|
, passthru ? {}
|
2015-01-10 08:12:37 +00:00
|
|
|
, pkgconfigDepends ? []
|
|
|
|
, platforms ? ghc.meta.platforms
|
|
|
|
, testDepends ? []
|
|
|
|
, testTarget ? ""
|
|
|
|
, broken ? false
|
|
|
|
, patches ? [], patchPhase ? "", prePatch ? "", postPatch ? ""
|
|
|
|
, preConfigure ? "", postConfigure ? ""
|
|
|
|
, preBuild ? "", postBuild ? ""
|
|
|
|
, preInstall ? "", postInstall ? ""
|
|
|
|
, checkPhase ? "", preCheck ? "", postCheck ? ""
|
|
|
|
, preFixup ? "", postFixup ? ""
|
2015-01-13 21:15:29 +00:00
|
|
|
, coreSetup ? false # Use only core packages to build Setup.hs.
|
|
|
|
, useCpphs ? stdenv.isDarwin
|
2015-01-07 19:31:32 +00:00
|
|
|
}:
|
|
|
|
|
|
|
|
assert pkgconfigDepends != [] -> pkgconfig != null;
|
|
|
|
|
|
|
|
let
|
|
|
|
|
|
|
|
inherit (stdenv.lib) optional optionals optionalString versionOlder
|
2015-01-10 08:12:37 +00:00
|
|
|
concatStringsSep enableFeature optionalAttrs;
|
2015-01-07 19:31:32 +00:00
|
|
|
|
|
|
|
defaultSetupHs = builtins.toFile "Setup.hs" ''
|
|
|
|
import Distribution.Simple
|
|
|
|
main = defaultMain
|
|
|
|
'';
|
|
|
|
|
|
|
|
defaultConfigureFlags = [
|
|
|
|
(enableFeature enableSplitObjs "split-objs")
|
|
|
|
(enableFeature enableLibraryProfiling "library-profiling")
|
|
|
|
(enableFeature enableSharedLibraries "shared")
|
|
|
|
(optionalString (versionOlder "7" ghc.version) (enableFeature enableStaticLibraries "library-vanilla"))
|
|
|
|
(optionalString (versionOlder "7.4" ghc.version) (enableFeature enableSharedExecutables "executable-dynamic"))
|
|
|
|
(optionalString (versionOlder "7" ghc.version) (enableFeature doCheck "tests"))
|
|
|
|
];
|
|
|
|
|
|
|
|
hasActiveLibrary = isLibrary && (enableStaticLibraries || enableSharedLibraries);
|
|
|
|
|
|
|
|
newCabalFile = fetchurl {
|
|
|
|
url = "http://hackage.haskell.org/package/${pname}-${version}/${pname}.cabal";
|
|
|
|
sha256 = editedCabalFile;
|
|
|
|
};
|
|
|
|
|
2015-01-10 12:23:04 +00:00
|
|
|
isHaskellPkg = x: (x ? pname) && (x ? version);
|
|
|
|
isSystemPkg = x: !isHaskellPkg x;
|
|
|
|
|
|
|
|
allBuildInputs = stdenv.lib.filter (x: x != null) (
|
|
|
|
buildDepends ++ extraLibraries ++ buildTools ++
|
|
|
|
optionals (pkgconfigDepends != []) ([pkgconfig] ++ pkgconfigDepends) ++
|
|
|
|
optionals doCheck testDepends
|
|
|
|
);
|
|
|
|
haskellBuildInputs = stdenv.lib.filter isHaskellPkg allBuildInputs;
|
|
|
|
systemBuildInputs = stdenv.lib.filter isSystemPkg allBuildInputs;
|
|
|
|
|
2015-01-11 10:59:47 +00:00
|
|
|
ghcEnv = ghc.withPackages (p: haskellBuildInputs);
|
|
|
|
|
2015-01-07 19:31:32 +00:00
|
|
|
in
|
2015-01-10 08:12:37 +00:00
|
|
|
stdenv.mkDerivation ({
|
2015-01-07 19:31:32 +00:00
|
|
|
name = "${optionalString hasActiveLibrary "haskell-"}${pname}-${version}";
|
|
|
|
|
|
|
|
inherit src;
|
|
|
|
|
|
|
|
nativeBuildInputs = extraLibraries ++ buildTools ++
|
|
|
|
optionals (pkgconfigDepends != []) ([pkgconfig] ++ pkgconfigDepends) ++
|
2015-01-10 22:54:30 +00:00
|
|
|
optionals doCheck testDepends ++
|
|
|
|
optionals (!hasActiveLibrary) buildDepends;
|
|
|
|
propagatedNativeBuildInputs = optionals hasActiveLibrary buildDepends;
|
2015-01-07 19:31:32 +00:00
|
|
|
|
|
|
|
# GHC needs the locale configured during the Haddock phase.
|
|
|
|
LANG = "en_US.UTF-8";
|
|
|
|
LOCALE_ARCHIVE = optionalString stdenv.isLinux "${glibcLocales}/lib/locale/locale-archive";
|
|
|
|
|
|
|
|
configurePhase = ''
|
|
|
|
runHook preConfigure
|
|
|
|
|
|
|
|
echo "Building with ${ghc}."
|
|
|
|
export PATH="${ghc}/bin:$PATH"
|
|
|
|
${optionalString (hasActiveLibrary && hyperlinkSource) "export PATH=${hscolour}/bin:$PATH"}
|
|
|
|
|
|
|
|
configureFlags="--verbose --prefix=$out --libdir=\$prefix/lib/\$compiler --libsubdir=\$pkgid $configureFlags"
|
|
|
|
configureFlags+=' ${concatStringsSep " " defaultConfigureFlags}'
|
|
|
|
${optionalString (enableSharedExecutables && stdenv.isLinux) ''
|
|
|
|
configureFlags+=" --ghc-option=-optl=-Wl,-rpath=$out/lib/${ghc.name}/${pname}-${version}"
|
|
|
|
''}
|
|
|
|
${optionalString (enableSharedExecutables && stdenv.isDarwin) ''
|
|
|
|
configureFlags+=" --ghc-option=-optl=-Wl,-headerpad_max_install_names"
|
|
|
|
''}
|
|
|
|
${optionalString (versionOlder "7.8" ghc.version && !isLibrary) ''
|
|
|
|
configureFlags+=" --ghc-option=-j$NIX_BUILD_CORES"
|
|
|
|
setupCompileFlags="-j$NIX_BUILD_CORES"
|
2015-01-13 20:34:23 +00:00
|
|
|
''}${optionalString stdenv.isDarwin ''
|
|
|
|
configureFlags+=" --with-gcc=$CC" # Cabal won't find clang without help.
|
2015-01-13 21:15:29 +00:00
|
|
|
''}${optionalString useCpphs ''
|
|
|
|
configureFlags+=" --with-cpphs=${cpphs}/bin/cpphs"
|
|
|
|
configureFlags+=" --ghc-options=-cpp --ghc-options=-pgmP${cpphs}/bin/cpphs --ghc-options=-optP--cpp"
|
2015-01-07 19:31:32 +00:00
|
|
|
''}
|
|
|
|
|
2015-01-10 08:12:37 +00:00
|
|
|
packageConfDir="$TMP/package.conf.d"
|
|
|
|
mkdir -p $packageConfDir
|
|
|
|
|
|
|
|
local inputClosure=""
|
2015-01-14 21:16:44 +00:00
|
|
|
for i in $propagatedNativeBuildInputs $nativeBuildInputs; do
|
2015-01-10 08:12:37 +00:00
|
|
|
findInputs $i inputClosure propagated-native-build-inputs
|
|
|
|
done
|
|
|
|
for p in $inputClosure; do
|
|
|
|
if [ -d "$p/lib/${ghc.name}/package.conf.d" ]; then
|
|
|
|
cp -f "$p/lib/${ghc.name}/package.conf.d/"*.conf $packageConfDir/
|
2015-01-07 19:31:32 +00:00
|
|
|
continue
|
|
|
|
fi
|
|
|
|
if [ -d "$p/include" ]; then
|
|
|
|
configureFlags+=" --extra-include-dirs=$p/include"
|
|
|
|
fi
|
|
|
|
for d in lib{,64}; do
|
|
|
|
if [ -d "$p/$d" ]; then
|
|
|
|
configureFlags+=" --extra-lib-dirs=$p/$d"
|
|
|
|
fi
|
|
|
|
done
|
|
|
|
done
|
2015-01-10 08:12:37 +00:00
|
|
|
ghc-pkg --package-db="$packageConfDir" recache
|
|
|
|
configureFlags+=" --package-db=$packageConfDir"
|
2015-01-07 19:31:32 +00:00
|
|
|
|
|
|
|
${optionalString (editedCabalFile != null) ''
|
|
|
|
echo "Replacing Cabal file with edited version ${newCabalFile}."
|
|
|
|
cp ${newCabalFile} ${pname}.cabal
|
|
|
|
''}
|
|
|
|
|
|
|
|
${optionalString jailbreak ''
|
|
|
|
echo "Running jailbreak-cabal to lift version restrictions on build inputs."
|
|
|
|
${jailbreak-cabal}/bin/jailbreak-cabal ${pname}.cabal
|
|
|
|
''}
|
|
|
|
|
|
|
|
for i in Setup.hs Setup.lhs ${defaultSetupHs}; do
|
|
|
|
test -f $i && break
|
|
|
|
done
|
2015-01-12 20:14:22 +00:00
|
|
|
ghc ${optionalString (! coreSetup) "-package-db=$packageConfDir "}$setupCompileFlags --make -o Setup -odir $TMPDIR -hidir $TMPDIR $i
|
2015-01-07 19:31:32 +00:00
|
|
|
|
|
|
|
echo configureFlags: $configureFlags
|
2015-01-10 08:12:37 +00:00
|
|
|
unset GHC_PACKAGE_PATH # Cabal complains if this variable is set during configure.
|
2015-01-07 19:31:32 +00:00
|
|
|
./Setup configure $configureFlags 2>&1 | ${coreutils}/bin/tee "$NIX_BUILD_TOP/cabal-configure.log"
|
|
|
|
if ${gnugrep}/bin/egrep -q '^Warning:.*depends on multiple versions' "$NIX_BUILD_TOP/cabal-configure.log"; then
|
|
|
|
echo >&2 "*** abort because of serious configure-time warning from Cabal"
|
|
|
|
exit 1
|
|
|
|
fi
|
|
|
|
|
2015-01-10 08:12:37 +00:00
|
|
|
export GHC_PACKAGE_PATH="$packageConfDir:"
|
2015-01-07 19:31:32 +00:00
|
|
|
|
|
|
|
runHook postConfigure
|
|
|
|
'';
|
|
|
|
|
|
|
|
buildPhase = ''
|
|
|
|
runHook preBuild
|
|
|
|
./Setup build
|
|
|
|
${optionalString (!noHaddock && hasActiveLibrary) ''
|
2015-01-10 08:12:37 +00:00
|
|
|
./Setup haddock --html \
|
|
|
|
${optionalString doHoogle "--hoogle"} \
|
|
|
|
${optionalString (hasActiveLibrary && hyperlinkSource) "--hyperlink-source"}
|
2015-01-07 19:31:32 +00:00
|
|
|
''}
|
|
|
|
runHook postBuild
|
|
|
|
'';
|
|
|
|
|
2015-01-10 08:12:37 +00:00
|
|
|
checkPhase = ''
|
2015-01-07 19:31:32 +00:00
|
|
|
runHook preCheck
|
|
|
|
./Setup test ${testTarget}
|
|
|
|
runHook postCheck
|
|
|
|
'';
|
|
|
|
|
2015-01-10 08:12:37 +00:00
|
|
|
installPhase = ''
|
2015-01-07 19:31:32 +00:00
|
|
|
runHook preInstall
|
|
|
|
|
|
|
|
${if !hasActiveLibrary then "./Setup install" else ''
|
|
|
|
./Setup copy
|
2015-01-10 08:12:37 +00:00
|
|
|
local packageConfDir="$out/lib/${ghc.name}/package.conf.d"
|
|
|
|
local packageConfFile="$packageConfDir/${pname}-${version}.conf"
|
|
|
|
mkdir -p "$packageConfDir"
|
|
|
|
./Setup register --gen-pkg-config=$packageConfFile
|
|
|
|
local pkgId=$( ${gnused}/bin/sed -n -e 's|^id: ||p' $packageConfFile )
|
|
|
|
mv $packageConfFile $packageConfDir/$pkgId.conf
|
2015-01-07 19:31:32 +00:00
|
|
|
''}
|
|
|
|
|
|
|
|
${optionalString (enableSharedExecutables && isExecutable && stdenv.isDarwin) ''
|
|
|
|
for exe in "$out/bin/"* ; do
|
|
|
|
install_name_tool -add_rpath "$out/lib/ghc-${ghc.version}/${pname}-${version}" "$exe"
|
|
|
|
done
|
|
|
|
''}
|
|
|
|
|
|
|
|
runHook postInstall
|
|
|
|
'';
|
|
|
|
|
2015-01-10 12:23:04 +00:00
|
|
|
passthru = passthru // {
|
|
|
|
|
|
|
|
inherit pname version;
|
|
|
|
|
|
|
|
env = stdenv.mkDerivation {
|
|
|
|
name = "interactive-${optionalString hasActiveLibrary "haskell-"}${pname}-${version}-environment";
|
2015-01-11 10:59:47 +00:00
|
|
|
nativeBuildInputs = [ ghcEnv systemBuildInputs ];
|
|
|
|
shellHook = ''
|
|
|
|
export NIX_GHC="${ghcEnv}/bin/ghc"
|
|
|
|
export NIX_GHCPKG="${ghcEnv}/bin/ghc"
|
|
|
|
export NIX_GHC_DOCDIR="${ghcEnv}/share/doc/ghc/html"
|
|
|
|
export NIX_GHC_LIBDIR="${ghcEnv}/lib/${ghcEnv.name}"
|
|
|
|
'';
|
2015-01-11 10:37:49 +00:00
|
|
|
buildCommand = ''
|
|
|
|
echo >&2 ""
|
|
|
|
echo >&2 "*** Haskell 'env' attributes are intended for interactive nix-shell sessions, not for building! ***"
|
|
|
|
echo >&2 ""
|
|
|
|
exit 1
|
|
|
|
'';
|
2015-01-10 12:23:04 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
};
|
2015-01-07 19:31:32 +00:00
|
|
|
|
2015-01-10 08:12:37 +00:00
|
|
|
meta = { inherit homepage license platforms hydraPlatforms; }
|
|
|
|
// optionalAttrs broken { inherit broken; }
|
|
|
|
// optionalAttrs (description != "") { inherit description; }
|
|
|
|
// optionalAttrs (maintainers != []) { inherit maintainers; }
|
|
|
|
;
|
|
|
|
|
2015-01-07 19:31:32 +00:00
|
|
|
}
|
2015-01-10 08:12:37 +00:00
|
|
|
// optionalAttrs (configureFlags != []) { inherit configureFlags; }
|
|
|
|
// optionalAttrs (patches != []) { inherit patches; }
|
|
|
|
// optionalAttrs (patchPhase != "") { inherit patchPhase; }
|
|
|
|
// optionalAttrs (prePatch != "") { inherit prePatch; }
|
|
|
|
// optionalAttrs (postPatch != "") { inherit postPatch; }
|
|
|
|
// optionalAttrs (preConfigure != "") { inherit preConfigure; }
|
|
|
|
// optionalAttrs (postConfigure != "") { inherit postConfigure; }
|
|
|
|
// optionalAttrs (preBuild != "") { inherit preBuild; }
|
|
|
|
// optionalAttrs (postBuild != "") { inherit postBuild; }
|
|
|
|
// optionalAttrs (preInstall != "") { inherit preInstall; }
|
|
|
|
// optionalAttrs (postInstall != "") { inherit postInstall; }
|
|
|
|
// optionalAttrs (checkPhase != "") { inherit checkPhase; }
|
|
|
|
// optionalAttrs (preCheck != "") { inherit preCheck; }
|
|
|
|
// optionalAttrs (postCheck != "") { inherit postCheck; }
|
|
|
|
// optionalAttrs (preFixup != "") { inherit preFixup; }
|
|
|
|
// optionalAttrs (postFixup != "") { inherit postFixup; }
|
|
|
|
)
|