2018-01-04 21:18:02 +00:00
|
|
|
{ stdenv, buildPackages, buildHaskellPackages, ghc
|
2018-09-17 22:20:29 +01:00
|
|
|
, jailbreak-cabal, hscolour, cpphs, nodejs, shellFor
|
2017-08-06 20:46:49 +01:00
|
|
|
}:
|
2017-09-10 20:36:48 +01:00
|
|
|
|
|
|
|
let
|
2018-08-20 19:43:41 +01:00
|
|
|
isCross = stdenv.buildPlatform != stdenv.hostPlatform;
|
2017-09-10 20:36:48 +01:00
|
|
|
inherit (buildPackages)
|
|
|
|
fetchurl removeReferencesTo
|
|
|
|
pkgconfig coreutils gnugrep gnused glibcLocales;
|
|
|
|
in
|
2015-01-07 19:31:32 +00:00
|
|
|
|
2015-01-10 08:12:37 +00:00
|
|
|
{ pname
|
2016-01-24 22:12:03 +00:00
|
|
|
, dontStrip ? (ghc.isGhcjs or false)
|
2015-03-24 19:09:49 +00:00
|
|
|
, version, revision ? null
|
2015-01-10 08:12:37 +00:00
|
|
|
, sha256 ? null
|
2015-01-07 19:31:32 +00:00
|
|
|
, src ? fetchurl { url = "mirror://hackage/${pname}-${version}.tar.gz"; inherit sha256; }
|
2016-06-09 22:27:57 +01:00
|
|
|
, buildDepends ? [], setupHaskellDepends ? [], libraryHaskellDepends ? [], executableHaskellDepends ? []
|
2015-01-16 19:54:35 +00:00
|
|
|
, buildTarget ? ""
|
2017-02-28 09:27:29 +00:00
|
|
|
, buildTools ? [], libraryToolDepends ? [], executableToolDepends ? [], testToolDepends ? [], benchmarkToolDepends ? []
|
2015-01-10 08:12:37 +00:00
|
|
|
, configureFlags ? []
|
2018-03-17 08:55:39 +00:00
|
|
|
, buildFlags ? []
|
2015-01-10 08:12:37 +00:00
|
|
|
, description ? ""
|
2018-03-15 00:00:00 +00:00
|
|
|
, doCheck ? !isCross && stdenv.lib.versionOlder "7.4" ghc.version
|
2017-09-19 14:36:29 +01:00
|
|
|
, doBenchmark ? false
|
2015-01-09 18:35:17 +00:00
|
|
|
, doHoogle ? true
|
2015-01-10 08:12:37 +00:00
|
|
|
, editedCabalFile ? null
|
2018-03-16 20:14:51 +00:00
|
|
|
, enableLibraryProfiling ? true
|
2015-08-06 15:13:10 +01:00
|
|
|
, enableExecutableProfiling ? false
|
2018-08-27 14:50:37 +01:00
|
|
|
, profilingDetail ? "exported-functions"
|
2016-11-18 15:44:53 +00:00
|
|
|
# TODO enable shared libs for cross-compiling
|
2018-03-16 20:44:17 +00:00
|
|
|
, enableSharedExecutables ? false
|
2018-06-20 22:57:35 +01:00
|
|
|
, enableSharedLibraries ? (ghc.enableShared or false)
|
2018-03-16 20:55:56 +00:00
|
|
|
, enableDeadCodeElimination ? (!stdenv.isDarwin) # TODO: use -dead_strip for darwin
|
2018-08-20 19:43:41 +01:00
|
|
|
, enableStaticLibraries ? !stdenv.hostPlatform.isWindows
|
|
|
|
, enableHsc2hsViaAsm ? stdenv.hostPlatform.isWindows && stdenv.lib.versionAtLeast ghc.version "8.4"
|
2015-06-17 15:40:21 +01:00
|
|
|
, extraLibraries ? [], librarySystemDepends ? [], executableSystemDepends ? []
|
2017-06-23 02:43:03 +01:00
|
|
|
# On macOS, statically linking against system frameworks is not supported;
|
|
|
|
# see https://developer.apple.com/library/content/qa/qa1118/_index.html
|
|
|
|
# They must be propagated to the environment of any executable linking with the library
|
|
|
|
, libraryFrameworkDepends ? [], executableFrameworkDepends ? []
|
2018-05-28 20:48:16 +01:00
|
|
|
, homepage ? "https://hackage.haskell.org/package/${pname}"
|
2018-03-20 15:51:37 +00:00
|
|
|
, platforms ? with stdenv.lib.platforms; unix ++ windows # GHC can cross-compile
|
|
|
|
, hydraPlatforms ? null
|
2015-01-10 08:12:37 +00:00
|
|
|
, hyperlinkSource ? true
|
|
|
|
, isExecutable ? false, isLibrary ? !isExecutable
|
|
|
|
, jailbreak ? false
|
|
|
|
, license
|
2018-08-25 11:53:04 +01:00
|
|
|
# We cannot enable -j<n> parallelism for libraries because GHC is far more
|
|
|
|
# likely to generate a non-determistic library ID in that case. Further
|
|
|
|
# details are at <https://github.com/peti/ghc-library-id-bug>.
|
|
|
|
, enableParallelBuilding ? (stdenv.lib.versionOlder "7.8" ghc.version && !isLibrary) || stdenv.lib.versionOlder "8.0.1" ghc.version
|
2015-01-07 19:31:32 +00:00
|
|
|
, maintainers ? []
|
2017-02-14 15:17:40 +00:00
|
|
|
, doCoverage ? false
|
2017-06-22 16:41:24 +01:00
|
|
|
, doHaddock ? !(ghc.isHaLVM or false)
|
2015-01-07 19:31:32 +00:00
|
|
|
, passthru ? {}
|
2017-02-28 09:27:29 +00:00
|
|
|
, pkgconfigDepends ? [], libraryPkgconfigDepends ? [], executablePkgconfigDepends ? [], testPkgconfigDepends ? [], benchmarkPkgconfigDepends ? []
|
2017-06-23 02:43:03 +01:00
|
|
|
, testDepends ? [], testHaskellDepends ? [], testSystemDepends ? [], testFrameworkDepends ? []
|
|
|
|
, benchmarkDepends ? [], benchmarkHaskellDepends ? [], benchmarkSystemDepends ? [], benchmarkFrameworkDepends ? []
|
2015-01-10 08:12:37 +00:00
|
|
|
, testTarget ? ""
|
|
|
|
, broken ? false
|
2016-02-18 03:07:32 +00:00
|
|
|
, preCompileBuildDriver ? "", postCompileBuildDriver ? ""
|
2015-01-19 15:24:12 +00:00
|
|
|
, preUnpack ? "", postUnpack ? ""
|
2015-04-05 08:58:37 +01:00
|
|
|
, patches ? [], patchPhase ? "", prePatch ? "", postPatch ? ""
|
2015-01-10 08:12:37 +00:00
|
|
|
, preConfigure ? "", postConfigure ? ""
|
|
|
|
, preBuild ? "", postBuild ? ""
|
2015-08-14 20:22:40 +01:00
|
|
|
, installPhase ? "", preInstall ? "", postInstall ? ""
|
2015-01-10 08:12:37 +00:00
|
|
|
, checkPhase ? "", preCheck ? "", postCheck ? ""
|
|
|
|
, preFixup ? "", postFixup ? ""
|
2015-09-09 18:58:28 +01:00
|
|
|
, shellHook ? ""
|
2015-01-13 21:15:29 +00:00
|
|
|
, coreSetup ? false # Use only core packages to build Setup.hs.
|
2015-01-15 21:36:01 +00:00
|
|
|
, useCpphs ? false
|
2017-09-10 20:36:48 +01:00
|
|
|
, hardeningDisable ? stdenv.lib.optional (ghc.isHaLVM or false) "all"
|
2017-07-25 02:22:19 +01:00
|
|
|
, enableSeparateDataOutput ? false
|
|
|
|
, enableSeparateDocOutput ? doHaddock
|
2015-03-27 15:11:18 +00:00
|
|
|
} @ args:
|
2015-01-07 19:31:32 +00:00
|
|
|
|
2015-03-24 19:09:49 +00:00
|
|
|
assert editedCabalFile != null -> revision != null;
|
2015-01-07 19:31:32 +00:00
|
|
|
|
2018-03-11 09:13:25 +00:00
|
|
|
# --enable-static does not work on windows. This is a bug in GHC.
|
|
|
|
# --enable-static will pass -staticlib to ghc, which only works for mach-o and elf.
|
2018-08-20 19:43:41 +01:00
|
|
|
assert stdenv.hostPlatform.isWindows -> enableStaticLibraries == false;
|
2018-03-11 09:13:25 +00:00
|
|
|
|
2015-01-07 19:31:32 +00:00
|
|
|
let
|
|
|
|
|
2017-02-14 15:17:40 +00:00
|
|
|
inherit (stdenv.lib) optional optionals optionalString versionOlder versionAtLeast
|
2018-02-09 18:52:21 +00:00
|
|
|
concatStringsSep enableFeature optionalAttrs toUpper;
|
2015-01-07 19:31:32 +00:00
|
|
|
|
2015-03-13 03:20:56 +00:00
|
|
|
isGhcjs = ghc.isGhcjs or false;
|
2017-02-04 17:19:14 +00:00
|
|
|
isHaLVM = ghc.isHaLVM or false;
|
|
|
|
packageDbFlag = if isGhcjs || isHaLVM || versionOlder "7.6" ghc.version
|
2016-02-19 16:45:45 +00:00
|
|
|
then "package-db"
|
|
|
|
else "package-conf";
|
|
|
|
|
2018-01-04 21:18:02 +00:00
|
|
|
# GHC used for building Setup.hs
|
|
|
|
#
|
|
|
|
# Same as our GHC, unless we're cross, in which case it is native GHC with the
|
|
|
|
# same version, or ghcjs, in which case its the ghc used to build ghcjs.
|
|
|
|
nativeGhc = buildHaskellPackages.ghc;
|
2016-02-19 16:45:45 +00:00
|
|
|
nativePackageDbFlag = if versionOlder "7.6" nativeGhc.version
|
|
|
|
then "package-db"
|
|
|
|
else "package-conf";
|
2015-03-13 03:20:56 +00:00
|
|
|
|
2017-12-05 08:36:08 +00:00
|
|
|
# the target dir for haddock documentation
|
2018-06-22 11:50:54 +01:00
|
|
|
docdir = docoutput: docoutput + "/share/doc/" + pname + "-" + version;
|
2017-12-05 08:36:08 +00:00
|
|
|
|
2015-04-01 12:52:21 +01:00
|
|
|
newCabalFileUrl = "http://hackage.haskell.org/package/${pname}-${version}/revision/${revision}.cabal";
|
2015-01-16 19:54:35 +00:00
|
|
|
newCabalFile = fetchurl {
|
2015-04-01 12:52:21 +01:00
|
|
|
url = newCabalFileUrl;
|
2015-01-16 19:54:35 +00:00
|
|
|
sha256 = editedCabalFile;
|
2015-03-24 19:09:49 +00:00
|
|
|
name = "${pname}-${version}-r${revision}.cabal";
|
2015-01-16 19:54:35 +00:00
|
|
|
};
|
|
|
|
|
2015-01-07 19:31:32 +00:00
|
|
|
defaultSetupHs = builtins.toFile "Setup.hs" ''
|
|
|
|
import Distribution.Simple
|
|
|
|
main = defaultMain
|
|
|
|
'';
|
|
|
|
|
2016-11-18 15:44:53 +00:00
|
|
|
crossCabalFlags = [
|
2017-09-10 20:36:48 +01:00
|
|
|
"--with-ghc=${ghc.targetPrefix}ghc"
|
|
|
|
"--with-ghc-pkg=${ghc.targetPrefix}ghc-pkg"
|
2017-09-23 00:09:39 +01:00
|
|
|
"--with-gcc=${stdenv.cc.targetPrefix}cc"
|
|
|
|
"--with-ld=${stdenv.cc.bintools.targetPrefix}ld"
|
2018-09-18 23:49:58 +01:00
|
|
|
"--with-ar=${stdenv.cc.bintools.targetPrefix}ar"
|
2018-03-05 13:33:49 +00:00
|
|
|
# use the one that comes with the cross compiler.
|
|
|
|
"--with-hsc2hs=${ghc.targetPrefix}hsc2hs"
|
2017-09-23 00:09:39 +01:00
|
|
|
"--with-strip=${stdenv.cc.bintools.targetPrefix}strip"
|
2018-03-05 13:33:49 +00:00
|
|
|
] ++ optionals (!isHaLVM) [
|
|
|
|
"--hsc2hs-option=--cross-compile"
|
|
|
|
(optionalString enableHsc2hsViaAsm "--hsc2hs-option=--via-asm")
|
|
|
|
];
|
2016-11-18 15:44:53 +00:00
|
|
|
|
|
|
|
crossCabalFlagsString =
|
|
|
|
stdenv.lib.optionalString isCross (" " + stdenv.lib.concatStringsSep " " crossCabalFlags);
|
|
|
|
|
2018-03-17 08:55:39 +00:00
|
|
|
buildFlagsString = optionalString (buildFlags != []) (" " + concatStringsSep " " buildFlags);
|
|
|
|
|
2015-01-07 19:31:32 +00:00
|
|
|
defaultConfigureFlags = [
|
2018-06-19 12:18:41 +01:00
|
|
|
"--verbose" "--prefix=$out" "--libdir=\\$prefix/lib/\\$compiler" "--libsubdir=\\$abi/\\$libname"
|
2017-12-05 08:36:08 +00:00
|
|
|
(optionalString enableSeparateDataOutput "--datadir=$data/share/${ghc.name}")
|
|
|
|
(optionalString enableSeparateDocOutput "--docdir=${docdir "$doc"}")
|
2017-02-04 17:19:14 +00:00
|
|
|
"--with-gcc=$CC" # Clang won't work without that extra information.
|
2015-01-16 19:54:35 +00:00
|
|
|
"--package-db=$packageConfDir"
|
2017-12-05 08:36:08 +00:00
|
|
|
(optionalString (enableSharedExecutables && stdenv.isLinux) "--ghc-option=-optl=-Wl,-rpath=$out/lib/${ghc.name}/${pname}-${version}")
|
2015-01-16 19:54:35 +00:00
|
|
|
(optionalString (enableSharedExecutables && stdenv.isDarwin) "--ghc-option=-optl=-Wl,-headerpad_max_install_names")
|
|
|
|
(optionalString enableParallelBuilding "--ghc-option=-j$NIX_BUILD_CORES")
|
2015-06-17 15:40:21 +01:00
|
|
|
(optionalString useCpphs "--with-cpphs=${cpphs}/bin/cpphs --ghc-options=-cpp --ghc-options=-pgmP${cpphs}/bin/cpphs --ghc-options=-optP--cpp")
|
2018-08-20 19:43:41 +01:00
|
|
|
(enableFeature (enableDeadCodeElimination && !stdenv.hostPlatform.isAarch32 && !stdenv.hostPlatform.isAarch64 && (versionAtLeast "8.0.1" ghc.version)) "split-objs")
|
2015-01-07 19:31:32 +00:00
|
|
|
(enableFeature enableLibraryProfiling "library-profiling")
|
2018-03-29 05:28:05 +01:00
|
|
|
(optionalString ((enableExecutableProfiling || enableLibraryProfiling) && versionOlder "8" ghc.version) "--profiling-detail=${profilingDetail}")
|
2016-01-17 09:54:04 +00:00
|
|
|
(enableFeature enableExecutableProfiling (if versionOlder ghc.version "8" then "executable-profiling" else "profiling"))
|
2015-01-07 19:31:32 +00:00
|
|
|
(enableFeature enableSharedLibraries "shared")
|
2017-02-14 15:17:40 +00:00
|
|
|
(optionalString (versionAtLeast ghc.version "7.10") (enableFeature doCoverage "coverage"))
|
2018-03-16 20:38:55 +00:00
|
|
|
(optionalString (versionOlder "8.4" ghc.version) (enableFeature enableStaticLibraries "static"))
|
2015-03-13 03:20:56 +00:00
|
|
|
(optionalString (isGhcjs || versionOlder "7.4" ghc.version) (enableFeature enableSharedExecutables "executable-dynamic"))
|
|
|
|
(optionalString (isGhcjs || versionOlder "7" ghc.version) (enableFeature doCheck "tests"))
|
2018-09-11 16:24:26 +01:00
|
|
|
(enableFeature doBenchmark "benchmarks")
|
2018-03-16 20:38:55 +00:00
|
|
|
"--enable-library-vanilla" # TODO: Should this be configurable?
|
2018-03-16 20:32:02 +00:00
|
|
|
"--enable-library-for-ghci" # TODO: Should this be configurable?
|
2017-01-02 16:19:28 +00:00
|
|
|
] ++ optionals (enableDeadCodeElimination && (stdenv.lib.versionOlder "8.0.1" ghc.version)) [
|
|
|
|
"--ghc-option=-split-sections"
|
2018-07-14 02:41:39 +01:00
|
|
|
] ++ optionals dontStrip [
|
|
|
|
"--disable-library-stripping"
|
|
|
|
"--disable-executable-stripping"
|
2015-03-13 03:20:56 +00:00
|
|
|
] ++ optionals isGhcjs [
|
|
|
|
"--ghcjs"
|
2016-11-18 15:44:53 +00:00
|
|
|
] ++ optionals isCross ([
|
2018-08-20 19:43:41 +01:00
|
|
|
"--configure-option=--host=${stdenv.hostPlatform.config}"
|
2016-11-18 15:44:53 +00:00
|
|
|
] ++ crossCabalFlags);
|
2015-01-07 19:31:32 +00:00
|
|
|
|
2015-01-16 19:54:35 +00:00
|
|
|
setupCompileFlags = [
|
2018-06-13 18:44:16 +01:00
|
|
|
(optionalString (!coreSetup) "-${nativePackageDbFlag}=$setupPackageConfDir")
|
2017-02-04 17:19:14 +00:00
|
|
|
(optionalString (isGhcjs || isHaLVM || versionOlder "7.8" ghc.version) "-j$NIX_BUILD_CORES")
|
|
|
|
# https://github.com/haskell/cabal/issues/2398
|
|
|
|
(optionalString (versionOlder "7.10" ghc.version && !isHaLVM) "-threaded")
|
2015-01-16 19:54:35 +00:00
|
|
|
];
|
2015-01-07 19:31:32 +00:00
|
|
|
|
2018-09-17 22:11:59 +01:00
|
|
|
isHaskellPkg = x: x ? isHaskellLibrary;
|
2015-01-10 12:23:04 +00:00
|
|
|
|
2015-07-23 21:16:16 +01:00
|
|
|
allPkgconfigDepends = pkgconfigDepends ++ libraryPkgconfigDepends ++ executablePkgconfigDepends ++
|
2017-09-19 14:36:29 +01:00
|
|
|
optionals doCheck testPkgconfigDepends ++ optionals doBenchmark benchmarkPkgconfigDepends;
|
2015-07-23 21:16:16 +01:00
|
|
|
|
2018-06-19 14:40:37 +01:00
|
|
|
depsBuildBuild = [ nativeGhc ];
|
|
|
|
nativeBuildInputs = [ ghc removeReferencesTo ] ++ optional (allPkgconfigDepends != []) pkgconfig ++
|
2018-05-21 19:44:46 +01:00
|
|
|
setupHaskellDepends ++
|
2018-06-25 20:03:59 +01:00
|
|
|
buildTools ++ libraryToolDepends ++ executableToolDepends ++
|
|
|
|
optionals doCheck testToolDepends ++
|
|
|
|
optionals doBenchmark benchmarkToolDepends;
|
2017-06-23 02:43:03 +01:00
|
|
|
propagatedBuildInputs = buildDepends ++ libraryHaskellDepends ++ executableHaskellDepends ++ libraryFrameworkDepends;
|
2018-05-31 19:05:56 +01:00
|
|
|
otherBuildInputs = extraLibraries ++ librarySystemDepends ++ executableSystemDepends ++ executableFrameworkDepends ++
|
2018-03-15 00:00:00 +00:00
|
|
|
allPkgconfigDepends ++
|
2018-06-25 20:03:59 +01:00
|
|
|
optionals doCheck (testDepends ++ testHaskellDepends ++ testSystemDepends ++ testFrameworkDepends) ++
|
|
|
|
optionals doBenchmark (benchmarkDepends ++ benchmarkHaskellDepends ++ benchmarkSystemDepends ++ benchmarkFrameworkDepends);
|
2018-05-21 19:44:46 +01:00
|
|
|
|
2018-09-17 22:11:59 +01:00
|
|
|
|
|
|
|
allBuildInputs = propagatedBuildInputs ++ otherBuildInputs ++ depsBuildBuild;
|
|
|
|
isHaskellPartition =
|
|
|
|
stdenv.lib.partition isHaskellPkg allBuildInputs;
|
2015-01-16 19:54:35 +00:00
|
|
|
|
2016-02-18 08:11:42 +00:00
|
|
|
setupCommand = "./Setup";
|
2018-01-04 21:18:02 +00:00
|
|
|
|
2017-01-22 22:05:19 +00:00
|
|
|
ghcCommand' = if isGhcjs then "ghcjs" else "ghc";
|
2017-09-10 20:36:48 +01:00
|
|
|
ghcCommand = "${ghc.targetPrefix}${ghcCommand'}";
|
2015-03-13 03:20:56 +00:00
|
|
|
|
2018-01-04 21:18:02 +00:00
|
|
|
nativeGhcCommand = "${nativeGhc.targetPrefix}ghc";
|
|
|
|
|
2018-06-12 18:54:26 +01:00
|
|
|
buildPkgDb = ghcName: packageConfDir: ''
|
2018-03-01 05:35:48 +00:00
|
|
|
if [ -d "$p/lib/${ghcName}/package.conf.d" ]; then
|
2018-06-12 18:54:26 +01:00
|
|
|
cp -f "$p/lib/${ghcName}/package.conf.d/"*.conf ${packageConfDir}/
|
2018-03-01 05:35:48 +00:00
|
|
|
continue
|
|
|
|
fi
|
|
|
|
'';
|
2018-09-17 22:20:29 +01:00
|
|
|
in stdenv.lib.fix (drv:
|
2015-07-23 21:16:16 +01:00
|
|
|
|
|
|
|
assert allPkgconfigDepends != [] -> pkgconfig != null;
|
|
|
|
|
2015-01-10 08:12:37 +00:00
|
|
|
stdenv.mkDerivation ({
|
2015-08-29 22:29:17 +01:00
|
|
|
name = "${pname}-${version}";
|
2015-01-07 19:31:32 +00:00
|
|
|
|
2018-02-16 15:53:07 +00:00
|
|
|
outputs = [ "out" ] ++ (optional enableSeparateDataOutput "data") ++ (optional enableSeparateDocOutput "doc");
|
2017-07-25 02:22:19 +01:00
|
|
|
setOutputFlags = false;
|
|
|
|
|
2015-03-27 15:11:18 +00:00
|
|
|
pos = builtins.unsafeGetAttrPos "pname" args;
|
|
|
|
|
2015-01-16 19:54:35 +00:00
|
|
|
prePhases = ["setupCompilerEnvironmentPhase"];
|
2015-02-25 19:15:26 +00:00
|
|
|
preConfigurePhases = ["compileBuildDriverPhase"];
|
2015-01-16 19:54:35 +00:00
|
|
|
preInstallPhases = ["haddockPhase"];
|
|
|
|
|
2015-01-07 19:31:32 +00:00
|
|
|
inherit src;
|
|
|
|
|
2018-06-19 14:40:37 +01:00
|
|
|
inherit depsBuildBuild nativeBuildInputs;
|
2018-07-27 05:24:22 +01:00
|
|
|
buildInputs = otherBuildInputs ++ optionals (!isLibrary) propagatedBuildInputs;
|
|
|
|
propagatedBuildInputs = optionals isLibrary propagatedBuildInputs;
|
2015-01-07 19:31:32 +00:00
|
|
|
|
2015-01-16 19:54:35 +00:00
|
|
|
LANG = "en_US.UTF-8"; # GHC needs the locale configured during the Haddock phase.
|
2015-01-07 19:31:32 +00:00
|
|
|
|
2015-02-25 19:15:26 +00:00
|
|
|
prePatch = optionalString (editedCabalFile != null) ''
|
2015-04-01 12:52:21 +01:00
|
|
|
echo "Replace Cabal file with edited version from ${newCabalFileUrl}."
|
2015-02-25 19:15:26 +00:00
|
|
|
cp ${newCabalFile} ${pname}.cabal
|
2015-04-04 14:12:43 +01:00
|
|
|
'' + prePatch;
|
|
|
|
|
|
|
|
postPatch = optionalString jailbreak ''
|
2015-04-01 13:02:46 +01:00
|
|
|
echo "Run jailbreak-cabal to lift version restrictions on build inputs."
|
2017-12-05 08:36:08 +00:00
|
|
|
${jailbreak-cabal}/bin/jailbreak-cabal ${pname}.cabal
|
2015-04-04 14:12:43 +01:00
|
|
|
'' + postPatch;
|
2015-02-25 19:15:26 +00:00
|
|
|
|
2015-01-16 19:54:35 +00:00
|
|
|
setupCompilerEnvironmentPhase = ''
|
|
|
|
runHook preSetupCompilerEnvironment
|
2015-01-07 19:31:32 +00:00
|
|
|
|
2015-04-01 13:02:46 +01:00
|
|
|
echo "Build with ${ghc}."
|
2018-07-27 05:24:22 +01:00
|
|
|
${optionalString (isLibrary && hyperlinkSource) "export PATH=${hscolour}/bin:$PATH"}
|
2015-01-07 19:31:32 +00:00
|
|
|
|
2018-03-01 05:35:48 +00:00
|
|
|
setupPackageConfDir="$TMPDIR/setup-package.conf.d"
|
|
|
|
mkdir -p $setupPackageConfDir
|
2015-02-23 10:45:49 +00:00
|
|
|
packageConfDir="$TMPDIR/package.conf.d"
|
2015-01-10 08:12:37 +00:00
|
|
|
mkdir -p $packageConfDir
|
|
|
|
|
2015-01-16 19:54:35 +00:00
|
|
|
setupCompileFlags="${concatStringsSep " " setupCompileFlags}"
|
|
|
|
configureFlags="${concatStringsSep " " defaultConfigureFlags} $configureFlags"
|
2018-03-01 05:35:48 +00:00
|
|
|
''
|
|
|
|
# We build the Setup.hs on the *build* machine, and as such should only add
|
|
|
|
# dependencies for the build machine.
|
|
|
|
#
|
|
|
|
# pkgs* arrays defined in stdenv/setup.hs
|
2018-06-13 18:44:16 +01:00
|
|
|
+ ''
|
2018-03-01 05:35:48 +00:00
|
|
|
for p in "''${pkgsBuildBuild[@]}" "''${pkgsBuildHost[@]}" "''${pkgsBuildTarget[@]}"; do
|
2018-06-12 18:54:26 +01:00
|
|
|
${buildPkgDb nativeGhc.name "$setupPackageConfDir"}
|
2018-03-01 05:35:48 +00:00
|
|
|
done
|
|
|
|
${nativeGhcCommand}-pkg --${nativePackageDbFlag}="$setupPackageConfDir" recache
|
2018-06-13 18:44:16 +01:00
|
|
|
''
|
|
|
|
# For normal components
|
2018-03-01 05:35:48 +00:00
|
|
|
+ ''
|
2017-08-12 17:41:49 +01:00
|
|
|
for p in "''${pkgsHostHost[@]}" "''${pkgsHostTarget[@]}"; do
|
2018-06-12 18:54:26 +01:00
|
|
|
${buildPkgDb ghc.name "$packageConfDir"}
|
2018-06-19 15:52:10 +01:00
|
|
|
if [ -d "$p/include" ]; then
|
|
|
|
configureFlags+=" --extra-include-dirs=$p/include"
|
|
|
|
fi
|
|
|
|
if [ -d "$p/lib" ]; then
|
|
|
|
configureFlags+=" --extra-lib-dirs=$p/lib"
|
|
|
|
fi
|
|
|
|
''
|
|
|
|
# It is not clear why --extra-framework-dirs does work fine on Linux
|
2018-08-20 19:43:41 +01:00
|
|
|
+ optionalString (!stdenv.buildPlatform.isDarwin || versionAtLeast nativeGhc.version "8.0") ''
|
2018-06-19 15:52:10 +01:00
|
|
|
if [[ -d "$p/Library/Frameworks" ]]; then
|
|
|
|
configureFlags+=" --extra-framework-dirs=$p/Library/Frameworks"
|
|
|
|
fi
|
|
|
|
'' + ''
|
2015-01-07 19:31:32 +00:00
|
|
|
done
|
2018-03-20 22:26:00 +00:00
|
|
|
''
|
|
|
|
# only use the links hack if we're actually building dylibs. otherwise, the
|
|
|
|
# "dynamic-library-dirs" point to nonexistent paths, and the ln command becomes
|
|
|
|
# "ln -s $out/lib/links", which tries to recreate the links dir and fails
|
2018-03-17 06:42:28 +00:00
|
|
|
+ (optionalString (stdenv.isDarwin && (enableSharedLibraries || enableSharedExecutables)) ''
|
2017-08-06 23:05:18 +01:00
|
|
|
# Work around a limit in the macOS Sierra linker on the number of paths
|
2017-05-05 17:53:08 +01:00
|
|
|
# referenced by any one dynamic library:
|
|
|
|
#
|
2017-08-06 23:05:18 +01:00
|
|
|
# Create a local directory with symlinks of the *.dylib (macOS shared
|
2017-05-05 17:53:08 +01:00
|
|
|
# libraries) from all the dependencies.
|
2017-12-05 08:36:08 +00:00
|
|
|
local dynamicLinksDir="$out/lib/links"
|
2017-05-05 17:53:08 +01:00
|
|
|
mkdir -p $dynamicLinksDir
|
2018-01-02 16:37:54 +00:00
|
|
|
for d in $(grep dynamic-library-dirs "$packageConfDir/"*|awk '{print $2}'|sort -u); do
|
2017-07-18 19:57:24 +01:00
|
|
|
ln -s "$d/"*.dylib $dynamicLinksDir
|
2017-05-05 17:53:08 +01:00
|
|
|
done
|
|
|
|
# Edit the local package DB to reference the links directory.
|
2017-07-18 19:57:24 +01:00
|
|
|
for f in "$packageConfDir/"*.conf; do
|
2017-05-05 17:53:08 +01:00
|
|
|
sed -i "s,dynamic-library-dirs: .*,dynamic-library-dirs: $dynamicLinksDir," $f
|
|
|
|
done
|
|
|
|
'') + ''
|
2015-03-13 03:20:56 +00:00
|
|
|
${ghcCommand}-pkg --${packageDbFlag}="$packageConfDir" recache
|
2015-01-16 19:54:35 +00:00
|
|
|
|
|
|
|
runHook postSetupCompilerEnvironment
|
|
|
|
'';
|
|
|
|
|
|
|
|
compileBuildDriverPhase = ''
|
|
|
|
runHook preCompileBuildDriver
|
|
|
|
|
2015-01-07 19:31:32 +00:00
|
|
|
for i in Setup.hs Setup.lhs ${defaultSetupHs}; do
|
|
|
|
test -f $i && break
|
|
|
|
done
|
|
|
|
|
2015-01-16 19:54:35 +00:00
|
|
|
echo setupCompileFlags: $setupCompileFlags
|
2018-06-12 18:54:26 +01:00
|
|
|
${nativeGhcCommand} $setupCompileFlags --make -o Setup -odir $TMPDIR -hidir $TMPDIR $i
|
2015-01-16 19:54:35 +00:00
|
|
|
|
|
|
|
runHook postCompileBuildDriver
|
|
|
|
'';
|
|
|
|
|
2017-02-02 16:44:11 +00:00
|
|
|
# Cabal takes flags like `--configure-option=--host=...` instead
|
|
|
|
configurePlatforms = [];
|
2017-09-10 20:36:48 +01:00
|
|
|
inherit configureFlags;
|
|
|
|
|
2015-01-16 19:54:35 +00:00
|
|
|
configurePhase = ''
|
|
|
|
runHook preConfigure
|
|
|
|
|
2015-01-10 08:12:37 +00:00
|
|
|
unset GHC_PACKAGE_PATH # Cabal complains if this variable is set during configure.
|
2015-01-16 19:54:35 +00:00
|
|
|
|
|
|
|
echo configureFlags: $configureFlags
|
2015-05-06 20:56:02 +01:00
|
|
|
${setupCommand} configure $configureFlags 2>&1 | ${coreutils}/bin/tee "$NIX_BUILD_TOP/cabal-configure.log"
|
2017-12-29 18:32:12 +00:00
|
|
|
if ${gnugrep}/bin/egrep -q -z 'Warning:.*depends on multiple versions' "$NIX_BUILD_TOP/cabal-configure.log"; then
|
2015-01-07 19:31:32 +00:00
|
|
|
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
|
2018-03-17 08:55:39 +00:00
|
|
|
${setupCommand} build ${buildTarget}${crossCabalFlagsString}${buildFlagsString}
|
2015-01-07 19:31:32 +00:00
|
|
|
runHook postBuild
|
|
|
|
'';
|
|
|
|
|
2018-03-15 00:00:00 +00:00
|
|
|
inherit doCheck;
|
|
|
|
|
2015-01-10 08:12:37 +00:00
|
|
|
checkPhase = ''
|
2015-01-07 19:31:32 +00:00
|
|
|
runHook preCheck
|
2015-05-06 20:56:02 +01:00
|
|
|
${setupCommand} test ${testTarget}
|
2015-01-07 19:31:32 +00:00
|
|
|
runHook postCheck
|
|
|
|
'';
|
|
|
|
|
2015-01-16 19:54:35 +00:00
|
|
|
haddockPhase = ''
|
|
|
|
runHook preHaddock
|
2018-07-27 05:24:22 +01:00
|
|
|
${optionalString (doHaddock && isLibrary) ''
|
2015-05-06 20:56:02 +01:00
|
|
|
${setupCommand} haddock --html \
|
2015-01-16 19:54:35 +00:00
|
|
|
${optionalString doHoogle "--hoogle"} \
|
2018-07-27 05:24:22 +01:00
|
|
|
${optionalString (isLibrary && hyperlinkSource) "--hyperlink-source"}
|
2015-01-16 19:54:35 +00:00
|
|
|
''}
|
|
|
|
runHook postHaddock
|
|
|
|
'';
|
|
|
|
|
2015-01-10 08:12:37 +00:00
|
|
|
installPhase = ''
|
2015-01-07 19:31:32 +00:00
|
|
|
runHook preInstall
|
|
|
|
|
2018-07-27 05:24:22 +01:00
|
|
|
${if !isLibrary then "${setupCommand} install" else ''
|
2015-05-06 20:56:02 +01:00
|
|
|
${setupCommand} copy
|
2017-12-05 08:36:08 +00:00
|
|
|
local packageConfDir="$out/lib/${ghc.name}/package.conf.d"
|
2015-01-10 08:12:37 +00:00
|
|
|
local packageConfFile="$packageConfDir/${pname}-${version}.conf"
|
|
|
|
mkdir -p "$packageConfDir"
|
2015-05-06 20:56:02 +01:00
|
|
|
${setupCommand} register --gen-pkg-config=$packageConfFile
|
2017-12-23 00:25:59 +00:00
|
|
|
if [ -d "$packageConfFile" ]; then
|
2018-01-31 16:41:03 +00:00
|
|
|
mv "$packageConfFile/"* "$packageConfDir"
|
2017-12-23 00:25:59 +00:00
|
|
|
rmdir "$packageConfFile"
|
|
|
|
fi
|
2018-01-31 16:41:03 +00:00
|
|
|
for packageConfFile in "$packageConfDir/"*; do
|
2017-12-23 00:25:59 +00:00
|
|
|
local pkgId=$( ${gnused}/bin/sed -n -e 's|^id: ||p' $packageConfFile )
|
|
|
|
mv $packageConfFile $packageConfDir/$pkgId.conf
|
|
|
|
done
|
2018-07-16 16:23:32 +01:00
|
|
|
|
|
|
|
# delete confdir if there are no libraries
|
|
|
|
find $packageConfDir -maxdepth 0 -empty -delete;
|
2015-01-07 19:31:32 +00:00
|
|
|
''}
|
2017-03-25 04:23:01 +00:00
|
|
|
${optionalString isGhcjs ''
|
2017-12-05 08:36:08 +00:00
|
|
|
for exeDir in "$out/bin/"*.jsexe; do
|
2017-03-25 04:23:01 +00:00
|
|
|
exe="''${exeDir%.jsexe}"
|
2017-07-25 23:48:47 +01:00
|
|
|
printWords '#!${nodejs}/bin/node' > "$exe"
|
2018-03-26 01:43:23 +01:00
|
|
|
echo >> "$exe"
|
2017-03-25 04:23:01 +00:00
|
|
|
cat "$exeDir/all.js" >> "$exe"
|
|
|
|
chmod +x "$exe"
|
|
|
|
done
|
|
|
|
''}
|
2017-02-14 15:17:40 +00:00
|
|
|
${optionalString doCoverage "mkdir -p $out/share && cp -r dist/hpc $out/share"}
|
2015-05-31 08:18:13 +01:00
|
|
|
${optionalString (enableSharedExecutables && isExecutable && !isGhcjs && stdenv.isDarwin && stdenv.lib.versionOlder ghc.version "7.10") ''
|
2017-12-05 08:36:08 +00:00
|
|
|
for exe in "$out/bin/"* ; do
|
|
|
|
install_name_tool -add_rpath "$out/lib/ghc-${ghc.version}/${pname}-${version}" "$exe"
|
2015-01-07 19:31:32 +00:00
|
|
|
done
|
|
|
|
''}
|
|
|
|
|
2017-07-25 02:22:19 +01:00
|
|
|
${optionalString enableSeparateDocOutput ''
|
2018-01-31 16:41:03 +00:00
|
|
|
for x in ${docdir "$doc"}"/html/src/"*.html; do
|
2017-12-05 08:36:08 +00:00
|
|
|
remove-references-to -t $out $x
|
2017-07-25 02:22:19 +01:00
|
|
|
done
|
2017-12-05 08:36:08 +00:00
|
|
|
mkdir -p $doc
|
2017-07-25 02:22:19 +01:00
|
|
|
''}
|
2017-12-05 08:36:08 +00:00
|
|
|
${optionalString enableSeparateDataOutput "mkdir -p $data"}
|
2017-07-25 02:22:19 +01:00
|
|
|
|
2015-01-07 19:31:32 +00:00
|
|
|
runHook postInstall
|
|
|
|
'';
|
|
|
|
|
2015-01-10 12:23:04 +00:00
|
|
|
passthru = passthru // {
|
|
|
|
|
2017-03-01 18:56:59 +00:00
|
|
|
inherit pname version;
|
2015-01-10 12:23:04 +00:00
|
|
|
|
2017-12-29 02:29:23 +00:00
|
|
|
compiler = ghc;
|
|
|
|
|
2018-09-17 22:11:59 +01:00
|
|
|
|
|
|
|
getBuildInputs = {
|
|
|
|
inherit propagatedBuildInputs otherBuildInputs allPkgconfigDepends;
|
|
|
|
haskellBuildInputs = isHaskellPartition.right;
|
|
|
|
systemBuildInputs = isHaskellPartition.wrong;
|
|
|
|
};
|
|
|
|
|
2018-07-27 05:24:22 +01:00
|
|
|
isHaskellLibrary = isLibrary;
|
2015-02-22 19:42:08 +00:00
|
|
|
|
2017-08-06 20:48:22 +01:00
|
|
|
# TODO: ask why the split outputs are configurable at all?
|
|
|
|
# TODO: include tests for split if possible
|
|
|
|
# Given the haskell package, returns
|
|
|
|
# the directory containing the haddock documentation.
|
|
|
|
# `null' if no haddock documentation was built.
|
|
|
|
# TODO: fetch the self from the fixpoint instead
|
2017-12-05 08:36:08 +00:00
|
|
|
haddockDir = self: if doHaddock then "${docdir self.doc}/html" else null;
|
2017-08-06 20:48:22 +01:00
|
|
|
|
2018-09-17 22:20:29 +01:00
|
|
|
env = shellFor {
|
|
|
|
packages = p: [ drv ];
|
2015-01-10 12:23:04 +00:00
|
|
|
};
|
2018-09-17 22:20:29 +01:00
|
|
|
|
2015-01-10 12:23:04 +00:00
|
|
|
};
|
2015-01-07 19:31:32 +00:00
|
|
|
|
2015-01-16 19:54:35 +00:00
|
|
|
meta = { inherit homepage license platforms; }
|
2015-01-10 08:12:37 +00:00
|
|
|
// optionalAttrs broken { inherit broken; }
|
|
|
|
// optionalAttrs (description != "") { inherit description; }
|
|
|
|
// optionalAttrs (maintainers != []) { inherit maintainers; }
|
2018-03-20 15:51:37 +00:00
|
|
|
// optionalAttrs (hydraPlatforms != null) { inherit hydraPlatforms; }
|
2015-01-10 08:12:37 +00:00
|
|
|
;
|
|
|
|
|
2015-01-07 19:31:32 +00:00
|
|
|
}
|
2016-02-18 03:07:32 +00:00
|
|
|
// optionalAttrs (preCompileBuildDriver != "") { inherit preCompileBuildDriver; }
|
|
|
|
// optionalAttrs (postCompileBuildDriver != "") { inherit postCompileBuildDriver; }
|
2015-01-19 15:24:12 +00:00
|
|
|
// optionalAttrs (preUnpack != "") { inherit preUnpack; }
|
|
|
|
// optionalAttrs (postUnpack != "") { inherit postUnpack; }
|
2015-01-10 08:12:37 +00:00
|
|
|
// optionalAttrs (patches != []) { inherit patches; }
|
|
|
|
// optionalAttrs (patchPhase != "") { inherit patchPhase; }
|
|
|
|
// optionalAttrs (preConfigure != "") { inherit preConfigure; }
|
|
|
|
// optionalAttrs (postConfigure != "") { inherit postConfigure; }
|
|
|
|
// optionalAttrs (preBuild != "") { inherit preBuild; }
|
|
|
|
// optionalAttrs (postBuild != "") { inherit postBuild; }
|
2017-09-19 14:36:29 +01:00
|
|
|
// optionalAttrs (doBenchmark) { inherit doBenchmark; }
|
2015-01-10 08:12:37 +00:00
|
|
|
// optionalAttrs (checkPhase != "") { inherit checkPhase; }
|
|
|
|
// optionalAttrs (preCheck != "") { inherit preCheck; }
|
|
|
|
// optionalAttrs (postCheck != "") { inherit postCheck; }
|
2015-01-20 14:48:51 +00:00
|
|
|
// optionalAttrs (preInstall != "") { inherit preInstall; }
|
2015-08-14 20:22:40 +01:00
|
|
|
// optionalAttrs (installPhase != "") { inherit installPhase; }
|
2015-01-20 14:48:51 +00:00
|
|
|
// optionalAttrs (postInstall != "") { inherit postInstall; }
|
2015-01-10 08:12:37 +00:00
|
|
|
// optionalAttrs (preFixup != "") { inherit preFixup; }
|
|
|
|
// optionalAttrs (postFixup != "") { inherit postFixup; }
|
2016-01-24 22:12:03 +00:00
|
|
|
// optionalAttrs (dontStrip) { inherit dontStrip; }
|
2016-09-14 17:58:46 +01:00
|
|
|
// optionalAttrs (hardeningDisable != []) { inherit hardeningDisable; }
|
2018-08-20 19:43:41 +01:00
|
|
|
// optionalAttrs (stdenv.buildPlatform.libc == "glibc"){ LOCALE_ARCHIVE = "${glibcLocales}/lib/locale/locale-archive"; }
|
2015-01-10 08:12:37 +00:00
|
|
|
)
|
2018-09-17 22:20:29 +01:00
|
|
|
)
|