2017-08-01 17:44:08 +01:00
|
|
|
# TODO(@Ericson2314): Remove `pkgs` param, which is only used for
|
2017-08-30 13:40:54 +01:00
|
|
|
# `buildStackProject`, `justStaticExecutables` and `checkUnusedPackages`
|
2017-08-01 17:44:08 +01:00
|
|
|
{ pkgs, lib }:
|
2015-01-10 19:26:08 +00:00
|
|
|
|
|
|
|
rec {
|
2017-08-01 17:44:08 +01:00
|
|
|
makePackageSet = import ./make-package-set.nix;
|
2015-01-07 19:31:32 +00:00
|
|
|
|
2015-01-12 17:20:42 +00:00
|
|
|
overrideCabal = drv: f: (drv.override (args: args // {
|
2017-02-10 05:04:17 +00:00
|
|
|
mkDerivation = drv: (args.mkDerivation drv).override f;
|
2015-01-12 17:20:42 +00:00
|
|
|
})) // {
|
2015-01-12 17:18:46 +00:00
|
|
|
overrideScope = scope: overrideCabal (drv.overrideScope scope) f;
|
2015-01-12 17:20:42 +00:00
|
|
|
};
|
2015-01-07 19:31:32 +00:00
|
|
|
|
2017-02-14 15:17:40 +00:00
|
|
|
doCoverage = drv: overrideCabal drv (drv: { doCoverage = true; });
|
|
|
|
dontCoverage = drv: overrideCabal drv (drv: { doCoverage = false; });
|
|
|
|
|
2015-01-18 10:04:38 +00:00
|
|
|
doHaddock = drv: overrideCabal drv (drv: { doHaddock = true; });
|
|
|
|
dontHaddock = drv: overrideCabal drv (drv: { doHaddock = false; });
|
2015-01-10 19:26:08 +00:00
|
|
|
|
|
|
|
doJailbreak = drv: overrideCabal drv (drv: { jailbreak = true; });
|
|
|
|
dontJailbreak = drv: overrideCabal drv (drv: { jailbreak = false; });
|
|
|
|
|
2015-01-12 00:28:15 +00:00
|
|
|
doCheck = drv: overrideCabal drv (drv: { doCheck = true; });
|
2015-01-10 19:26:08 +00:00
|
|
|
dontCheck = drv: overrideCabal drv (drv: { doCheck = false; });
|
|
|
|
|
2015-09-15 14:02:39 +01:00
|
|
|
doDistribute = drv: overrideCabal drv (drv: { hydraPlatforms = drv.platforms or ["i686-linux" "x86_64-linux" "x86_64-darwin"]; });
|
2015-01-10 19:26:08 +00:00
|
|
|
dontDistribute = drv: overrideCabal drv (drv: { hydraPlatforms = []; });
|
|
|
|
|
2015-01-12 00:28:15 +00:00
|
|
|
appendConfigureFlag = drv: x: overrideCabal drv (drv: { configureFlags = (drv.configureFlags or []) ++ [x]; });
|
2017-08-01 17:44:08 +01:00
|
|
|
removeConfigureFlag = drv: x: overrideCabal drv (drv: { configureFlags = lib.remove x (drv.configureFlags or []); });
|
2015-01-10 19:26:08 +00:00
|
|
|
|
2015-01-19 13:59:04 +00:00
|
|
|
addBuildTool = drv: x: addBuildTools drv [x];
|
|
|
|
addBuildTools = drv: xs: overrideCabal drv (drv: { buildTools = (drv.buildTools or []) ++ xs; });
|
|
|
|
|
2015-02-03 11:24:13 +00:00
|
|
|
addExtraLibrary = drv: x: addExtraLibraries drv [x];
|
|
|
|
addExtraLibraries = drv: xs: overrideCabal drv (drv: { extraLibraries = (drv.extraLibraries or []) ++ xs; });
|
|
|
|
|
2015-01-20 22:50:38 +00:00
|
|
|
addBuildDepend = drv: x: addBuildDepends drv [x];
|
|
|
|
addBuildDepends = drv: xs: overrideCabal drv (drv: { buildDepends = (drv.buildDepends or []) ++ xs; });
|
|
|
|
|
2015-08-06 11:37:46 +01:00
|
|
|
addPkgconfigDepend = drv: x: addPkgconfigDepends drv [x];
|
2015-12-16 20:49:33 +00:00
|
|
|
addPkgconfigDepends = drv: xs: overrideCabal drv (drv: { pkgconfigDepends = (drv.pkgconfigDepends or []) ++ xs; });
|
2015-08-06 11:37:46 +01:00
|
|
|
|
2017-03-25 04:23:01 +00:00
|
|
|
addSetupDepend = drv: x: addSetupDepends drv [x];
|
|
|
|
addSetupDepends = drv: xs: overrideCabal drv (drv: { setupHaskellDepends = (drv.setupHaskellDepends or []) ++ xs; });
|
|
|
|
|
2015-01-10 19:26:08 +00:00
|
|
|
enableCabalFlag = drv: x: appendConfigureFlag (removeConfigureFlag drv "-f-${x}") "-f${x}";
|
|
|
|
disableCabalFlag = drv: x: appendConfigureFlag (removeConfigureFlag drv "-f${x}") "-f-${x}";
|
|
|
|
|
2015-01-23 09:47:55 +00:00
|
|
|
markBroken = drv: overrideCabal drv (drv: { broken = true; });
|
|
|
|
markBrokenVersion = version: drv: assert drv.version == version; markBroken drv;
|
2015-01-12 15:12:33 +00:00
|
|
|
|
2015-01-13 11:28:17 +00:00
|
|
|
enableLibraryProfiling = drv: overrideCabal drv (drv: { enableLibraryProfiling = true; });
|
|
|
|
disableLibraryProfiling = drv: overrideCabal drv (drv: { enableLibraryProfiling = false; });
|
|
|
|
|
2015-02-06 11:10:56 +00:00
|
|
|
enableSharedExecutables = drv: overrideCabal drv (drv: { enableSharedExecutables = true; });
|
|
|
|
disableSharedExecutables = drv: overrideCabal drv (drv: { enableSharedExecutables = false; });
|
2015-01-13 11:28:17 +00:00
|
|
|
|
|
|
|
enableSharedLibraries = drv: overrideCabal drv (drv: { enableSharedLibraries = true; });
|
|
|
|
disableSharedLibraries = drv: overrideCabal drv (drv: { enableSharedLibraries = false; });
|
|
|
|
|
2017-01-02 16:19:28 +00:00
|
|
|
enableDeadCodeElimination = drv: overrideCabal drv (drv: { enableDeadCodeElimination = true; });
|
|
|
|
disableDeadCodeElimination = drv: overrideCabal drv (drv: { enableDeadCodeElimination = false; });
|
2015-01-13 11:28:17 +00:00
|
|
|
|
|
|
|
enableStaticLibraries = drv: overrideCabal drv (drv: { enableStaticLibraries = true; });
|
|
|
|
disableStaticLibraries = drv: overrideCabal drv (drv: { enableStaticLibraries = false; });
|
|
|
|
|
2015-01-23 09:47:55 +00:00
|
|
|
appendPatch = drv: x: appendPatches drv [x];
|
|
|
|
appendPatches = drv: xs: overrideCabal drv (drv: { patches = (drv.patches or []) ++ xs; });
|
|
|
|
|
2015-04-01 15:42:52 +01:00
|
|
|
doHyperlinkSource = drv: overrideCabal drv (drv: { hyperlinkSource = true; });
|
|
|
|
dontHyperlinkSource = drv: overrideCabal drv (drv: { hyperlinkSource = false; });
|
|
|
|
|
2016-09-14 17:58:46 +01:00
|
|
|
disableHardening = drv: flags: overrideCabal drv (drv: { hardeningDisable = flags; });
|
|
|
|
|
2017-09-01 15:49:50 +01:00
|
|
|
# Controls if Nix should strip the binary files (removes debug symbols)
|
|
|
|
doStrip = drv: overrideCabal drv (drv: { dontStrip = false; });
|
|
|
|
dontStrip = drv: overrideCabal drv (drv: { dontStrip = true; });
|
|
|
|
|
|
|
|
# Useful for debugging segfaults with gdb.
|
|
|
|
# -g: enables debugging symbols
|
|
|
|
# --disable-*-stripping: tell GHC not to strip resulting binaries
|
|
|
|
# dontStrip: see above
|
|
|
|
enableDWARFDebugging = drv:
|
|
|
|
appendConfigureFlag (dontStrip drv) "--ghc-options=-g --disable-executable-stripping --disable-library-stripping";
|
|
|
|
|
2017-08-01 17:44:08 +01:00
|
|
|
sdistTarball = pkg: lib.overrideDerivation pkg (drv: {
|
2015-06-02 12:58:57 +01:00
|
|
|
name = "${drv.pname}-source-${drv.version}";
|
2017-08-10 07:47:07 +01:00
|
|
|
# Since we disable the haddock phase, we also need to override the
|
|
|
|
# outputs since the separate doc output will not be produced.
|
|
|
|
outputs = ["out"];
|
2015-06-02 12:58:57 +01:00
|
|
|
buildPhase = "./Setup sdist";
|
|
|
|
haddockPhase = ":";
|
|
|
|
checkPhase = ":";
|
2015-08-30 14:18:15 +01:00
|
|
|
installPhase = "install -D dist/${drv.pname}-*.tar.gz $out/${drv.pname}-${drv.version}.tar.gz";
|
2015-06-02 12:58:57 +01:00
|
|
|
fixupPhase = ":";
|
|
|
|
});
|
|
|
|
|
2017-04-07 00:28:44 +01:00
|
|
|
linkWithGold = drv : appendConfigureFlag drv
|
|
|
|
"--ghc-option=-optl-fuse-ld=gold --ld-option=-fuse-ld=gold --with-ld=ld.gold";
|
|
|
|
|
2017-03-07 17:13:59 +00:00
|
|
|
# link executables statically against haskell libs to reduce closure size
|
|
|
|
justStaticExecutables = drv: overrideCabal drv (drv: {
|
|
|
|
enableSharedExecutables = false;
|
|
|
|
isLibrary = false;
|
|
|
|
doHaddock = false;
|
|
|
|
postFixup = "rm -rf $out/lib $out/nix-support $out/share/doc";
|
2017-08-01 17:44:08 +01:00
|
|
|
} // lib.optionalAttrs (pkgs.hostPlatform.isDarwin) {
|
2017-06-14 15:41:00 +01:00
|
|
|
configureFlags = (drv.configureFlags or []) ++ ["--ghc-option=-optl=-dead_strip"];
|
2017-08-01 17:44:08 +01:00
|
|
|
});
|
2017-03-07 17:13:59 +00:00
|
|
|
|
2017-08-01 17:44:08 +01:00
|
|
|
buildFromSdist = pkg: lib.overrideDerivation pkg (drv: {
|
2015-06-02 12:58:57 +01:00
|
|
|
unpackPhase = let src = sdistTarball pkg; tarname = "${pkg.pname}-${pkg.version}"; in ''
|
|
|
|
echo "Source tarball is at ${src}/${tarname}.tar.gz"
|
|
|
|
tar xf ${src}/${tarname}.tar.gz
|
2015-08-30 14:18:15 +01:00
|
|
|
cd ${pkg.pname}-*
|
2015-06-02 12:58:57 +01:00
|
|
|
'';
|
|
|
|
});
|
|
|
|
|
|
|
|
buildStrictly = pkg: buildFromSdist (appendConfigureFlag pkg "--ghc-option=-Wall --ghc-option=-Werror");
|
|
|
|
|
2017-08-30 13:40:54 +01:00
|
|
|
checkUnusedPackages =
|
|
|
|
{ ignoreEmptyImports ? false
|
|
|
|
, ignoreMainModule ? false
|
|
|
|
, ignorePackages ? []
|
|
|
|
} : drv :
|
|
|
|
overrideCabal (appendConfigureFlag drv "--ghc-option=-ddump-minimal-imports") (_drv: {
|
|
|
|
postBuild = with lib;
|
|
|
|
let args = concatStringsSep " " (
|
|
|
|
optional ignoreEmptyImports "--ignore-empty-imports" ++
|
|
|
|
optional ignoreMainModule "--ignore-main-module" ++
|
|
|
|
map (pkg: "--ignore-package ${pkg}") ignorePackages
|
|
|
|
);
|
|
|
|
in "${pkgs.haskellPackages.packunused}/bin/packunused" +
|
|
|
|
optionalString (args != "") " ${args}";
|
|
|
|
});
|
|
|
|
|
2016-03-06 09:35:25 +00:00
|
|
|
buildStackProject = pkgs.callPackage ./generic-stack-builder.nix { };
|
2016-03-04 20:24:42 +00:00
|
|
|
|
2015-06-06 23:05:17 +01:00
|
|
|
triggerRebuild = drv: i: overrideCabal drv (drv: { postUnpack = ": trigger rebuild ${toString i}"; });
|
|
|
|
|
2017-04-08 21:21:57 +01:00
|
|
|
overrideSrc = drv: { src, version ? drv.version }:
|
|
|
|
overrideCabal drv (_: { inherit src version; editedCabalFile = null; });
|
|
|
|
|
2015-01-07 19:31:32 +00:00
|
|
|
}
|