2018-01-04 22:18:02 +01:00
|
|
|
{ stdenv, buildPackages, buildHaskellPackages, ghc
|
2017-09-10 21:36:48 +02:00
|
|
|
, jailbreak-cabal, hscolour, cpphs, nodejs
|
|
|
|
, buildPlatform, hostPlatform
|
2017-08-06 21:46:49 +02:00
|
|
|
}:
|
2017-09-10 21:36:48 +02:00
|
|
|
|
|
|
|
let
|
|
|
|
isCross = buildPlatform != hostPlatform;
|
|
|
|
inherit (buildPackages)
|
|
|
|
fetchurl removeReferencesTo
|
|
|
|
pkgconfig coreutils gnugrep gnused glibcLocales;
|
|
|
|
in
|
2015-01-07 20:31:32 +01:00
|
|
|
|
2015-01-10 09:12:37 +01:00
|
|
|
{ pname
|
2016-01-24 23:12:03 +01:00
|
|
|
, dontStrip ? (ghc.isGhcjs or false)
|
2015-03-24 20:09:49 +01:00
|
|
|
, version, revision ? null
|
2015-01-10 09:12:37 +01:00
|
|
|
, sha256 ? null
|
2015-01-07 20:31:32 +01:00
|
|
|
, src ? fetchurl { url = "mirror://hackage/${pname}-${version}.tar.gz"; inherit sha256; }
|
2016-06-09 23:27:57 +02:00
|
|
|
, buildDepends ? [], setupHaskellDepends ? [], libraryHaskellDepends ? [], executableHaskellDepends ? []
|
2015-01-16 20:54:35 +01:00
|
|
|
, buildTarget ? ""
|
2017-02-28 10:27:29 +01:00
|
|
|
, buildTools ? [], libraryToolDepends ? [], executableToolDepends ? [], testToolDepends ? [], benchmarkToolDepends ? []
|
2015-01-10 09:12:37 +01:00
|
|
|
, configureFlags ? []
|
|
|
|
, description ? ""
|
2016-11-18 16:44:53 +01:00
|
|
|
, doCheck ? !isCross && (stdenv.lib.versionOlder "7.4" ghc.version)
|
2017-09-19 15:36:29 +02:00
|
|
|
, doBenchmark ? false
|
2015-01-09 19:35:17 +01:00
|
|
|
, doHoogle ? true
|
2015-01-10 09:12:37 +01:00
|
|
|
, editedCabalFile ? null
|
2018-03-16 21:14:51 +01:00
|
|
|
, enableLibraryProfiling ? true
|
2015-08-06 16:13:10 +02:00
|
|
|
, enableExecutableProfiling ? false
|
2018-03-16 21:14:51 +01:00
|
|
|
, profilingDetail ? "all-functions"
|
2016-11-18 16:44:53 +01:00
|
|
|
# TODO enable shared libs for cross-compiling
|
2018-03-16 21:44:17 +01:00
|
|
|
, enableSharedExecutables ? false
|
2017-09-10 21:36:48 +02:00
|
|
|
, enableSharedLibraries ? ((ghc.isGhcjs or false) || stdenv.lib.versionOlder "7.7" ghc.version)
|
2018-03-16 21:55:56 +01:00
|
|
|
, enableDeadCodeElimination ? (!stdenv.isDarwin) # TODO: use -dead_strip for darwin
|
2015-01-07 20:31:32 +01:00
|
|
|
, enableStaticLibraries ? true
|
2018-03-05 14:33:49 +01:00
|
|
|
, enableHsc2hsViaAsm ? hostPlatform.isWindows && stdenv.lib.versionAtLeast ghc.version "8.4"
|
2015-06-17 16:40:21 +02:00
|
|
|
, extraLibraries ? [], librarySystemDepends ? [], executableSystemDepends ? []
|
2015-01-07 20:31:32 +01:00
|
|
|
, homepage ? "http://hackage.haskell.org/package/${pname}"
|
2018-03-20 16:51:37 +01:00
|
|
|
, platforms ? with stdenv.lib.platforms; unix ++ windows # GHC can cross-compile
|
|
|
|
, hydraPlatforms ? null
|
2015-01-10 09:12:37 +01:00
|
|
|
, hyperlinkSource ? true
|
|
|
|
, isExecutable ? false, isLibrary ? !isExecutable
|
|
|
|
, jailbreak ? false
|
|
|
|
, license
|
2015-01-07 20:31:32 +01:00
|
|
|
, maintainers ? []
|
2017-02-14 16:17:40 +01:00
|
|
|
, doCoverage ? false
|
2017-06-22 17:41:24 +02:00
|
|
|
, doHaddock ? !(ghc.isHaLVM or false)
|
2015-01-07 20:31:32 +01:00
|
|
|
, passthru ? {}
|
2017-02-28 10:27:29 +01:00
|
|
|
, pkgconfigDepends ? [], libraryPkgconfigDepends ? [], executablePkgconfigDepends ? [], testPkgconfigDepends ? [], benchmarkPkgconfigDepends ? []
|
2015-06-17 16:40:21 +02:00
|
|
|
, testDepends ? [], testHaskellDepends ? [], testSystemDepends ? []
|
2017-02-28 10:27:29 +01:00
|
|
|
, benchmarkDepends ? [], benchmarkHaskellDepends ? [], benchmarkSystemDepends ? []
|
2015-01-10 09:12:37 +01:00
|
|
|
, testTarget ? ""
|
|
|
|
, broken ? false
|
2016-02-18 04:07:32 +01:00
|
|
|
, preCompileBuildDriver ? "", postCompileBuildDriver ? ""
|
2015-01-19 16:24:12 +01:00
|
|
|
, preUnpack ? "", postUnpack ? ""
|
2015-04-05 09:58:37 +02:00
|
|
|
, patches ? [], patchPhase ? "", prePatch ? "", postPatch ? ""
|
2015-01-10 09:12:37 +01:00
|
|
|
, preConfigure ? "", postConfigure ? ""
|
|
|
|
, preBuild ? "", postBuild ? ""
|
2015-08-14 21:22:40 +02:00
|
|
|
, installPhase ? "", preInstall ? "", postInstall ? ""
|
2015-01-10 09:12:37 +01:00
|
|
|
, checkPhase ? "", preCheck ? "", postCheck ? ""
|
|
|
|
, preFixup ? "", postFixup ? ""
|
2015-09-09 19:58:28 +02:00
|
|
|
, shellHook ? ""
|
2015-01-13 22:15:29 +01:00
|
|
|
, coreSetup ? false # Use only core packages to build Setup.hs.
|
2015-01-15 22:36:01 +01:00
|
|
|
, useCpphs ? false
|
2017-09-10 21:36:48 +02:00
|
|
|
, hardeningDisable ? stdenv.lib.optional (ghc.isHaLVM or false) "all"
|
2017-07-25 03:22:19 +02:00
|
|
|
, enableSeparateDataOutput ? false
|
|
|
|
, enableSeparateDocOutput ? doHaddock
|
2015-03-27 16:11:18 +01:00
|
|
|
} @ args:
|
2015-01-07 20:31:32 +01:00
|
|
|
|
2015-03-24 20:09:49 +01:00
|
|
|
assert editedCabalFile != null -> revision != null;
|
2015-01-07 20:31:32 +01:00
|
|
|
|
|
|
|
let
|
|
|
|
|
2017-02-14 16:17:40 +01:00
|
|
|
inherit (stdenv.lib) optional optionals optionalString versionOlder versionAtLeast
|
2018-02-09 19:52:21 +01:00
|
|
|
concatStringsSep enableFeature optionalAttrs toUpper;
|
2015-01-07 20:31:32 +01:00
|
|
|
|
2015-03-13 04:20:56 +01:00
|
|
|
isGhcjs = ghc.isGhcjs or false;
|
2017-02-04 18:19:14 +01:00
|
|
|
isHaLVM = ghc.isHaLVM or false;
|
|
|
|
packageDbFlag = if isGhcjs || isHaLVM || versionOlder "7.6" ghc.version
|
2016-02-19 17:45:45 +01:00
|
|
|
then "package-db"
|
|
|
|
else "package-conf";
|
|
|
|
|
2018-01-04 22:18:02 +01: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 17:45:45 +01:00
|
|
|
nativePackageDbFlag = if versionOlder "7.6" nativeGhc.version
|
|
|
|
then "package-db"
|
|
|
|
else "package-conf";
|
2015-03-13 04:20:56 +01:00
|
|
|
|
2017-12-05 09:36:08 +01:00
|
|
|
# the target dir for haddock documentation
|
|
|
|
docdir = docoutput: docoutput + "/share/doc";
|
|
|
|
|
2015-04-01 13:52:21 +02:00
|
|
|
newCabalFileUrl = "http://hackage.haskell.org/package/${pname}-${version}/revision/${revision}.cabal";
|
2015-01-16 20:54:35 +01:00
|
|
|
newCabalFile = fetchurl {
|
2015-04-01 13:52:21 +02:00
|
|
|
url = newCabalFileUrl;
|
2015-01-16 20:54:35 +01:00
|
|
|
sha256 = editedCabalFile;
|
2015-03-24 20:09:49 +01:00
|
|
|
name = "${pname}-${version}-r${revision}.cabal";
|
2015-01-16 20:54:35 +01:00
|
|
|
};
|
|
|
|
|
2015-01-07 20:31:32 +01:00
|
|
|
defaultSetupHs = builtins.toFile "Setup.hs" ''
|
|
|
|
import Distribution.Simple
|
|
|
|
main = defaultMain
|
|
|
|
'';
|
|
|
|
|
2015-01-16 20:54:35 +01:00
|
|
|
hasActiveLibrary = isLibrary && (enableStaticLibraries || enableSharedLibraries || enableLibraryProfiling);
|
|
|
|
|
2015-06-05 23:55:01 +02: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>.
|
2017-01-03 10:41:51 +01:00
|
|
|
enableParallelBuilding = (versionOlder "7.8" ghc.version && !hasActiveLibrary) || versionOlder "8.0.1" ghc.version;
|
2015-01-16 20:54:35 +01:00
|
|
|
|
2016-11-18 16:44:53 +01:00
|
|
|
crossCabalFlags = [
|
2017-09-10 21:36:48 +02:00
|
|
|
"--with-ghc=${ghc.targetPrefix}ghc"
|
|
|
|
"--with-ghc-pkg=${ghc.targetPrefix}ghc-pkg"
|
2017-09-23 01:09:39 +02:00
|
|
|
"--with-gcc=${stdenv.cc.targetPrefix}cc"
|
|
|
|
"--with-ld=${stdenv.cc.bintools.targetPrefix}ld"
|
2018-03-05 14:33:49 +01:00
|
|
|
# use the one that comes with the cross compiler.
|
|
|
|
"--with-hsc2hs=${ghc.targetPrefix}hsc2hs"
|
2017-09-23 01:09:39 +02:00
|
|
|
"--with-strip=${stdenv.cc.bintools.targetPrefix}strip"
|
2018-03-05 14:33:49 +01:00
|
|
|
] ++ optionals (!isHaLVM) [
|
|
|
|
"--hsc2hs-option=--cross-compile"
|
|
|
|
(optionalString enableHsc2hsViaAsm "--hsc2hs-option=--via-asm")
|
|
|
|
];
|
2016-11-18 16:44:53 +01:00
|
|
|
|
|
|
|
crossCabalFlagsString =
|
|
|
|
stdenv.lib.optionalString isCross (" " + stdenv.lib.concatStringsSep " " crossCabalFlags);
|
|
|
|
|
2015-01-07 20:31:32 +01:00
|
|
|
defaultConfigureFlags = [
|
2017-12-05 09:36:08 +01:00
|
|
|
"--verbose" "--prefix=$out" "--libdir=\\$prefix/lib/\\$compiler" "--libsubdir=\\$pkgid"
|
|
|
|
(optionalString enableSeparateDataOutput "--datadir=$data/share/${ghc.name}")
|
|
|
|
(optionalString enableSeparateDocOutput "--docdir=${docdir "$doc"}")
|
2017-02-04 18:19:14 +01:00
|
|
|
"--with-gcc=$CC" # Clang won't work without that extra information.
|
2015-01-16 20:54:35 +01:00
|
|
|
"--package-db=$packageConfDir"
|
2017-12-05 09:36:08 +01:00
|
|
|
(optionalString (enableSharedExecutables && stdenv.isLinux) "--ghc-option=-optl=-Wl,-rpath=$out/lib/${ghc.name}/${pname}-${version}")
|
2015-01-16 20:54:35 +01:00
|
|
|
(optionalString (enableSharedExecutables && stdenv.isDarwin) "--ghc-option=-optl=-Wl,-headerpad_max_install_names")
|
|
|
|
(optionalString enableParallelBuilding "--ghc-option=-j$NIX_BUILD_CORES")
|
2015-06-17 16:40:21 +02:00
|
|
|
(optionalString useCpphs "--with-cpphs=${cpphs}/bin/cpphs --ghc-options=-cpp --ghc-options=-pgmP${cpphs}/bin/cpphs --ghc-options=-optP--cpp")
|
treewide: isArm -> isAarch32
Following legacy packing conventions, `isArm` was defined just for
32-bit ARM instruction set. This is confusing to non packagers though,
because Aarch64 is an ARM instruction set.
The official ARM overview for ARMv8[1] is surprisingly not confusing,
given the overall state of affairs for ARM naming conventions, and
offers us a solution. It divides the nomenclature into three levels:
```
ISA: ARMv8 {-A, -R, -M}
/ \
Mode: Aarch32 Aarch64
| / \
Encoding: A64 A32 T32
```
At the top is the overall v8 instruction set archicture. Second are the
two modes, defined by bitwidth but differing in other semantics too, and
buttom are the encodings, (hopefully?) isomorphic if they encode the
same mode.
The 32 bit encodings are mostly backwards compatible with previous
non-Thumb and Thumb encodings, and if so we can pun the mode names to
instead mean "sets of compatable or isomorphic encodings", and then
voilà we have nice names for 32-bit and 64-bit arm instruction sets
which do not use the word ARM so as to not confused either laymen or
experienced ARM packages.
[1]: https://developer.arm.com/products/architecture/a-profile
2018-03-20 03:41:06 +01:00
|
|
|
(enableFeature (enableDeadCodeElimination && !hostPlatform.isAarch32 && !hostPlatform.isAarch64 && (versionAtLeast "8.0.1" ghc.version)) "split-objs")
|
2015-01-07 20:31:32 +01:00
|
|
|
(enableFeature enableLibraryProfiling "library-profiling")
|
2018-03-29 06:28:05 +02:00
|
|
|
(optionalString ((enableExecutableProfiling || enableLibraryProfiling) && versionOlder "8" ghc.version) "--profiling-detail=${profilingDetail}")
|
2016-01-17 10:54:04 +01:00
|
|
|
(enableFeature enableExecutableProfiling (if versionOlder ghc.version "8" then "executable-profiling" else "profiling"))
|
2015-01-07 20:31:32 +01:00
|
|
|
(enableFeature enableSharedLibraries "shared")
|
2017-02-14 16:17:40 +01:00
|
|
|
(optionalString (versionAtLeast ghc.version "7.10") (enableFeature doCoverage "coverage"))
|
2018-03-16 21:38:55 +01:00
|
|
|
(optionalString (versionOlder "8.4" ghc.version) (enableFeature enableStaticLibraries "static"))
|
2015-03-13 04:20:56 +01:00
|
|
|
(optionalString (isGhcjs || versionOlder "7.4" ghc.version) (enableFeature enableSharedExecutables "executable-dynamic"))
|
|
|
|
(optionalString (isGhcjs || versionOlder "7" ghc.version) (enableFeature doCheck "tests"))
|
2018-03-16 21:38:55 +01:00
|
|
|
"--enable-library-vanilla" # TODO: Should this be configurable?
|
2018-03-16 21:32:02 +01:00
|
|
|
"--enable-library-for-ghci" # TODO: Should this be configurable?
|
2017-01-02 17:19:28 +01:00
|
|
|
] ++ optionals (enableDeadCodeElimination && (stdenv.lib.versionOlder "8.0.1" ghc.version)) [
|
|
|
|
"--ghc-option=-split-sections"
|
2015-03-13 04:20:56 +01:00
|
|
|
] ++ optionals isGhcjs [
|
|
|
|
"--ghcjs"
|
2016-11-18 16:44:53 +01:00
|
|
|
] ++ optionals isCross ([
|
2017-09-10 21:36:48 +02:00
|
|
|
"--configure-option=--host=${hostPlatform.config}"
|
2016-11-18 16:44:53 +01:00
|
|
|
] ++ crossCabalFlags);
|
2015-01-07 20:31:32 +01:00
|
|
|
|
2015-01-16 20:54:35 +01:00
|
|
|
setupCompileFlags = [
|
2018-01-04 22:18:02 +01:00
|
|
|
(optionalString (!coreSetup) "-${nativePackageDbFlag}=$packageConfDir")
|
2017-02-04 18:19:14 +01: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 20:54:35 +01:00
|
|
|
];
|
2015-01-07 20:31:32 +01:00
|
|
|
|
2015-01-16 20:54:35 +01:00
|
|
|
isHaskellPkg = x: (x ? pname) && (x ? version) && (x ? env);
|
2015-01-10 13:23:04 +01:00
|
|
|
isSystemPkg = x: !isHaskellPkg x;
|
|
|
|
|
2015-07-23 22:16:16 +02:00
|
|
|
allPkgconfigDepends = pkgconfigDepends ++ libraryPkgconfigDepends ++ executablePkgconfigDepends ++
|
2017-09-19 15:36:29 +02:00
|
|
|
optionals doCheck testPkgconfigDepends ++ optionals doBenchmark benchmarkPkgconfigDepends;
|
2015-07-23 22:16:16 +02:00
|
|
|
|
2018-01-04 22:18:02 +01:00
|
|
|
nativeBuildInputs = [ ghc nativeGhc removeReferencesTo ] ++ optional (allPkgconfigDepends != []) pkgconfig ++
|
2017-02-02 17:44:11 +01:00
|
|
|
buildTools ++ libraryToolDepends ++ executableToolDepends;
|
2016-06-12 23:07:46 +02:00
|
|
|
propagatedBuildInputs = buildDepends ++ libraryHaskellDepends ++ executableHaskellDepends;
|
2017-07-18 20:54:10 +02:00
|
|
|
otherBuildInputs = setupHaskellDepends ++ extraLibraries ++ librarySystemDepends ++ executableSystemDepends ++
|
2017-09-20 21:48:29 +02:00
|
|
|
optionals (allPkgconfigDepends != []) allPkgconfigDepends ++
|
2017-02-27 12:47:00 +01:00
|
|
|
optionals doCheck (testDepends ++ testHaskellDepends ++ testSystemDepends ++ testToolDepends) ++
|
2017-09-19 15:36:29 +02:00
|
|
|
optionals doBenchmark (benchmarkDepends ++ benchmarkHaskellDepends ++ benchmarkSystemDepends ++ benchmarkToolDepends);
|
2015-01-16 20:54:35 +01:00
|
|
|
allBuildInputs = propagatedBuildInputs ++ otherBuildInputs;
|
|
|
|
|
2015-01-10 13:23:04 +01:00
|
|
|
haskellBuildInputs = stdenv.lib.filter isHaskellPkg allBuildInputs;
|
|
|
|
systemBuildInputs = stdenv.lib.filter isSystemPkg allBuildInputs;
|
|
|
|
|
2015-01-11 11:59:47 +01:00
|
|
|
ghcEnv = ghc.withPackages (p: haskellBuildInputs);
|
|
|
|
|
2016-02-18 09:11:42 +01:00
|
|
|
setupCommand = "./Setup";
|
2018-01-04 22:18:02 +01:00
|
|
|
|
2017-01-22 23:05:19 +01:00
|
|
|
ghcCommand' = if isGhcjs then "ghcjs" else "ghc";
|
2017-09-10 21:36:48 +02:00
|
|
|
ghcCommand = "${ghc.targetPrefix}${ghcCommand'}";
|
2017-01-23 17:35:59 +01:00
|
|
|
ghcCommandCaps= toUpper ghcCommand';
|
2015-03-13 04:20:56 +01:00
|
|
|
|
2018-01-04 22:18:02 +01:00
|
|
|
nativeGhcCommand = "${nativeGhc.targetPrefix}ghc";
|
|
|
|
|
2015-01-07 20:31:32 +01:00
|
|
|
in
|
2015-07-23 22:16:16 +02:00
|
|
|
|
|
|
|
assert allPkgconfigDepends != [] -> pkgconfig != null;
|
|
|
|
|
2015-01-10 09:12:37 +01:00
|
|
|
stdenv.mkDerivation ({
|
2015-08-29 23:29:17 +02:00
|
|
|
name = "${pname}-${version}";
|
2015-01-07 20:31:32 +01:00
|
|
|
|
2018-02-16 16:53:07 +01:00
|
|
|
outputs = [ "out" ] ++ (optional enableSeparateDataOutput "data") ++ (optional enableSeparateDocOutput "doc");
|
2017-07-25 03:22:19 +02:00
|
|
|
setOutputFlags = false;
|
|
|
|
|
2015-03-27 16:11:18 +01:00
|
|
|
pos = builtins.unsafeGetAttrPos "pname" args;
|
|
|
|
|
2015-01-16 20:54:35 +01:00
|
|
|
prePhases = ["setupCompilerEnvironmentPhase"];
|
2015-02-25 20:15:26 +01:00
|
|
|
preConfigurePhases = ["compileBuildDriverPhase"];
|
2015-01-16 20:54:35 +01:00
|
|
|
preInstallPhases = ["haddockPhase"];
|
|
|
|
|
2015-01-07 20:31:32 +01:00
|
|
|
inherit src;
|
|
|
|
|
2017-06-08 16:55:11 +02:00
|
|
|
inherit nativeBuildInputs;
|
|
|
|
buildInputs = otherBuildInputs ++ optionals (!hasActiveLibrary) propagatedBuildInputs;
|
|
|
|
propagatedBuildInputs = optionals hasActiveLibrary propagatedBuildInputs;
|
2015-01-07 20:31:32 +01:00
|
|
|
|
2015-01-16 20:54:35 +01:00
|
|
|
LANG = "en_US.UTF-8"; # GHC needs the locale configured during the Haddock phase.
|
2015-01-07 20:31:32 +01:00
|
|
|
|
2015-02-25 20:15:26 +01:00
|
|
|
prePatch = optionalString (editedCabalFile != null) ''
|
2015-04-01 13:52:21 +02:00
|
|
|
echo "Replace Cabal file with edited version from ${newCabalFileUrl}."
|
2015-02-25 20:15:26 +01:00
|
|
|
cp ${newCabalFile} ${pname}.cabal
|
2015-04-04 15:12:43 +02:00
|
|
|
'' + prePatch;
|
|
|
|
|
|
|
|
postPatch = optionalString jailbreak ''
|
2015-04-01 14:02:46 +02:00
|
|
|
echo "Run jailbreak-cabal to lift version restrictions on build inputs."
|
2017-12-05 09:36:08 +01:00
|
|
|
${jailbreak-cabal}/bin/jailbreak-cabal ${pname}.cabal
|
2015-04-04 15:12:43 +02:00
|
|
|
'' + postPatch;
|
2015-02-25 20:15:26 +01:00
|
|
|
|
2015-01-16 20:54:35 +01:00
|
|
|
setupCompilerEnvironmentPhase = ''
|
|
|
|
runHook preSetupCompilerEnvironment
|
2015-01-07 20:31:32 +01:00
|
|
|
|
2015-04-01 14:02:46 +02:00
|
|
|
echo "Build with ${ghc}."
|
2017-12-05 09:36:08 +01:00
|
|
|
${optionalString (hasActiveLibrary && hyperlinkSource) "export PATH=${hscolour}/bin:$PATH"}
|
2015-01-07 20:31:32 +01:00
|
|
|
|
2015-02-23 11:45:49 +01:00
|
|
|
packageConfDir="$TMPDIR/package.conf.d"
|
2015-01-10 09:12:37 +01:00
|
|
|
mkdir -p $packageConfDir
|
|
|
|
|
2015-01-16 20:54:35 +01:00
|
|
|
setupCompileFlags="${concatStringsSep " " setupCompileFlags}"
|
|
|
|
configureFlags="${concatStringsSep " " defaultConfigureFlags} $configureFlags"
|
|
|
|
|
2017-08-12 18:41:49 +02:00
|
|
|
# host.*Pkgs defined in stdenv/setup.hs
|
|
|
|
for p in "''${pkgsHostHost[@]}" "''${pkgsHostTarget[@]}"; do
|
2015-01-10 09:12:37 +01:00
|
|
|
if [ -d "$p/lib/${ghc.name}/package.conf.d" ]; then
|
|
|
|
cp -f "$p/lib/${ghc.name}/package.conf.d/"*.conf $packageConfDir/
|
2015-01-07 20:31:32 +01:00
|
|
|
continue
|
|
|
|
fi
|
|
|
|
if [ -d "$p/include" ]; then
|
|
|
|
configureFlags+=" --extra-include-dirs=$p/include"
|
|
|
|
fi
|
2015-02-25 19:42:02 +01:00
|
|
|
if [ -d "$p/lib" ]; then
|
2016-07-21 14:56:45 +02:00
|
|
|
configureFlags+=" --extra-lib-dirs=$p/lib"
|
2015-02-25 19:42:02 +01:00
|
|
|
fi
|
2015-01-07 20:31:32 +01:00
|
|
|
done
|
2018-03-20 23:26:00 +01: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
|
|
|
|
+ (optionalString (stdenv.isDarwin && enableSharedLibraries) ''
|
2017-08-07 00:05:18 +02:00
|
|
|
# Work around a limit in the macOS Sierra linker on the number of paths
|
2017-05-05 18:53:08 +02:00
|
|
|
# referenced by any one dynamic library:
|
|
|
|
#
|
2017-08-07 00:05:18 +02:00
|
|
|
# Create a local directory with symlinks of the *.dylib (macOS shared
|
2017-05-05 18:53:08 +02:00
|
|
|
# libraries) from all the dependencies.
|
2017-12-05 09:36:08 +01:00
|
|
|
local dynamicLinksDir="$out/lib/links"
|
2017-05-05 18:53:08 +02:00
|
|
|
mkdir -p $dynamicLinksDir
|
2018-01-02 17:37:54 +01:00
|
|
|
for d in $(grep dynamic-library-dirs "$packageConfDir/"*|awk '{print $2}'|sort -u); do
|
2017-07-18 20:57:24 +02:00
|
|
|
ln -s "$d/"*.dylib $dynamicLinksDir
|
2017-05-05 18:53:08 +02:00
|
|
|
done
|
|
|
|
# Edit the local package DB to reference the links directory.
|
2017-07-18 20:57:24 +02:00
|
|
|
for f in "$packageConfDir/"*.conf; do
|
2017-05-05 18:53:08 +02:00
|
|
|
sed -i "s,dynamic-library-dirs: .*,dynamic-library-dirs: $dynamicLinksDir," $f
|
|
|
|
done
|
|
|
|
'') + ''
|
2015-03-13 04:20:56 +01:00
|
|
|
${ghcCommand}-pkg --${packageDbFlag}="$packageConfDir" recache
|
2015-01-16 20:54:35 +01:00
|
|
|
|
|
|
|
runHook postSetupCompilerEnvironment
|
|
|
|
'';
|
|
|
|
|
|
|
|
compileBuildDriverPhase = ''
|
|
|
|
runHook preCompileBuildDriver
|
|
|
|
|
2015-01-07 20:31:32 +01:00
|
|
|
for i in Setup.hs Setup.lhs ${defaultSetupHs}; do
|
|
|
|
test -f $i && break
|
|
|
|
done
|
|
|
|
|
2015-01-16 20:54:35 +01:00
|
|
|
echo setupCompileFlags: $setupCompileFlags
|
2018-01-04 22:18:02 +01:00
|
|
|
${nativeGhcCommand} $setupCompileFlags --make -o Setup -odir $TMPDIR -hidir $TMPDIR $i
|
2015-01-16 20:54:35 +01:00
|
|
|
|
|
|
|
runHook postCompileBuildDriver
|
|
|
|
'';
|
|
|
|
|
2017-02-02 17:44:11 +01:00
|
|
|
# Cabal takes flags like `--configure-option=--host=...` instead
|
|
|
|
configurePlatforms = [];
|
2017-09-10 21:36:48 +02:00
|
|
|
inherit configureFlags;
|
|
|
|
|
2015-01-16 20:54:35 +01:00
|
|
|
configurePhase = ''
|
|
|
|
runHook preConfigure
|
|
|
|
|
2015-01-10 09:12:37 +01:00
|
|
|
unset GHC_PACKAGE_PATH # Cabal complains if this variable is set during configure.
|
2015-01-16 20:54:35 +01:00
|
|
|
|
|
|
|
echo configureFlags: $configureFlags
|
2015-05-06 21:56:02 +02:00
|
|
|
${setupCommand} configure $configureFlags 2>&1 | ${coreutils}/bin/tee "$NIX_BUILD_TOP/cabal-configure.log"
|
2017-12-29 19:32:12 +01:00
|
|
|
if ${gnugrep}/bin/egrep -q -z 'Warning:.*depends on multiple versions' "$NIX_BUILD_TOP/cabal-configure.log"; then
|
2015-01-07 20:31:32 +01:00
|
|
|
echo >&2 "*** abort because of serious configure-time warning from Cabal"
|
|
|
|
exit 1
|
|
|
|
fi
|
|
|
|
|
2015-01-10 09:12:37 +01:00
|
|
|
export GHC_PACKAGE_PATH="$packageConfDir:"
|
2015-01-07 20:31:32 +01:00
|
|
|
|
|
|
|
runHook postConfigure
|
|
|
|
'';
|
|
|
|
|
|
|
|
buildPhase = ''
|
|
|
|
runHook preBuild
|
2016-11-18 16:44:53 +01:00
|
|
|
${setupCommand} build ${buildTarget}${crossCabalFlagsString}
|
2015-01-07 20:31:32 +01:00
|
|
|
runHook postBuild
|
|
|
|
'';
|
|
|
|
|
2015-01-10 09:12:37 +01:00
|
|
|
checkPhase = ''
|
2015-01-07 20:31:32 +01:00
|
|
|
runHook preCheck
|
2015-05-06 21:56:02 +02:00
|
|
|
${setupCommand} test ${testTarget}
|
2015-01-07 20:31:32 +01:00
|
|
|
runHook postCheck
|
|
|
|
'';
|
|
|
|
|
2015-01-16 20:54:35 +01:00
|
|
|
haddockPhase = ''
|
|
|
|
runHook preHaddock
|
2015-01-18 11:04:38 +01:00
|
|
|
${optionalString (doHaddock && hasActiveLibrary) ''
|
2015-05-06 21:56:02 +02:00
|
|
|
${setupCommand} haddock --html \
|
2015-01-16 20:54:35 +01:00
|
|
|
${optionalString doHoogle "--hoogle"} \
|
|
|
|
${optionalString (hasActiveLibrary && hyperlinkSource) "--hyperlink-source"}
|
|
|
|
''}
|
|
|
|
runHook postHaddock
|
|
|
|
'';
|
|
|
|
|
2015-01-10 09:12:37 +01:00
|
|
|
installPhase = ''
|
2015-01-07 20:31:32 +01:00
|
|
|
runHook preInstall
|
|
|
|
|
2015-05-06 21:56:02 +02:00
|
|
|
${if !hasActiveLibrary then "${setupCommand} install" else ''
|
|
|
|
${setupCommand} copy
|
2017-12-05 09:36:08 +01:00
|
|
|
local packageConfDir="$out/lib/${ghc.name}/package.conf.d"
|
2015-01-10 09:12:37 +01:00
|
|
|
local packageConfFile="$packageConfDir/${pname}-${version}.conf"
|
|
|
|
mkdir -p "$packageConfDir"
|
2015-05-06 21:56:02 +02:00
|
|
|
${setupCommand} register --gen-pkg-config=$packageConfFile
|
2017-12-23 01:25:59 +01:00
|
|
|
if [ -d "$packageConfFile" ]; then
|
2018-01-31 17:41:03 +01:00
|
|
|
mv "$packageConfFile/"* "$packageConfDir"
|
2017-12-23 01:25:59 +01:00
|
|
|
rmdir "$packageConfFile"
|
|
|
|
fi
|
2018-01-31 17:41:03 +01:00
|
|
|
for packageConfFile in "$packageConfDir/"*; do
|
2017-12-23 01:25:59 +01:00
|
|
|
local pkgId=$( ${gnused}/bin/sed -n -e 's|^id: ||p' $packageConfFile )
|
|
|
|
mv $packageConfFile $packageConfDir/$pkgId.conf
|
|
|
|
done
|
2015-01-07 20:31:32 +01:00
|
|
|
''}
|
2017-03-25 05:23:01 +01:00
|
|
|
${optionalString isGhcjs ''
|
2017-12-05 09:36:08 +01:00
|
|
|
for exeDir in "$out/bin/"*.jsexe; do
|
2017-03-25 05:23:01 +01:00
|
|
|
exe="''${exeDir%.jsexe}"
|
2017-07-26 00:48:47 +02:00
|
|
|
printWords '#!${nodejs}/bin/node' > "$exe"
|
2018-03-26 02:43:23 +02:00
|
|
|
echo >> "$exe"
|
2017-03-25 05:23:01 +01:00
|
|
|
cat "$exeDir/all.js" >> "$exe"
|
|
|
|
chmod +x "$exe"
|
|
|
|
done
|
|
|
|
''}
|
2017-02-14 16:17:40 +01:00
|
|
|
${optionalString doCoverage "mkdir -p $out/share && cp -r dist/hpc $out/share"}
|
2015-05-31 09:18:13 +02:00
|
|
|
${optionalString (enableSharedExecutables && isExecutable && !isGhcjs && stdenv.isDarwin && stdenv.lib.versionOlder ghc.version "7.10") ''
|
2017-12-05 09:36:08 +01:00
|
|
|
for exe in "$out/bin/"* ; do
|
|
|
|
install_name_tool -add_rpath "$out/lib/ghc-${ghc.version}/${pname}-${version}" "$exe"
|
2015-01-07 20:31:32 +01:00
|
|
|
done
|
|
|
|
''}
|
|
|
|
|
2017-07-25 03:22:19 +02:00
|
|
|
${optionalString enableSeparateDocOutput ''
|
2018-01-31 17:41:03 +01:00
|
|
|
for x in ${docdir "$doc"}"/html/src/"*.html; do
|
2017-12-05 09:36:08 +01:00
|
|
|
remove-references-to -t $out $x
|
2017-07-25 03:22:19 +02:00
|
|
|
done
|
2017-12-05 09:36:08 +01:00
|
|
|
mkdir -p $doc
|
2017-07-25 03:22:19 +02:00
|
|
|
''}
|
2017-12-05 09:36:08 +01:00
|
|
|
${optionalString enableSeparateDataOutput "mkdir -p $data"}
|
2017-07-25 03:22:19 +02:00
|
|
|
|
2015-01-07 20:31:32 +01:00
|
|
|
runHook postInstall
|
|
|
|
'';
|
|
|
|
|
2015-01-10 13:23:04 +01:00
|
|
|
passthru = passthru // {
|
|
|
|
|
2017-03-01 19:56:59 +01:00
|
|
|
inherit pname version;
|
2015-01-10 13:23:04 +01:00
|
|
|
|
2017-12-29 03:29:23 +01:00
|
|
|
compiler = ghc;
|
|
|
|
|
2015-02-22 20:42:08 +01:00
|
|
|
isHaskellLibrary = hasActiveLibrary;
|
|
|
|
|
2017-08-06 21:48:22 +02: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 09:36:08 +01:00
|
|
|
haddockDir = self: if doHaddock then "${docdir self.doc}/html" else null;
|
2017-08-06 21:48:22 +02:00
|
|
|
|
2015-01-10 13:23:04 +01:00
|
|
|
env = stdenv.mkDerivation {
|
2015-09-10 19:07:52 +02:00
|
|
|
name = "interactive-${pname}-${version}-environment";
|
2017-12-18 20:49:18 +01:00
|
|
|
buildInputs = systemBuildInputs;
|
2018-02-09 19:47:39 +01:00
|
|
|
nativeBuildInputs = [ ghcEnv ] ++ nativeBuildInputs;
|
2015-01-23 08:16:53 +01:00
|
|
|
LANG = "en_US.UTF-8";
|
2018-03-20 20:38:40 +01:00
|
|
|
LOCALE_ARCHIVE = optionalString (stdenv.hostPlatform.libc == "glibc") "${glibcLocales}/lib/locale/locale-archive";
|
2015-01-11 11:59:47 +01:00
|
|
|
shellHook = ''
|
2015-05-08 17:53:28 +02:00
|
|
|
export NIX_${ghcCommandCaps}="${ghcEnv}/bin/${ghcCommand}"
|
|
|
|
export NIX_${ghcCommandCaps}PKG="${ghcEnv}/bin/${ghcCommand}-pkg"
|
2017-08-06 21:48:22 +02:00
|
|
|
# TODO: is this still valid?
|
2015-05-08 17:53:28 +02:00
|
|
|
export NIX_${ghcCommandCaps}_DOCDIR="${ghcEnv}/share/doc/ghc/html"
|
2017-04-15 10:33:07 +02:00
|
|
|
${if isHaLVM
|
|
|
|
then ''export NIX_${ghcCommandCaps}_LIBDIR="${ghcEnv}/lib/HaLVM-${ghc.version}"''
|
|
|
|
else ''export NIX_${ghcCommandCaps}_LIBDIR="${ghcEnv}/lib/${ghcCommand}-${ghc.version}"''}
|
|
|
|
${shellHook}
|
|
|
|
'';
|
2015-01-10 13:23:04 +01:00
|
|
|
};
|
|
|
|
};
|
2015-01-07 20:31:32 +01:00
|
|
|
|
2015-01-16 20:54:35 +01:00
|
|
|
meta = { inherit homepage license platforms; }
|
2015-01-10 09:12:37 +01:00
|
|
|
// optionalAttrs broken { inherit broken; }
|
|
|
|
// optionalAttrs (description != "") { inherit description; }
|
|
|
|
// optionalAttrs (maintainers != []) { inherit maintainers; }
|
2018-03-20 16:51:37 +01:00
|
|
|
// optionalAttrs (hydraPlatforms != null) { inherit hydraPlatforms; }
|
2015-01-10 09:12:37 +01:00
|
|
|
;
|
|
|
|
|
2015-01-07 20:31:32 +01:00
|
|
|
}
|
2016-02-18 04:07:32 +01:00
|
|
|
// optionalAttrs (preCompileBuildDriver != "") { inherit preCompileBuildDriver; }
|
|
|
|
// optionalAttrs (postCompileBuildDriver != "") { inherit postCompileBuildDriver; }
|
2015-01-19 16:24:12 +01:00
|
|
|
// optionalAttrs (preUnpack != "") { inherit preUnpack; }
|
|
|
|
// optionalAttrs (postUnpack != "") { inherit postUnpack; }
|
2015-01-10 09:12:37 +01: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; }
|
2015-01-20 15:48:51 +01:00
|
|
|
// optionalAttrs (doCheck) { inherit doCheck; }
|
2017-09-19 15:36:29 +02:00
|
|
|
// optionalAttrs (doBenchmark) { inherit doBenchmark; }
|
2015-01-10 09:12:37 +01:00
|
|
|
// optionalAttrs (checkPhase != "") { inherit checkPhase; }
|
|
|
|
// optionalAttrs (preCheck != "") { inherit preCheck; }
|
|
|
|
// optionalAttrs (postCheck != "") { inherit postCheck; }
|
2015-01-20 15:48:51 +01:00
|
|
|
// optionalAttrs (preInstall != "") { inherit preInstall; }
|
2015-08-14 21:22:40 +02:00
|
|
|
// optionalAttrs (installPhase != "") { inherit installPhase; }
|
2015-01-20 15:48:51 +01:00
|
|
|
// optionalAttrs (postInstall != "") { inherit postInstall; }
|
2015-01-10 09:12:37 +01:00
|
|
|
// optionalAttrs (preFixup != "") { inherit preFixup; }
|
|
|
|
// optionalAttrs (postFixup != "") { inherit postFixup; }
|
2016-01-24 23:12:03 +01:00
|
|
|
// optionalAttrs (dontStrip) { inherit dontStrip; }
|
2016-09-14 18:58:46 +02:00
|
|
|
// optionalAttrs (hardeningDisable != []) { inherit hardeningDisable; }
|
2018-03-20 20:38:40 +01:00
|
|
|
// optionalAttrs (buildPlatform.libc == "glibc"){ LOCALE_ARCHIVE = "${glibcLocales}/lib/locale/locale-archive"; }
|
2015-01-10 09:12:37 +01:00
|
|
|
)
|