2021-01-23 17:15:07 +00:00
|
|
|
{ lib, stdenv, buildPackages, buildHaskellPackages, ghc
|
2024-04-12 14:50:59 +00:00
|
|
|
, jailbreak-cabal, hscolour, cpphs
|
shellFor: Refactor for consistency and cross
This makes it work like work-on-multi from Reflex Platform. In
particular, rather than making `.env` from `shellFor`, we make `.env`
the primitive, and `shellFor` works by combining together the arguments
of all the packages to `generic-builder` and taking the `.env` of the
resulting mashup-package.
There are 2 benefits of this:
1. The dependency logic is deduplicated. generic builder just concatted
lists, whereas all the envs until now would sieve apart haskell and
system build inputs. Now, they both decide haskell vs system the same
way: according to the argument list and without reflection.
Consistency is good, especially because it mean that if the build
works, the shell is more likely to work.
2. Cross is handled better. For native builds, because the
`ghcWithPackages` calls would shadow, we through both the regular
component (lib, exe, test, bench) haskell deps and Setup.hs haskell
deps in the same `ghcWithPackages` call. But for cross builds we use
`buildPackages.ghcWithPackages` to get the setup deps. This ensures
everything works correctly.
2019-12-23 20:33:18 +00:00
|
|
|
, ghcWithHoogle, ghcWithPackages
|
2024-04-12 14:50:59 +00:00
|
|
|
, nodejs
|
2017-08-06 19:46:49 +00:00
|
|
|
}:
|
2017-09-10 19:36:48 +00:00
|
|
|
|
|
|
|
let
|
2018-08-20 18:43:41 +00:00
|
|
|
isCross = stdenv.buildPlatform != stdenv.hostPlatform;
|
2024-04-12 14:50:59 +00:00
|
|
|
|
2024-06-14 19:13:43 +00:00
|
|
|
# Note that ghc.isGhcjs != stdenv.hostPlatform.isGhcjs.
|
|
|
|
# ghc.isGhcjs implies that we are using ghcjs, a project separate from GHC.
|
|
|
|
# (mere) stdenv.hostPlatform.isGhcjs means that we are using GHC's JavaScript
|
|
|
|
# backend. The latter is a normal cross compilation backend and needs little
|
|
|
|
# special accommodation.
|
|
|
|
outputsJS = ghc.isGhcjs or false || stdenv.hostPlatform.isGhcjs;
|
|
|
|
|
2024-04-12 14:50:59 +00:00
|
|
|
# Pass the "wrong" C compiler rather than none at all so packages that just
|
|
|
|
# use the C preproccessor still work, see
|
|
|
|
# https://github.com/haskell/cabal/issues/6466 for details.
|
|
|
|
cc =
|
|
|
|
if stdenv.hasCC then "$CC"
|
|
|
|
else if stdenv.hostPlatform.isGhcjs then "${emscripten}/bin/emcc"
|
|
|
|
else "$CC_FOR_BUILD";
|
|
|
|
|
2017-09-10 19:36:48 +00:00
|
|
|
inherit (buildPackages)
|
|
|
|
fetchurl removeReferencesTo
|
2024-04-12 14:50:59 +00:00
|
|
|
pkg-config coreutils gnugrep glibcLocales
|
|
|
|
emscripten;
|
2024-06-14 19:13:43 +00:00
|
|
|
|
2017-09-10 19:36:48 +00:00
|
|
|
in
|
2015-01-07 19:31:32 +00:00
|
|
|
|
2015-01-10 08:12:37 +00:00
|
|
|
{ pname
|
2024-06-14 19:13:43 +00:00
|
|
|
, dontStrip ? outputsJS
|
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 21:27:57 +00: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 ? []
|
2019-02-20 14:58:28 +00:00
|
|
|
, haddockFlags ? []
|
2020-07-30 16:43:59 +00:00
|
|
|
, description ? null
|
2024-01-28 09:58:14 +00:00
|
|
|
, doCheck ? !isCross
|
2017-09-19 13:36:29 +00:00
|
|
|
, doBenchmark ? false
|
2015-01-09 18:35:17 +00:00
|
|
|
, doHoogle ? true
|
2024-01-28 09:58:14 +00:00
|
|
|
, doHaddockQuickjump ? doHoogle
|
2023-01-31 17:34:01 +00:00
|
|
|
, doInstallIntermediates ? false
|
2015-01-10 08:12:37 +00:00
|
|
|
, editedCabalFile ? null
|
2024-06-14 19:13:43 +00:00
|
|
|
, enableLibraryProfiling ? !outputsJS
|
2015-08-06 14:13:10 +00:00
|
|
|
, enableExecutableProfiling ? false
|
2018-08-27 13:50:37 +00: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
|
2021-01-05 03:39:32 +00:00
|
|
|
, enableSharedLibraries ? !stdenv.hostPlatform.isStatic && (ghc.enableShared or false)
|
2018-03-16 20:55:56 +00:00
|
|
|
, enableDeadCodeElimination ? (!stdenv.isDarwin) # TODO: use -dead_strip for darwin
|
2024-04-12 14:50:59 +00:00
|
|
|
# Disabling this for ghcjs prevents this crash: https://gitlab.haskell.org/ghc/ghc/-/issues/23235
|
|
|
|
, enableStaticLibraries ? !(stdenv.hostPlatform.isWindows || stdenv.hostPlatform.isWasm || stdenv.hostPlatform.isGhcjs)
|
2024-01-28 09:58:14 +00:00
|
|
|
, enableHsc2hsViaAsm ? stdenv.hostPlatform.isWindows
|
2015-06-17 14:40:21 +00:00
|
|
|
, extraLibraries ? [], librarySystemDepends ? [], executableSystemDepends ? []
|
2017-06-23 01:43:03 +00: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 19:48:16 +00:00
|
|
|
, homepage ? "https://hackage.haskell.org/package/${pname}"
|
2021-01-23 17:15:07 +00:00
|
|
|
, platforms ? with lib.platforms; all # GHC can cross-compile
|
2021-06-26 23:13:30 +00:00
|
|
|
, badPlatforms ? lib.platforms.none
|
2018-03-20 15:51:37 +00:00
|
|
|
, hydraPlatforms ? null
|
2015-01-10 08:12:37 +00:00
|
|
|
, hyperlinkSource ? true
|
|
|
|
, isExecutable ? false, isLibrary ? !isExecutable
|
|
|
|
, jailbreak ? false
|
|
|
|
, license
|
2020-07-21 15:39:12 +00:00
|
|
|
, enableParallelBuilding ? true
|
2020-07-30 16:43:59 +00:00
|
|
|
, maintainers ? null
|
2021-04-09 15:09:12 +00:00
|
|
|
, changelog ? null
|
2021-07-03 08:30:58 +00:00
|
|
|
, mainProgram ? null
|
2017-02-14 15:17:40 +00:00
|
|
|
, doCoverage ? false
|
2022-03-01 22:42:45 +00:00
|
|
|
, doHaddock ? !(ghc.isHaLVM or false) && (ghc.hasHaddock or true)
|
2020-06-23 13:18:56 +00:00
|
|
|
, doHaddockInterfaces ? doHaddock && lib.versionAtLeast ghc.version "9.0.1"
|
2015-01-07 19:31:32 +00:00
|
|
|
, passthru ? {}
|
2021-01-19 06:50:56 +00:00
|
|
|
, pkg-configDepends ? [], libraryPkgconfigDepends ? [], executablePkgconfigDepends ? [], testPkgconfigDepends ? [], benchmarkPkgconfigDepends ? []
|
2017-06-23 01:43:03 +00:00
|
|
|
, testDepends ? [], testHaskellDepends ? [], testSystemDepends ? [], testFrameworkDepends ? []
|
|
|
|
, benchmarkDepends ? [], benchmarkHaskellDepends ? [], benchmarkSystemDepends ? [], benchmarkFrameworkDepends ? []
|
2021-06-09 13:09:00 +00:00
|
|
|
, testTarget ? "", testFlags ? []
|
2015-01-10 08:12:37 +00:00
|
|
|
, broken ? false
|
2020-07-30 16:43:59 +00:00
|
|
|
, preCompileBuildDriver ? null, postCompileBuildDriver ? null
|
|
|
|
, preUnpack ? null, postUnpack ? null
|
|
|
|
, patches ? null, patchPhase ? null, prePatch ? "", postPatch ? ""
|
|
|
|
, preConfigure ? null, postConfigure ? null
|
|
|
|
, preBuild ? null, postBuild ? null
|
2020-10-21 14:53:44 +00:00
|
|
|
, preHaddock ? null, postHaddock ? null
|
2020-07-30 16:43:59 +00:00
|
|
|
, installPhase ? null, preInstall ? null, postInstall ? null
|
|
|
|
, checkPhase ? null, preCheck ? null, postCheck ? null
|
|
|
|
, preFixup ? null, postFixup ? null
|
2015-09-09 17:58:28 +00: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
|
2021-03-25 13:44:10 +00:00
|
|
|
, hardeningDisable ? null
|
2019-03-29 08:10:42 +00:00
|
|
|
, enableSeparateBinOutput ? false
|
2017-07-25 01:22:19 +00:00
|
|
|
, enableSeparateDataOutput ? false
|
|
|
|
, enableSeparateDocOutput ? doHaddock
|
2023-01-31 17:34:01 +00:00
|
|
|
, enableSeparateIntermediatesOutput ? false
|
2018-12-15 18:31:08 +00:00
|
|
|
, # Don't fail at configure time if there are multiple versions of the
|
|
|
|
# same package in the (recursive) dependencies of the package being
|
|
|
|
# built. Will delay failures, if any, to compile time.
|
|
|
|
allowInconsistentDependencies ? false
|
2020-05-07 10:48:51 +00:00
|
|
|
, maxBuildCores ? 16 # more cores usually don't improve performance: https://ghc.haskell.org/trac/ghc/ticket/9221
|
2019-04-11 03:43:16 +00:00
|
|
|
, # If set to true, this builds a pre-linked .o file for this Haskell library.
|
|
|
|
# This can make it slightly faster to load this library into GHCi, but takes
|
|
|
|
# extra disk space and compile time.
|
|
|
|
enableLibraryForGhci ? false
|
2023-01-31 17:34:01 +00:00
|
|
|
# Set this to a previous build of this same package to reuse the intermediate
|
|
|
|
# build products from that prior build as a starting point for accelerating
|
|
|
|
# this build
|
|
|
|
, previousIntermediates ? null
|
2024-04-15 19:45:45 +00:00
|
|
|
# References to these store paths are forbidden in the produced output.
|
|
|
|
, disallowedRequisites ? []
|
|
|
|
# Whether to allow the produced output to refer to `ghc`.
|
|
|
|
#
|
|
|
|
# This is used by `haskell.lib.justStaticExecutables` to help prevent static
|
|
|
|
# Haskell binaries from having erroneous dependencies on GHC.
|
|
|
|
#
|
2024-06-12 10:44:07 +00:00
|
|
|
# See https://nixos.org/manual/nixpkgs/unstable/#haskell-packaging-helpers
|
|
|
|
# or its source doc/languages-frameworks/haskell.section.md
|
2024-04-15 19:45:45 +00:00
|
|
|
, disallowGhcReference ? false
|
2023-08-07 15:29:30 +00:00
|
|
|
, # Cabal 3.8 which is shipped by default for GHC >= 9.3 always calls
|
|
|
|
# `pkg-config --libs --static` as part of the configure step. This requires
|
|
|
|
# Requires.private dependencies of pkg-config dependencies to be present in
|
|
|
|
# PKG_CONFIG_PATH which is normally not the case in nixpkgs (except in pkgsStatic).
|
|
|
|
# Since there is no patch or upstream patch yet, we replicate the automatic
|
|
|
|
# propagation of dependencies in pkgsStatic for allPkgConfigDepends for
|
|
|
|
# GHC >= 9.3 by default. This option allows overriding this behavior manually
|
|
|
|
# if mismatching Cabal and GHC versions are used.
|
|
|
|
# See also <https://github.com/haskell/cabal/issues/8455>.
|
|
|
|
__propagatePkgConfigDepends ? lib.versionAtLeast ghc.version "9.3"
|
|
|
|
, # Propagation can easily lead to the argv limit being exceeded in linker or C
|
|
|
|
# compiler invocations. To work around this we can only propagate derivations
|
|
|
|
# that are known to provide pkg-config modules, as indicated by the presence
|
|
|
|
# of `meta.pkgConfigModules`. This option defaults to false for now, since
|
|
|
|
# this metadata is far from complete in nixpkgs.
|
2023-08-07 15:19:25 +00:00
|
|
|
__onlyPropagateKnownPkgConfigModules ? false
|
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 18:43:41 +00:00
|
|
|
assert stdenv.hostPlatform.isWindows -> enableStaticLibraries == false;
|
2020-07-05 12:27:40 +00:00
|
|
|
assert stdenv.hostPlatform.isWasm -> enableStaticLibraries == false;
|
2018-03-11 09:13:25 +00:00
|
|
|
|
2015-01-07 19:31:32 +00:00
|
|
|
let
|
|
|
|
|
2024-01-28 09:58:14 +00:00
|
|
|
inherit (lib) optional optionals optionalString versionAtLeast
|
2019-06-16 19:59:06 +00:00
|
|
|
concatStringsSep enableFeature optionalAttrs;
|
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;
|
2016-02-19 16:45:45 +00:00
|
|
|
|
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;
|
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 10:50:54 +00:00
|
|
|
docdir = docoutput: docoutput + "/share/doc/" + pname + "-" + version;
|
2017-12-05 08:36:08 +00:00
|
|
|
|
2019-03-29 08:10:42 +00:00
|
|
|
binDir = if enableSeparateBinOutput then "$bin/bin" else "$out/bin";
|
|
|
|
|
2019-04-05 17:49:48 +00:00
|
|
|
newCabalFileUrl = "mirror://hackage/${pname}-${version}/revision/${revision}.cabal";
|
2015-01-16 19:54:35 +00:00
|
|
|
newCabalFile = fetchurl {
|
2015-04-01 11:52:21 +00: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
|
|
|
|
'';
|
|
|
|
|
2020-01-28 23:44:11 +00:00
|
|
|
# This awk expression transforms a package conf file like
|
|
|
|
#
|
|
|
|
# author: John Doe <john-doe@example.com>
|
|
|
|
# description:
|
|
|
|
# The purpose of this library is to do
|
|
|
|
# foo and bar among other things
|
|
|
|
#
|
|
|
|
# into a more easily processeable form:
|
|
|
|
#
|
|
|
|
# author: John Doe <john-doe@example.com>
|
|
|
|
# description: The purpose of this library is to do foo and bar among other things
|
|
|
|
unprettyConf = builtins.toFile "unpretty-cabal-conf.awk" ''
|
|
|
|
/^[^ ]+:/ {
|
|
|
|
# When the line starts with a new field, terminate the previous one with a newline
|
|
|
|
if (started == 1) print ""
|
|
|
|
# to strip leading spaces
|
|
|
|
$1=$1
|
|
|
|
printf "%s", $0
|
|
|
|
started=1
|
|
|
|
}
|
|
|
|
|
|
|
|
/^ +/ {
|
|
|
|
# to strip leading spaces
|
|
|
|
$1=$1
|
|
|
|
printf " %s", $0
|
|
|
|
}
|
|
|
|
|
|
|
|
# Terminate the final field with a newline
|
|
|
|
END { print "" }
|
|
|
|
'';
|
|
|
|
|
2016-11-18 15:44:53 +00:00
|
|
|
crossCabalFlags = [
|
2019-12-25 18:14:48 +00:00
|
|
|
"--with-ghc=${ghcCommand}"
|
2017-09-10 19:36:48 +00:00
|
|
|
"--with-ghc-pkg=${ghc.targetPrefix}ghc-pkg"
|
2024-04-12 14:50:59 +00:00
|
|
|
"--with-gcc=${cc}"
|
2019-11-24 23:07:20 +00:00
|
|
|
] ++ optionals stdenv.hasCC [
|
2017-09-22 23:09:39 +00:00
|
|
|
"--with-ld=${stdenv.cc.bintools.targetPrefix}ld"
|
2018-09-18 22:49:58 +00: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-22 23:09:39 +00: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")
|
2022-04-01 07:14:19 +00:00
|
|
|
] ++ optional (allPkgconfigDepends != [])
|
|
|
|
"--with-pkg-config=${pkg-config.targetPrefix}pkg-config";
|
2016-11-18 15:44:53 +00:00
|
|
|
|
2024-06-04 15:53:33 +00:00
|
|
|
makeGhcOptions = opts: lib.concatStringsSep " " (map (opt: "--ghc-option=${opt}") opts);
|
2020-05-07 10:48:51 +00:00
|
|
|
|
2018-03-17 08:55:39 +00:00
|
|
|
buildFlagsString = optionalString (buildFlags != []) (" " + concatStringsSep " " buildFlags);
|
|
|
|
|
2015-01-07 19:31:32 +00:00
|
|
|
defaultConfigureFlags = [
|
2019-03-29 08:10:42 +00:00
|
|
|
"--verbose"
|
|
|
|
"--prefix=$out"
|
2023-01-22 01:12:17 +00:00
|
|
|
# Note: This must be kept in sync manually with mkGhcLibdir
|
2023-01-22 01:17:29 +00:00
|
|
|
("--libdir=\\$prefix/lib/\\$compiler" + lib.optionalString (ghc ? hadrian) "/lib")
|
2019-03-29 08:10:42 +00:00
|
|
|
"--libsubdir=\\$abi/\\$libname"
|
2022-03-31 10:47:54 +00:00
|
|
|
(optionalString enableSeparateDataOutput "--datadir=$data/share/${ghcNameWithPrefix}")
|
2017-12-05 08:36:08 +00:00
|
|
|
(optionalString enableSeparateDocOutput "--docdir=${docdir "$doc"}")
|
2019-11-24 23:07:20 +00:00
|
|
|
] ++ optionals stdenv.hasCC [
|
2017-02-04 17:19:14 +00:00
|
|
|
"--with-gcc=$CC" # Clang won't work without that extra information.
|
2019-11-24 23:07:20 +00:00
|
|
|
] ++ [
|
2015-01-16 19:54:35 +00:00
|
|
|
"--package-db=$packageConfDir"
|
2023-01-22 01:12:17 +00:00
|
|
|
(optionalString (enableSharedExecutables && stdenv.isLinux) "--ghc-option=-optl=-Wl,-rpath=$out/${ghcLibdir}/${pname}-${version}")
|
2015-01-16 19:54:35 +00:00
|
|
|
(optionalString (enableSharedExecutables && stdenv.isDarwin) "--ghc-option=-optl=-Wl,-headerpad_max_install_names")
|
2024-06-04 15:53:33 +00:00
|
|
|
(optionalString enableParallelBuilding (makeGhcOptions [ "-j$NIX_BUILD_CORES" "+RTS" "-A64M" "-RTS" ]))
|
|
|
|
(optionalString useCpphs ("--with-cpphs=${cpphs}/bin/cpphs " + (makeGhcOptions [ "-cpp" "-pgmP${cpphs}/bin/cpphs" "-optP--cpp" ])))
|
2015-01-07 19:31:32 +00:00
|
|
|
(enableFeature enableLibraryProfiling "library-profiling")
|
2024-01-28 09:58:14 +00:00
|
|
|
(optionalString (enableExecutableProfiling || enableLibraryProfiling) "--profiling-detail=${profilingDetail}")
|
|
|
|
(enableFeature enableExecutableProfiling "profiling")
|
2015-01-07 19:31:32 +00:00
|
|
|
(enableFeature enableSharedLibraries "shared")
|
2024-01-28 09:58:14 +00:00
|
|
|
(enableFeature doCoverage "coverage")
|
|
|
|
(enableFeature enableStaticLibraries "static")
|
|
|
|
(enableFeature enableSharedExecutables "executable-dynamic")
|
|
|
|
(enableFeature doCheck "tests")
|
2018-09-11 15:24:26 +00:00
|
|
|
(enableFeature doBenchmark "benchmarks")
|
2018-03-16 20:38:55 +00:00
|
|
|
"--enable-library-vanilla" # TODO: Should this be configurable?
|
2019-04-02 05:36:23 +00:00
|
|
|
(enableFeature enableLibraryForGhci "library-for-ghci")
|
2024-02-04 13:26:20 +00:00
|
|
|
(enableFeature enableDeadCodeElimination "split-sections")
|
2024-02-07 08:11:40 +00:00
|
|
|
(enableFeature (!dontStrip) "library-stripping")
|
|
|
|
(enableFeature (!dontStrip) "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 18:43:41 +00:00
|
|
|
"--configure-option=--host=${stdenv.hostPlatform.config}"
|
2019-03-29 08:10:42 +00:00
|
|
|
] ++ crossCabalFlags
|
2020-06-23 13:18:56 +00:00
|
|
|
) ++ optionals enableSeparateBinOutput [
|
|
|
|
"--bindir=${binDir}"
|
|
|
|
] ++ optionals (doHaddockInterfaces && isLibrary) [
|
2024-06-04 15:53:33 +00:00
|
|
|
"--ghc-option=-haddock"
|
2020-06-23 13:18:56 +00:00
|
|
|
];
|
2015-01-07 19:31:32 +00:00
|
|
|
|
2023-05-31 20:19:37 +00:00
|
|
|
postPhases = optional doInstallIntermediates "installIntermediatesPhase";
|
2023-01-31 17:34:01 +00:00
|
|
|
|
2015-01-16 19:54:35 +00:00
|
|
|
setupCompileFlags = [
|
2024-01-28 09:58:14 +00:00
|
|
|
(optionalString (!coreSetup) "-package-db=$setupPackageConfDir")
|
2020-05-07 10:48:51 +00:00
|
|
|
"-threaded" # https://github.com/haskell/cabal/issues/2398
|
2015-01-16 19:54:35 +00:00
|
|
|
];
|
2015-01-07 19:31:32 +00:00
|
|
|
|
2018-09-17 21:11:59 +00:00
|
|
|
isHaskellPkg = x: x ? isHaskellLibrary;
|
2015-01-10 12:23:04 +00:00
|
|
|
|
2023-07-26 20:11:12 +00:00
|
|
|
# Work around a Cabal bug requiring pkg-config --static --libs to work even
|
|
|
|
# when linking dynamically, affecting Cabal 3.8 and 3.9.
|
|
|
|
# https://github.com/haskell/cabal/issues/8455
|
|
|
|
#
|
|
|
|
# For this, we treat the runtime system/pkg-config dependencies of a Haskell
|
|
|
|
# derivation as if they were propagated from their dependencies which allows
|
|
|
|
# pkg-config --static to work in most cases.
|
|
|
|
allPkgconfigDepends =
|
|
|
|
let
|
2023-08-07 15:19:25 +00:00
|
|
|
# If __onlyPropagateKnownPkgConfigModules is set, packages without
|
|
|
|
# meta.pkgConfigModules will be filtered out, otherwise all packages in
|
|
|
|
# buildInputs and propagatePlainBuildInputs are propagated.
|
|
|
|
propagateValue = drv:
|
|
|
|
lib.isDerivation drv
|
|
|
|
&& (__onlyPropagateKnownPkgConfigModules -> drv ? meta.pkgConfigModules);
|
|
|
|
|
2023-07-26 20:11:12 +00:00
|
|
|
# Take list of derivations and return list of the transitive dependency
|
|
|
|
# closure, only taking into account buildInputs. Loosely based on
|
|
|
|
# closePropagationFast.
|
|
|
|
propagatePlainBuildInputs = drvs:
|
|
|
|
builtins.map (i: i.val) (
|
|
|
|
builtins.genericClosure {
|
|
|
|
startSet = builtins.map (drv:
|
|
|
|
{ key = drv.outPath; val = drv; }
|
2023-08-07 15:19:25 +00:00
|
|
|
) (builtins.filter propagateValue drvs);
|
2023-07-26 20:11:12 +00:00
|
|
|
operator = { val, ... }:
|
|
|
|
builtins.concatMap (drv:
|
2023-08-07 15:19:25 +00:00
|
|
|
if propagateValue drv
|
|
|
|
then [ { key = drv.outPath; val = drv; } ]
|
|
|
|
else [ ]
|
2023-07-26 20:11:12 +00:00
|
|
|
) (val.buildInputs or [ ] ++ val.propagatedBuildInputs or [ ]);
|
|
|
|
}
|
|
|
|
);
|
|
|
|
in
|
|
|
|
|
2023-08-07 15:29:30 +00:00
|
|
|
if __propagatePkgConfigDepends
|
2023-07-26 20:11:12 +00:00
|
|
|
then propagatePlainBuildInputs allPkgconfigDepends'
|
|
|
|
else allPkgconfigDepends';
|
|
|
|
allPkgconfigDepends' =
|
|
|
|
pkg-configDepends ++ libraryPkgconfigDepends ++ executablePkgconfigDepends ++
|
|
|
|
optionals doCheck testPkgconfigDepends ++ optionals doBenchmark benchmarkPkgconfigDepends;
|
2015-07-23 20:16:16 +00:00
|
|
|
|
2023-01-04 14:19:46 +00:00
|
|
|
depsBuildBuild = [ nativeGhc ]
|
|
|
|
# CC_FOR_BUILD may be necessary if we have no C preprocessor for the host
|
|
|
|
# platform. See crossCabalFlags above for more details.
|
|
|
|
++ lib.optionals (!stdenv.hasCC) [ buildPackages.stdenv.cc ];
|
shellFor: Refactor for consistency and cross
This makes it work like work-on-multi from Reflex Platform. In
particular, rather than making `.env` from `shellFor`, we make `.env`
the primitive, and `shellFor` works by combining together the arguments
of all the packages to `generic-builder` and taking the `.env` of the
resulting mashup-package.
There are 2 benefits of this:
1. The dependency logic is deduplicated. generic builder just concatted
lists, whereas all the envs until now would sieve apart haskell and
system build inputs. Now, they both decide haskell vs system the same
way: according to the argument list and without reflection.
Consistency is good, especially because it mean that if the build
works, the shell is more likely to work.
2. Cross is handled better. For native builds, because the
`ghcWithPackages` calls would shadow, we through both the regular
component (lib, exe, test, bench) haskell deps and Setup.hs haskell
deps in the same `ghcWithPackages` call. But for cross builds we use
`buildPackages.ghcWithPackages` to get the setup deps. This ensures
everything works correctly.
2019-12-23 20:33:18 +00:00
|
|
|
collectedToolDepends =
|
|
|
|
buildTools ++ libraryToolDepends ++ executableToolDepends ++
|
|
|
|
optionals doCheck testToolDepends ++
|
|
|
|
optionals doBenchmark benchmarkToolDepends;
|
|
|
|
nativeBuildInputs =
|
2023-07-29 20:13:40 +00:00
|
|
|
[ ghc removeReferencesTo ] ++ optional (allPkgconfigDepends != []) (assert pkg-config != null; pkg-config) ++
|
2024-04-12 14:50:59 +00:00
|
|
|
setupHaskellDepends ++ collectedToolDepends ++ optional stdenv.hostPlatform.isGhcjs nodejs;
|
2017-06-23 01:43:03 +00:00
|
|
|
propagatedBuildInputs = buildDepends ++ libraryHaskellDepends ++ executableHaskellDepends ++ libraryFrameworkDepends;
|
shellFor: Refactor for consistency and cross
This makes it work like work-on-multi from Reflex Platform. In
particular, rather than making `.env` from `shellFor`, we make `.env`
the primitive, and `shellFor` works by combining together the arguments
of all the packages to `generic-builder` and taking the `.env` of the
resulting mashup-package.
There are 2 benefits of this:
1. The dependency logic is deduplicated. generic builder just concatted
lists, whereas all the envs until now would sieve apart haskell and
system build inputs. Now, they both decide haskell vs system the same
way: according to the argument list and without reflection.
Consistency is good, especially because it mean that if the build
works, the shell is more likely to work.
2. Cross is handled better. For native builds, because the
`ghcWithPackages` calls would shadow, we through both the regular
component (lib, exe, test, bench) haskell deps and Setup.hs haskell
deps in the same `ghcWithPackages` call. But for cross builds we use
`buildPackages.ghcWithPackages` to get the setup deps. This ensures
everything works correctly.
2019-12-23 20:33:18 +00:00
|
|
|
otherBuildInputsHaskell =
|
|
|
|
optionals doCheck (testDepends ++ testHaskellDepends) ++
|
|
|
|
optionals doBenchmark (benchmarkDepends ++ benchmarkHaskellDepends);
|
|
|
|
otherBuildInputsSystem =
|
|
|
|
extraLibraries ++ librarySystemDepends ++ executableSystemDepends ++ executableFrameworkDepends ++
|
|
|
|
allPkgconfigDepends ++
|
|
|
|
optionals doCheck (testSystemDepends ++ testFrameworkDepends) ++
|
|
|
|
optionals doBenchmark (benchmarkSystemDepends ++ benchmarkFrameworkDepends);
|
|
|
|
# TODO next rebuild just define as `otherBuildInputsHaskell ++ otherBuildInputsSystem`
|
|
|
|
otherBuildInputs =
|
|
|
|
extraLibraries ++ librarySystemDepends ++ executableSystemDepends ++ executableFrameworkDepends ++
|
|
|
|
allPkgconfigDepends ++
|
|
|
|
optionals doCheck (testDepends ++ testHaskellDepends ++ testSystemDepends ++ testFrameworkDepends) ++
|
|
|
|
optionals doBenchmark (benchmarkDepends ++ benchmarkHaskellDepends ++ benchmarkSystemDepends ++ benchmarkFrameworkDepends);
|
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 19:36:48 +00:00
|
|
|
ghcCommand = "${ghc.targetPrefix}${ghcCommand'}";
|
2015-03-13 03:20:56 +00:00
|
|
|
|
2022-03-31 10:47:54 +00:00
|
|
|
ghcNameWithPrefix = "${ghc.targetPrefix}${ghc.haskellCompilerName}";
|
2023-01-22 01:17:29 +00:00
|
|
|
mkGhcLibdir = ghc: "lib/${ghc.targetPrefix}${ghc.haskellCompilerName}"
|
|
|
|
+ lib.optionalString (ghc ? hadrian) "/lib";
|
2023-01-22 01:12:17 +00:00
|
|
|
ghcLibdir = mkGhcLibdir ghc;
|
2022-03-31 10:47:54 +00:00
|
|
|
|
2018-01-04 21:18:02 +00:00
|
|
|
nativeGhcCommand = "${nativeGhc.targetPrefix}ghc";
|
|
|
|
|
2023-01-20 18:10:46 +00:00
|
|
|
buildPkgDb = thisGhc: packageConfDir: ''
|
generic Haskell builder: don't copy packages from GHC
In order to build the package databases that we will use when compiling
a Haskell package, we iterate over the relevant dependencies, and if
they contain a package db, we copy its contents over.
So far so good, except when one of those dependencies is GHC. This
doesn't happen ordinarily, but it will happen when we construct the
package database for compiling `Setup.hs`. This is compiled for the
build architecture, so we get the build deps, including both the native
and the cross GHC (if there is one).
In this case, we end up copying the packages from the GHC's package
database. This is at best unnecessary, since we will get those packages
from the GHC when we compile with it.
At worst, however, this is semantically questionable. We can end up
having multiple copies of e.g. Cabal with the same version, but
(potentially) different contents. At the moment, GHC will expose one of
these at semi-random depending on which one it looks at "first".
However, there is a MR open [in
GHC](https://gitlab.haskell.org/ghc/ghc/merge_requests/545) which as a
side effect will instead expose both, leading to ambiguous module
warnings (which is not unreasonable, since it *is* ambiguous).
So what can we do about it? The simplest solution is just to not copy
the package databases from GHC. GHC is special in this regard, so I
think it's okay to treat it specially.
This PR should have no effect on anything now, but will prevent any
breakage when/if the GHC patch lands.
Closes https://github.com/NixOS/nixpkgs/pull/57706.
2019-03-15 17:15:20 +00:00
|
|
|
# If this dependency has a package database, then copy the contents of it,
|
|
|
|
# unless it is one of our GHCs. These can appear in our dependencies when
|
|
|
|
# we are doing native builds, and they have package databases in them, but
|
|
|
|
# we do not want to copy them over.
|
|
|
|
#
|
|
|
|
# We don't need to, since those packages will be provided by the GHC when
|
|
|
|
# we compile with it, and doing so can result in having multiple copies of
|
|
|
|
# e.g. Cabal in the database with the same name and version, which is
|
|
|
|
# ambiguous.
|
2023-01-22 01:12:17 +00:00
|
|
|
if [ -d "$p/${mkGhcLibdir thisGhc}/package.conf.d" ] && [ "$p" != "${ghc}" ] && [ "$p" != "${nativeGhc}" ]; then
|
|
|
|
cp -f "$p/${mkGhcLibdir thisGhc}/package.conf.d/"*.conf ${packageConfDir}/
|
2018-03-01 05:35:48 +00:00
|
|
|
continue
|
|
|
|
fi
|
|
|
|
'';
|
2023-04-28 16:38:32 +00:00
|
|
|
|
|
|
|
intermediatesDir = "share/haskell/${ghc.version}/${pname}-${version}/dist";
|
2024-05-26 09:50:07 +00:00
|
|
|
|
|
|
|
# This is a script suitable for --test-wrapper of Setup.hs' test command
|
|
|
|
# (https://cabal.readthedocs.io/en/3.12/setup-commands.html#cmdoption-runhaskell-Setup.hs-test-test-wrapper).
|
|
|
|
# We use it to set some environment variables that the test suite may need,
|
|
|
|
# e.g. GHC_PACKAGE_PATH to invoke GHC(i) at runtime with build dependencies
|
|
|
|
# available. See the comment accompanying checkPhase below on how to customize
|
|
|
|
# this behavior. We need to use a wrapper script since Cabal forbids setting
|
|
|
|
# certain environment variables since they can alter GHC's behavior (e.g.
|
|
|
|
# GHC_PACKAGE_PATH) and cause failures. While building, Cabal will set
|
|
|
|
# GHC_ENVIRONMENT to make the packages picked at configure time available to
|
|
|
|
# GHC, but unfortunately not at test time. The test wrapper script will be
|
|
|
|
# executed after such environment checks, so we can take some liberties which
|
|
|
|
# is unproblematic since we know our synthetic package db matches what Cabal
|
|
|
|
# will see at configure time exactly. See also
|
|
|
|
# <https://github.com/haskell/cabal/issues/7792>.
|
|
|
|
testWrapperScript = buildPackages.writeShellScript
|
|
|
|
"haskell-generic-builder-test-wrapper.sh"
|
|
|
|
''
|
|
|
|
set -eu
|
|
|
|
|
|
|
|
# We expect this to be either empty or set by checkPhase
|
|
|
|
if [[ -n "''${NIX_GHC_PACKAGE_PATH_FOR_TEST}" ]]; then
|
|
|
|
export GHC_PACKAGE_PATH="''${NIX_GHC_PACKAGE_PATH_FOR_TEST}"
|
|
|
|
fi
|
|
|
|
|
|
|
|
exec "$@"
|
|
|
|
'';
|
|
|
|
|
2021-01-23 17:15:07 +00:00
|
|
|
in lib.fix (drv:
|
2015-07-23 20:16:16 +00:00
|
|
|
|
2015-01-10 08:12:37 +00:00
|
|
|
stdenv.mkDerivation ({
|
2021-06-21 12:05:57 +00:00
|
|
|
inherit pname version;
|
2015-01-07 19:31:32 +00:00
|
|
|
|
2019-03-29 08:10:42 +00:00
|
|
|
outputs = [ "out" ]
|
|
|
|
++ (optional enableSeparateDataOutput "data")
|
|
|
|
++ (optional enableSeparateDocOutput "doc")
|
2023-01-31 17:34:01 +00:00
|
|
|
++ (optional enableSeparateBinOutput "bin")
|
|
|
|
++ (optional enableSeparateIntermediatesOutput "intermediates");
|
|
|
|
|
2017-07-25 01:22:19 +00: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 13:40:37 +00:00
|
|
|
inherit depsBuildBuild nativeBuildInputs;
|
2023-01-04 14:25:44 +00:00
|
|
|
buildInputs = otherBuildInputs ++ optionals (!isLibrary) propagatedBuildInputs
|
|
|
|
# For patchShebangsAuto in fixupPhase
|
|
|
|
++ optionals stdenv.hostPlatform.isGhcjs [ nodejs ];
|
2018-07-27 04:24:22 +00:00
|
|
|
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 11:52:21 +00: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 13:12:43 +00:00
|
|
|
'' + prePatch;
|
|
|
|
|
|
|
|
postPatch = optionalString jailbreak ''
|
2015-04-01 12:02:46 +00: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 13:12:43 +00:00
|
|
|
'' + postPatch;
|
2015-02-25 19:15:26 +00:00
|
|
|
|
2015-01-16 19:54:35 +00:00
|
|
|
setupCompilerEnvironmentPhase = ''
|
2019-01-08 21:40:12 +00:00
|
|
|
NIX_BUILD_CORES=$(( NIX_BUILD_CORES < ${toString maxBuildCores} ? NIX_BUILD_CORES : ${toString maxBuildCores} ))
|
2015-01-16 19:54:35 +00:00
|
|
|
runHook preSetupCompilerEnvironment
|
2015-01-07 19:31:32 +00:00
|
|
|
|
2015-04-01 12:02:46 +00:00
|
|
|
echo "Build with ${ghc}."
|
2018-07-27 04:24:22 +00:00
|
|
|
${optionalString (isLibrary && hyperlinkSource) "export PATH=${hscolour}/bin:$PATH"}
|
2015-01-07 19:31:32 +00:00
|
|
|
|
2022-05-05 17:01:23 +00:00
|
|
|
builddir="$(mktemp -d)"
|
|
|
|
setupPackageConfDir="$builddir/setup-package.conf.d"
|
2018-03-01 05:35:48 +00:00
|
|
|
mkdir -p $setupPackageConfDir
|
2022-05-05 17:01:23 +00:00
|
|
|
packageConfDir="$builddir/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 17:44:16 +00:00
|
|
|
+ ''
|
2018-03-01 05:35:48 +00:00
|
|
|
for p in "''${pkgsBuildBuild[@]}" "''${pkgsBuildHost[@]}" "''${pkgsBuildTarget[@]}"; do
|
2023-01-20 18:10:46 +00:00
|
|
|
${buildPkgDb nativeGhc "$setupPackageConfDir"}
|
2018-03-01 05:35:48 +00:00
|
|
|
done
|
2024-01-28 09:58:14 +00:00
|
|
|
${nativeGhcCommand}-pkg --package-db="$setupPackageConfDir" recache
|
2018-06-13 17:44:16 +00:00
|
|
|
''
|
|
|
|
# For normal components
|
2018-03-01 05:35:48 +00:00
|
|
|
+ ''
|
2017-08-12 16:41:49 +00:00
|
|
|
for p in "''${pkgsHostHost[@]}" "''${pkgsHostTarget[@]}"; do
|
2023-01-20 18:10:46 +00:00
|
|
|
${buildPkgDb ghc "$packageConfDir"}
|
2018-06-19 14:52:10 +00: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
|
|
|
|
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
|
|
|
''
|
2024-04-12 14:50:59 +00:00
|
|
|
+ (optionalString stdenv.hostPlatform.isGhcjs ''
|
|
|
|
export EM_CACHE="$(realpath "$(mktemp -d emcache.XXXXXXXXXX)")"
|
|
|
|
cp -Lr ${emscripten}/share/emscripten/cache/* "$EM_CACHE/"
|
|
|
|
chmod u+rwX -R "$EM_CACHE"
|
|
|
|
'')
|
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
|
2023-01-31 17:34:01 +00:00
|
|
|
#
|
|
|
|
# Note: We need to disable this work-around when using intermediate build
|
|
|
|
# products from a prior build because otherwise Nix will change permissions on
|
|
|
|
# the `$out/lib/links` directory to read-only when the build is done after the
|
|
|
|
# dist directory has already been exported, which triggers an unnecessary
|
|
|
|
# rebuild of modules included in the exported dist directory.
|
|
|
|
+ (optionalString (stdenv.isDarwin && (enableSharedLibraries || enableSharedExecutables) && !enableSeparateIntermediatesOutput) ''
|
2017-08-06 22:05:18 +00:00
|
|
|
# Work around a limit in the macOS Sierra linker on the number of paths
|
2017-05-05 16:53:08 +00:00
|
|
|
# referenced by any one dynamic library:
|
|
|
|
#
|
2017-08-06 22:05:18 +00:00
|
|
|
# Create a local directory with symlinks of the *.dylib (macOS shared
|
2017-05-05 16:53:08 +00:00
|
|
|
# libraries) from all the dependencies.
|
2017-12-05 08:36:08 +00:00
|
|
|
local dynamicLinksDir="$out/lib/links"
|
2017-05-05 16:53:08 +00:00
|
|
|
mkdir -p $dynamicLinksDir
|
2020-01-28 23:44:11 +00:00
|
|
|
|
|
|
|
# Unprettify all package conf files before reading/writing them
|
|
|
|
for d in "$packageConfDir/"*; do
|
|
|
|
# gawk -i inplace seems to strip the last newline
|
|
|
|
gawk -f ${unprettyConf} "$d" > tmp
|
|
|
|
mv tmp "$d"
|
|
|
|
done
|
|
|
|
|
|
|
|
for d in $(grep '^dynamic-library-dirs:' "$packageConfDir"/* | cut -d' ' -f2- | tr ' ' '\n' | sort -u); do
|
2020-02-15 16:37:24 +00:00
|
|
|
for lib in "$d/"*.{dylib,so}; do
|
2020-05-14 13:26:01 +00:00
|
|
|
# Allow overwriting because C libs can be pulled in multiple times.
|
|
|
|
ln -sf "$lib" "$dynamicLinksDir"
|
2020-01-28 23:44:11 +00:00
|
|
|
done
|
2017-05-05 16:53:08 +00:00
|
|
|
done
|
|
|
|
# Edit the local package DB to reference the links directory.
|
2017-07-18 18:57:24 +00:00
|
|
|
for f in "$packageConfDir/"*.conf; do
|
2020-01-28 23:44:11 +00:00
|
|
|
sed -i "s,dynamic-library-dirs: .*,dynamic-library-dirs: $dynamicLinksDir," "$f"
|
2017-05-05 16:53:08 +00:00
|
|
|
done
|
|
|
|
'') + ''
|
2024-01-28 09:58:14 +00:00
|
|
|
${ghcCommand}-pkg --package-db="$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
|
2022-05-05 17:01:23 +00:00
|
|
|
${nativeGhcCommand} $setupCompileFlags --make -o Setup -odir $builddir -hidir $builddir $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 19:36:48 +00:00
|
|
|
inherit configureFlags;
|
|
|
|
|
2021-03-25 13:44:10 +00:00
|
|
|
# Note: the options here must be always added, regardless of whether the
|
|
|
|
# package specifies `hardeningDisable`.
|
|
|
|
hardeningDisable = lib.optionals (args ? hardeningDisable) hardeningDisable
|
|
|
|
++ lib.optional (ghc.isHaLVM or false) "all"
|
|
|
|
# Static libraries (ie. all of pkgsStatic.haskellPackages) fail to build
|
|
|
|
# because by default Nix adds `-pie` to the linker flags: this
|
|
|
|
# conflicts with the `-r` and `-no-pie` flags added by GHC (see
|
|
|
|
# https://gitlab.haskell.org/ghc/ghc/-/issues/19580). hardeningDisable
|
|
|
|
# changes the default Nix behavior regarding adding "hardening" flags.
|
|
|
|
++ lib.optional enableStaticLibraries "pie";
|
|
|
|
|
2015-01-16 19:54:35 +00:00
|
|
|
configurePhase = ''
|
|
|
|
runHook preConfigure
|
|
|
|
|
|
|
|
echo configureFlags: $configureFlags
|
2015-05-06 19:56:02 +00:00
|
|
|
${setupCommand} configure $configureFlags 2>&1 | ${coreutils}/bin/tee "$NIX_BUILD_TOP/cabal-configure.log"
|
2021-01-23 17:15:07 +00:00
|
|
|
${lib.optionalString (!allowInconsistentDependencies) ''
|
2018-12-15 18:31:08 +00:00
|
|
|
if ${gnugrep}/bin/egrep -q -z '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-07 19:31:32 +00:00
|
|
|
|
|
|
|
runHook postConfigure
|
|
|
|
'';
|
|
|
|
|
2023-01-31 17:34:01 +00:00
|
|
|
buildPhase =
|
|
|
|
''
|
|
|
|
runHook preBuild
|
|
|
|
''
|
|
|
|
+ lib.optionalString (previousIntermediates != null)
|
|
|
|
''
|
|
|
|
mkdir -p dist;
|
|
|
|
rm -r dist/build
|
2023-04-28 16:38:32 +00:00
|
|
|
cp -r ${previousIntermediates}/${intermediatesDir}/build dist/build
|
2023-01-31 17:34:01 +00:00
|
|
|
find dist/build -exec chmod u+w {} +
|
|
|
|
find dist/build -exec touch -d '1970-01-01T00:00:00Z' {} +
|
|
|
|
''
|
|
|
|
+ ''
|
2024-06-04 12:34:03 +00:00
|
|
|
${setupCommand} build ${buildTarget}${buildFlagsString}
|
2023-01-31 17:34:01 +00:00
|
|
|
runHook postBuild
|
|
|
|
'';
|
2015-01-07 19:31:32 +00:00
|
|
|
|
2018-03-15 00:00:00 +00:00
|
|
|
inherit doCheck;
|
|
|
|
|
2021-06-09 13:09:00 +00:00
|
|
|
# Run test suite(s) and pass `checkFlags` as well as `checkFlagsArray`.
|
|
|
|
# `testFlags` are added to `checkFlagsArray` each prefixed with
|
|
|
|
# `--test-option`, so Cabal passes it to the underlying test suite binary.
|
2024-05-26 09:50:07 +00:00
|
|
|
#
|
|
|
|
# We also take care of setting GHC_PACKAGE_PATH during test suite execution,
|
|
|
|
# so it can run GHC(i) with build dependencies available:
|
|
|
|
# - If NIX_GHC_PACKAGE_PATH_FOR_TEST is set, it become the value of GHC_PACKAGE_PATH
|
|
|
|
# while the test suite is executed.
|
|
|
|
# - If it is empty, it'll be unset during test suite execution.
|
|
|
|
# - Otherwise GHC_PACKAGE_PATH will have the package db used for configuring
|
|
|
|
# plus GHC's core packages.
|
2015-01-10 08:12:37 +00:00
|
|
|
checkPhase = ''
|
2015-01-07 19:31:32 +00:00
|
|
|
runHook preCheck
|
2022-05-10 10:03:55 +00:00
|
|
|
checkFlagsArray+=(
|
|
|
|
"--show-details=streaming"
|
2024-05-26 09:50:07 +00:00
|
|
|
"--test-wrapper=${testWrapperScript}"
|
2022-05-10 10:03:55 +00:00
|
|
|
${lib.escapeShellArgs (builtins.map (opt: "--test-option=${opt}") testFlags)}
|
|
|
|
)
|
2024-05-26 09:50:07 +00:00
|
|
|
export NIX_GHC_PACKAGE_PATH_FOR_TEST="''${NIX_GHC_PACKAGE_PATH_FOR_TEST:-$packageConfDir:}"
|
2021-06-09 13:09:00 +00:00
|
|
|
${setupCommand} test ${testTarget} $checkFlags ''${checkFlagsArray:+"''${checkFlagsArray[@]}"}
|
2015-01-07 19:31:32 +00:00
|
|
|
runHook postCheck
|
|
|
|
'';
|
|
|
|
|
2015-01-16 19:54:35 +00:00
|
|
|
haddockPhase = ''
|
|
|
|
runHook preHaddock
|
2018-07-27 04:24:22 +00:00
|
|
|
${optionalString (doHaddock && isLibrary) ''
|
2015-05-06 19:56:02 +00:00
|
|
|
${setupCommand} haddock --html \
|
2015-01-16 19:54:35 +00:00
|
|
|
${optionalString doHoogle "--hoogle"} \
|
2019-12-19 13:41:11 +00:00
|
|
|
${optionalString doHaddockQuickjump "--quickjump"} \
|
2019-02-20 14:58:28 +00:00
|
|
|
${optionalString (isLibrary && hyperlinkSource) "--hyperlink-source"} \
|
2021-01-23 17:15:07 +00:00
|
|
|
${lib.concatStringsSep " " haddockFlags}
|
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
|
|
|
|
|
2021-04-23 19:55:38 +00:00
|
|
|
${if !isLibrary && buildTarget == "" then "${setupCommand} install"
|
|
|
|
# ^^ if the project is not a library, and no build target is specified, we can just use "install".
|
|
|
|
else if !isLibrary then "${setupCommand} copy ${buildTarget}"
|
|
|
|
# ^^ if the project is not a library, and we have a build target, then use "copy" to install
|
|
|
|
# just the target specified; "install" will error here, since not all targets have been built.
|
|
|
|
else ''
|
2021-06-05 10:38:24 +00:00
|
|
|
${setupCommand} copy ${buildTarget}
|
2023-01-22 01:12:17 +00:00
|
|
|
local packageConfDir="$out/${ghcLibdir}/package.conf.d"
|
2015-01-10 08:12:37 +00:00
|
|
|
local packageConfFile="$packageConfDir/${pname}-${version}.conf"
|
|
|
|
mkdir -p "$packageConfDir"
|
2015-05-06 19:56:02 +00: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
|
2020-01-28 23:44:11 +00:00
|
|
|
local pkgId=$(gawk -f ${unprettyConf} "$packageConfFile" \
|
|
|
|
| grep '^id:' | cut -d' ' -f2)
|
|
|
|
mv "$packageConfFile" "$packageConfDir/$pkgId.conf"
|
2017-12-23 00:25:59 +00:00
|
|
|
done
|
2018-07-16 15:23:32 +00: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 ''
|
2019-03-29 08:10:42 +00:00
|
|
|
for exeDir in "${binDir}/"*.jsexe; do
|
2017-03-25 04:23:01 +00:00
|
|
|
exe="''${exeDir%.jsexe}"
|
2017-07-25 22:48:47 +00:00
|
|
|
printWords '#!${nodejs}/bin/node' > "$exe"
|
2018-03-26 00:43:23 +00: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-01-07 19:31:32 +00:00
|
|
|
|
2017-07-25 01:22:19 +00: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 01:22:19 +00:00
|
|
|
done
|
2017-12-05 08:36:08 +00:00
|
|
|
mkdir -p $doc
|
2017-07-25 01:22:19 +00:00
|
|
|
''}
|
2017-12-05 08:36:08 +00:00
|
|
|
${optionalString enableSeparateDataOutput "mkdir -p $data"}
|
2017-07-25 01:22:19 +00:00
|
|
|
|
2015-01-07 19:31:32 +00:00
|
|
|
runHook postInstall
|
|
|
|
'';
|
|
|
|
|
2023-01-31 17:34:01 +00:00
|
|
|
${if doInstallIntermediates then "installIntermediatesPhase" else null} = ''
|
|
|
|
runHook preInstallIntermediates
|
2023-04-28 16:38:32 +00:00
|
|
|
intermediatesOutput=${if enableSeparateIntermediatesOutput then "$intermediates" else "$out"}
|
|
|
|
installIntermediatesDir="$intermediatesOutput/${intermediatesDir}"
|
|
|
|
mkdir -p "$installIntermediatesDir"
|
|
|
|
cp -r dist/build "$installIntermediatesDir"
|
2023-01-31 17:34:01 +00:00
|
|
|
runHook postInstallIntermediates
|
|
|
|
'';
|
|
|
|
|
shellFor: Refactor for consistency and cross
This makes it work like work-on-multi from Reflex Platform. In
particular, rather than making `.env` from `shellFor`, we make `.env`
the primitive, and `shellFor` works by combining together the arguments
of all the packages to `generic-builder` and taking the `.env` of the
resulting mashup-package.
There are 2 benefits of this:
1. The dependency logic is deduplicated. generic builder just concatted
lists, whereas all the envs until now would sieve apart haskell and
system build inputs. Now, they both decide haskell vs system the same
way: according to the argument list and without reflection.
Consistency is good, especially because it mean that if the build
works, the shell is more likely to work.
2. Cross is handled better. For native builds, because the
`ghcWithPackages` calls would shadow, we through both the regular
component (lib, exe, test, bench) haskell deps and Setup.hs haskell
deps in the same `ghcWithPackages` call. But for cross builds we use
`buildPackages.ghcWithPackages` to get the setup deps. This ensures
everything works correctly.
2019-12-23 20:33:18 +00:00
|
|
|
passthru = passthru // rec {
|
2015-01-10 12:23:04 +00:00
|
|
|
|
2024-04-15 19:45:45 +00:00
|
|
|
inherit pname version disallowGhcReference;
|
2015-01-10 12:23:04 +00:00
|
|
|
|
2017-12-29 02:29:23 +00:00
|
|
|
compiler = ghc;
|
|
|
|
|
shellFor: Refactor for consistency and cross
This makes it work like work-on-multi from Reflex Platform. In
particular, rather than making `.env` from `shellFor`, we make `.env`
the primitive, and `shellFor` works by combining together the arguments
of all the packages to `generic-builder` and taking the `.env` of the
resulting mashup-package.
There are 2 benefits of this:
1. The dependency logic is deduplicated. generic builder just concatted
lists, whereas all the envs until now would sieve apart haskell and
system build inputs. Now, they both decide haskell vs system the same
way: according to the argument list and without reflection.
Consistency is good, especially because it mean that if the build
works, the shell is more likely to work.
2. Cross is handled better. For native builds, because the
`ghcWithPackages` calls would shadow, we through both the regular
component (lib, exe, test, bench) haskell deps and Setup.hs haskell
deps in the same `ghcWithPackages` call. But for cross builds we use
`buildPackages.ghcWithPackages` to get the setup deps. This ensures
everything works correctly.
2019-12-23 20:33:18 +00:00
|
|
|
# All this information is intended just for `shellFor`. It should be
|
|
|
|
# considered unstable and indeed we knew how to keep it private we would.
|
|
|
|
getCabalDeps = {
|
|
|
|
inherit
|
|
|
|
buildDepends
|
|
|
|
buildTools
|
|
|
|
executableFrameworkDepends
|
|
|
|
executableHaskellDepends
|
|
|
|
executablePkgconfigDepends
|
|
|
|
executableSystemDepends
|
|
|
|
executableToolDepends
|
|
|
|
extraLibraries
|
|
|
|
libraryFrameworkDepends
|
|
|
|
libraryHaskellDepends
|
|
|
|
libraryPkgconfigDepends
|
|
|
|
librarySystemDepends
|
|
|
|
libraryToolDepends
|
2021-01-19 06:50:56 +00:00
|
|
|
pkg-configDepends
|
shellFor: Refactor for consistency and cross
This makes it work like work-on-multi from Reflex Platform. In
particular, rather than making `.env` from `shellFor`, we make `.env`
the primitive, and `shellFor` works by combining together the arguments
of all the packages to `generic-builder` and taking the `.env` of the
resulting mashup-package.
There are 2 benefits of this:
1. The dependency logic is deduplicated. generic builder just concatted
lists, whereas all the envs until now would sieve apart haskell and
system build inputs. Now, they both decide haskell vs system the same
way: according to the argument list and without reflection.
Consistency is good, especially because it mean that if the build
works, the shell is more likely to work.
2. Cross is handled better. For native builds, because the
`ghcWithPackages` calls would shadow, we through both the regular
component (lib, exe, test, bench) haskell deps and Setup.hs haskell
deps in the same `ghcWithPackages` call. But for cross builds we use
`buildPackages.ghcWithPackages` to get the setup deps. This ensures
everything works correctly.
2019-12-23 20:33:18 +00:00
|
|
|
setupHaskellDepends
|
|
|
|
;
|
2021-01-23 17:15:07 +00:00
|
|
|
} // lib.optionalAttrs doCheck {
|
shellFor: Refactor for consistency and cross
This makes it work like work-on-multi from Reflex Platform. In
particular, rather than making `.env` from `shellFor`, we make `.env`
the primitive, and `shellFor` works by combining together the arguments
of all the packages to `generic-builder` and taking the `.env` of the
resulting mashup-package.
There are 2 benefits of this:
1. The dependency logic is deduplicated. generic builder just concatted
lists, whereas all the envs until now would sieve apart haskell and
system build inputs. Now, they both decide haskell vs system the same
way: according to the argument list and without reflection.
Consistency is good, especially because it mean that if the build
works, the shell is more likely to work.
2. Cross is handled better. For native builds, because the
`ghcWithPackages` calls would shadow, we through both the regular
component (lib, exe, test, bench) haskell deps and Setup.hs haskell
deps in the same `ghcWithPackages` call. But for cross builds we use
`buildPackages.ghcWithPackages` to get the setup deps. This ensures
everything works correctly.
2019-12-23 20:33:18 +00:00
|
|
|
inherit
|
|
|
|
testDepends
|
|
|
|
testFrameworkDepends
|
|
|
|
testHaskellDepends
|
|
|
|
testPkgconfigDepends
|
|
|
|
testSystemDepends
|
|
|
|
testToolDepends
|
|
|
|
;
|
2021-01-23 17:15:07 +00:00
|
|
|
} // lib.optionalAttrs doBenchmark {
|
shellFor: Refactor for consistency and cross
This makes it work like work-on-multi from Reflex Platform. In
particular, rather than making `.env` from `shellFor`, we make `.env`
the primitive, and `shellFor` works by combining together the arguments
of all the packages to `generic-builder` and taking the `.env` of the
resulting mashup-package.
There are 2 benefits of this:
1. The dependency logic is deduplicated. generic builder just concatted
lists, whereas all the envs until now would sieve apart haskell and
system build inputs. Now, they both decide haskell vs system the same
way: according to the argument list and without reflection.
Consistency is good, especially because it mean that if the build
works, the shell is more likely to work.
2. Cross is handled better. For native builds, because the
`ghcWithPackages` calls would shadow, we through both the regular
component (lib, exe, test, bench) haskell deps and Setup.hs haskell
deps in the same `ghcWithPackages` call. But for cross builds we use
`buildPackages.ghcWithPackages` to get the setup deps. This ensures
everything works correctly.
2019-12-23 20:33:18 +00:00
|
|
|
inherit
|
|
|
|
benchmarkDepends
|
|
|
|
benchmarkFrameworkDepends
|
|
|
|
benchmarkHaskellDepends
|
|
|
|
benchmarkPkgconfigDepends
|
|
|
|
benchmarkSystemDepends
|
|
|
|
benchmarkToolDepends
|
|
|
|
;
|
|
|
|
};
|
2018-09-17 21:11:59 +00:00
|
|
|
|
shellFor: Refactor for consistency and cross
This makes it work like work-on-multi from Reflex Platform. In
particular, rather than making `.env` from `shellFor`, we make `.env`
the primitive, and `shellFor` works by combining together the arguments
of all the packages to `generic-builder` and taking the `.env` of the
resulting mashup-package.
There are 2 benefits of this:
1. The dependency logic is deduplicated. generic builder just concatted
lists, whereas all the envs until now would sieve apart haskell and
system build inputs. Now, they both decide haskell vs system the same
way: according to the argument list and without reflection.
Consistency is good, especially because it mean that if the build
works, the shell is more likely to work.
2. Cross is handled better. For native builds, because the
`ghcWithPackages` calls would shadow, we through both the regular
component (lib, exe, test, bench) haskell deps and Setup.hs haskell
deps in the same `ghcWithPackages` call. But for cross builds we use
`buildPackages.ghcWithPackages` to get the setup deps. This ensures
everything works correctly.
2019-12-23 20:33:18 +00:00
|
|
|
# Attributes for the old definition of `shellFor`. Should be removed but
|
|
|
|
# this predates the warning at the top of `getCabalDeps`.
|
|
|
|
getBuildInputs = rec {
|
2018-09-17 21:11:59 +00:00
|
|
|
inherit propagatedBuildInputs otherBuildInputs allPkgconfigDepends;
|
|
|
|
haskellBuildInputs = isHaskellPartition.right;
|
|
|
|
systemBuildInputs = isHaskellPartition.wrong;
|
2021-01-23 17:15:07 +00:00
|
|
|
isHaskellPartition = lib.partition
|
shellFor: Refactor for consistency and cross
This makes it work like work-on-multi from Reflex Platform. In
particular, rather than making `.env` from `shellFor`, we make `.env`
the primitive, and `shellFor` works by combining together the arguments
of all the packages to `generic-builder` and taking the `.env` of the
resulting mashup-package.
There are 2 benefits of this:
1. The dependency logic is deduplicated. generic builder just concatted
lists, whereas all the envs until now would sieve apart haskell and
system build inputs. Now, they both decide haskell vs system the same
way: according to the argument list and without reflection.
Consistency is good, especially because it mean that if the build
works, the shell is more likely to work.
2. Cross is handled better. For native builds, because the
`ghcWithPackages` calls would shadow, we through both the regular
component (lib, exe, test, bench) haskell deps and Setup.hs haskell
deps in the same `ghcWithPackages` call. But for cross builds we use
`buildPackages.ghcWithPackages` to get the setup deps. This ensures
everything works correctly.
2019-12-23 20:33:18 +00:00
|
|
|
isHaskellPkg
|
|
|
|
(propagatedBuildInputs ++ otherBuildInputs ++ depsBuildBuild ++ nativeBuildInputs);
|
2018-09-17 21:11:59 +00:00
|
|
|
};
|
|
|
|
|
2018-07-27 04:24:22 +00:00
|
|
|
isHaskellLibrary = isLibrary;
|
2015-02-22 19:42:08 +00:00
|
|
|
|
2017-08-06 19:48:22 +00: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 19:48:22 +00:00
|
|
|
|
shellFor: Refactor for consistency and cross
This makes it work like work-on-multi from Reflex Platform. In
particular, rather than making `.env` from `shellFor`, we make `.env`
the primitive, and `shellFor` works by combining together the arguments
of all the packages to `generic-builder` and taking the `.env` of the
resulting mashup-package.
There are 2 benefits of this:
1. The dependency logic is deduplicated. generic builder just concatted
lists, whereas all the envs until now would sieve apart haskell and
system build inputs. Now, they both decide haskell vs system the same
way: according to the argument list and without reflection.
Consistency is good, especially because it mean that if the build
works, the shell is more likely to work.
2. Cross is handled better. For native builds, because the
`ghcWithPackages` calls would shadow, we through both the regular
component (lib, exe, test, bench) haskell deps and Setup.hs haskell
deps in the same `ghcWithPackages` call. But for cross builds we use
`buildPackages.ghcWithPackages` to get the setup deps. This ensures
everything works correctly.
2019-12-23 20:33:18 +00:00
|
|
|
# Creates a derivation containing all of the necessary dependencies for building the
|
|
|
|
# parent derivation. The attribute set that it takes as input can be viewed as:
|
|
|
|
#
|
|
|
|
# { withHoogle }
|
|
|
|
#
|
|
|
|
# The derivation that it builds contains no outpaths because it is meant for use
|
|
|
|
# as an environment
|
|
|
|
#
|
|
|
|
# # Example use
|
|
|
|
# # Creates a shell with all of the dependencies required to build the "hello" package,
|
|
|
|
# # and with python:
|
|
|
|
#
|
|
|
|
# > nix-shell -E 'with (import <nixpkgs> {}); \
|
|
|
|
# > haskell.packages.ghc865.hello.envFunc { buildInputs = [ python ]; }'
|
|
|
|
envFunc = { withHoogle ? false }:
|
|
|
|
let
|
|
|
|
name = "ghc-shell-for-${drv.name}";
|
|
|
|
|
|
|
|
withPackages = if withHoogle then ghcWithHoogle else ghcWithPackages;
|
|
|
|
|
|
|
|
# We use the `ghcWithPackages` function from `buildHaskellPackages` if we
|
|
|
|
# want a shell for the sake of cross compiling a package. In the native case
|
|
|
|
# we don't use this at all, and instead put the setupDepends in the main
|
|
|
|
# `ghcWithPackages`. This way we don't have two wrapper scripts called `ghc`
|
|
|
|
# shadowing each other on the PATH.
|
|
|
|
ghcEnvForBuild =
|
|
|
|
assert isCross;
|
|
|
|
buildHaskellPackages.ghcWithPackages (_: setupHaskellDepends);
|
|
|
|
|
|
|
|
ghcEnv = withPackages (_:
|
|
|
|
otherBuildInputsHaskell ++
|
|
|
|
propagatedBuildInputs ++
|
2021-01-23 17:15:07 +00:00
|
|
|
lib.optionals (!isCross) setupHaskellDepends);
|
shellFor: Refactor for consistency and cross
This makes it work like work-on-multi from Reflex Platform. In
particular, rather than making `.env` from `shellFor`, we make `.env`
the primitive, and `shellFor` works by combining together the arguments
of all the packages to `generic-builder` and taking the `.env` of the
resulting mashup-package.
There are 2 benefits of this:
1. The dependency logic is deduplicated. generic builder just concatted
lists, whereas all the envs until now would sieve apart haskell and
system build inputs. Now, they both decide haskell vs system the same
way: according to the argument list and without reflection.
Consistency is good, especially because it mean that if the build
works, the shell is more likely to work.
2. Cross is handled better. For native builds, because the
`ghcWithPackages` calls would shadow, we through both the regular
component (lib, exe, test, bench) haskell deps and Setup.hs haskell
deps in the same `ghcWithPackages` call. But for cross builds we use
`buildPackages.ghcWithPackages` to get the setup deps. This ensures
everything works correctly.
2019-12-23 20:33:18 +00:00
|
|
|
|
2021-01-23 17:15:07 +00:00
|
|
|
ghcCommandCaps = lib.toUpper ghcCommand';
|
2023-05-31 20:19:37 +00:00
|
|
|
in stdenv.mkDerivation {
|
shellFor: Refactor for consistency and cross
This makes it work like work-on-multi from Reflex Platform. In
particular, rather than making `.env` from `shellFor`, we make `.env`
the primitive, and `shellFor` works by combining together the arguments
of all the packages to `generic-builder` and taking the `.env` of the
resulting mashup-package.
There are 2 benefits of this:
1. The dependency logic is deduplicated. generic builder just concatted
lists, whereas all the envs until now would sieve apart haskell and
system build inputs. Now, they both decide haskell vs system the same
way: according to the argument list and without reflection.
Consistency is good, especially because it mean that if the build
works, the shell is more likely to work.
2. Cross is handled better. For native builds, because the
`ghcWithPackages` calls would shadow, we through both the regular
component (lib, exe, test, bench) haskell deps and Setup.hs haskell
deps in the same `ghcWithPackages` call. But for cross builds we use
`buildPackages.ghcWithPackages` to get the setup deps. This ensures
everything works correctly.
2019-12-23 20:33:18 +00:00
|
|
|
inherit name shellHook;
|
|
|
|
|
2021-01-23 17:15:07 +00:00
|
|
|
depsBuildBuild = lib.optional isCross ghcEnvForBuild;
|
shellFor: Refactor for consistency and cross
This makes it work like work-on-multi from Reflex Platform. In
particular, rather than making `.env` from `shellFor`, we make `.env`
the primitive, and `shellFor` works by combining together the arguments
of all the packages to `generic-builder` and taking the `.env` of the
resulting mashup-package.
There are 2 benefits of this:
1. The dependency logic is deduplicated. generic builder just concatted
lists, whereas all the envs until now would sieve apart haskell and
system build inputs. Now, they both decide haskell vs system the same
way: according to the argument list and without reflection.
Consistency is good, especially because it mean that if the build
works, the shell is more likely to work.
2. Cross is handled better. For native builds, because the
`ghcWithPackages` calls would shadow, we through both the regular
component (lib, exe, test, bench) haskell deps and Setup.hs haskell
deps in the same `ghcWithPackages` call. But for cross builds we use
`buildPackages.ghcWithPackages` to get the setup deps. This ensures
everything works correctly.
2019-12-23 20:33:18 +00:00
|
|
|
nativeBuildInputs =
|
2021-01-19 06:50:56 +00:00
|
|
|
[ ghcEnv ] ++ optional (allPkgconfigDepends != []) pkg-config ++
|
shellFor: Refactor for consistency and cross
This makes it work like work-on-multi from Reflex Platform. In
particular, rather than making `.env` from `shellFor`, we make `.env`
the primitive, and `shellFor` works by combining together the arguments
of all the packages to `generic-builder` and taking the `.env` of the
resulting mashup-package.
There are 2 benefits of this:
1. The dependency logic is deduplicated. generic builder just concatted
lists, whereas all the envs until now would sieve apart haskell and
system build inputs. Now, they both decide haskell vs system the same
way: according to the argument list and without reflection.
Consistency is good, especially because it mean that if the build
works, the shell is more likely to work.
2. Cross is handled better. For native builds, because the
`ghcWithPackages` calls would shadow, we through both the regular
component (lib, exe, test, bench) haskell deps and Setup.hs haskell
deps in the same `ghcWithPackages` call. But for cross builds we use
`buildPackages.ghcWithPackages` to get the setup deps. This ensures
everything works correctly.
2019-12-23 20:33:18 +00:00
|
|
|
collectedToolDepends;
|
|
|
|
buildInputs =
|
|
|
|
otherBuildInputsSystem;
|
|
|
|
phases = ["installPhase"];
|
|
|
|
installPhase = "echo $nativeBuildInputs $buildInputs > $out";
|
|
|
|
LANG = "en_US.UTF-8";
|
2021-01-23 17:15:07 +00:00
|
|
|
LOCALE_ARCHIVE = lib.optionalString (stdenv.hostPlatform.libc == "glibc") "${buildPackages.glibcLocales}/lib/locale/locale-archive";
|
shellFor: Refactor for consistency and cross
This makes it work like work-on-multi from Reflex Platform. In
particular, rather than making `.env` from `shellFor`, we make `.env`
the primitive, and `shellFor` works by combining together the arguments
of all the packages to `generic-builder` and taking the `.env` of the
resulting mashup-package.
There are 2 benefits of this:
1. The dependency logic is deduplicated. generic builder just concatted
lists, whereas all the envs until now would sieve apart haskell and
system build inputs. Now, they both decide haskell vs system the same
way: according to the argument list and without reflection.
Consistency is good, especially because it mean that if the build
works, the shell is more likely to work.
2. Cross is handled better. For native builds, because the
`ghcWithPackages` calls would shadow, we through both the regular
component (lib, exe, test, bench) haskell deps and Setup.hs haskell
deps in the same `ghcWithPackages` call. But for cross builds we use
`buildPackages.ghcWithPackages` to get the setup deps. This ensures
everything works correctly.
2019-12-23 20:33:18 +00:00
|
|
|
"NIX_${ghcCommandCaps}" = "${ghcEnv}/bin/${ghcCommand}";
|
|
|
|
"NIX_${ghcCommandCaps}PKG" = "${ghcEnv}/bin/${ghcCommand}-pkg";
|
|
|
|
# TODO: is this still valid?
|
|
|
|
"NIX_${ghcCommandCaps}_DOCDIR" = "${ghcEnv}/share/doc/ghc/html";
|
|
|
|
"NIX_${ghcCommandCaps}_LIBDIR" = if ghc.isHaLVM or false
|
|
|
|
then "${ghcEnv}/lib/HaLVM-${ghc.version}"
|
2023-01-22 01:12:17 +00:00
|
|
|
else "${ghcEnv}/${ghcLibdir}";
|
2023-05-31 20:19:37 +00:00
|
|
|
};
|
shellFor: Refactor for consistency and cross
This makes it work like work-on-multi from Reflex Platform. In
particular, rather than making `.env` from `shellFor`, we make `.env`
the primitive, and `shellFor` works by combining together the arguments
of all the packages to `generic-builder` and taking the `.env` of the
resulting mashup-package.
There are 2 benefits of this:
1. The dependency logic is deduplicated. generic builder just concatted
lists, whereas all the envs until now would sieve apart haskell and
system build inputs. Now, they both decide haskell vs system the same
way: according to the argument list and without reflection.
Consistency is good, especially because it mean that if the build
works, the shell is more likely to work.
2. Cross is handled better. For native builds, because the
`ghcWithPackages` calls would shadow, we through both the regular
component (lib, exe, test, bench) haskell deps and Setup.hs haskell
deps in the same `ghcWithPackages` call. But for cross builds we use
`buildPackages.ghcWithPackages` to get the setup deps. This ensures
everything works correctly.
2019-12-23 20:33:18 +00:00
|
|
|
|
|
|
|
env = envFunc { };
|
2018-09-17 21:20:29 +00: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; }
|
2020-07-30 16:43:59 +00:00
|
|
|
// optionalAttrs (args ? broken) { inherit broken; }
|
|
|
|
// optionalAttrs (args ? description) { inherit description; }
|
|
|
|
// optionalAttrs (args ? maintainers) { inherit maintainers; }
|
|
|
|
// optionalAttrs (args ? hydraPlatforms) { inherit hydraPlatforms; }
|
2021-06-26 23:13:30 +00:00
|
|
|
// optionalAttrs (args ? badPlatforms) { inherit badPlatforms; }
|
2021-04-09 15:09:12 +00:00
|
|
|
// optionalAttrs (args ? changelog) { inherit changelog; }
|
2021-07-03 08:30:58 +00:00
|
|
|
// optionalAttrs (args ? mainProgram) { inherit mainProgram; }
|
2015-01-10 08:12:37 +00:00
|
|
|
;
|
|
|
|
|
2015-01-07 19:31:32 +00:00
|
|
|
}
|
2020-07-30 16:43:59 +00:00
|
|
|
// optionalAttrs (args ? preCompileBuildDriver) { inherit preCompileBuildDriver; }
|
|
|
|
// optionalAttrs (args ? postCompileBuildDriver) { inherit postCompileBuildDriver; }
|
|
|
|
// optionalAttrs (args ? preUnpack) { inherit preUnpack; }
|
|
|
|
// optionalAttrs (args ? postUnpack) { inherit postUnpack; }
|
|
|
|
// optionalAttrs (args ? patches) { inherit patches; }
|
|
|
|
// optionalAttrs (args ? patchPhase) { inherit patchPhase; }
|
|
|
|
// optionalAttrs (args ? preConfigure) { inherit preConfigure; }
|
|
|
|
// optionalAttrs (args ? postConfigure) { inherit postConfigure; }
|
|
|
|
// optionalAttrs (args ? preBuild) { inherit preBuild; }
|
|
|
|
// optionalAttrs (args ? postBuild) { inherit postBuild; }
|
|
|
|
// optionalAttrs (args ? doBenchmark) { inherit doBenchmark; }
|
|
|
|
// optionalAttrs (args ? checkPhase) { inherit checkPhase; }
|
|
|
|
// optionalAttrs (args ? preCheck) { inherit preCheck; }
|
|
|
|
// optionalAttrs (args ? postCheck) { inherit postCheck; }
|
2020-10-21 14:53:44 +00:00
|
|
|
// optionalAttrs (args ? preHaddock) { inherit preHaddock; }
|
|
|
|
// optionalAttrs (args ? postHaddock) { inherit postHaddock; }
|
2020-07-30 16:43:59 +00:00
|
|
|
// optionalAttrs (args ? preInstall) { inherit preInstall; }
|
|
|
|
// optionalAttrs (args ? installPhase) { inherit installPhase; }
|
|
|
|
// optionalAttrs (args ? postInstall) { inherit postInstall; }
|
|
|
|
// optionalAttrs (args ? preFixup) { inherit preFixup; }
|
|
|
|
// optionalAttrs (args ? postFixup) { inherit postFixup; }
|
|
|
|
// optionalAttrs (args ? dontStrip) { inherit dontStrip; }
|
2023-01-31 17:34:01 +00:00
|
|
|
// optionalAttrs (postPhases != []) { inherit postPhases; }
|
2018-08-20 18:43:41 +00:00
|
|
|
// optionalAttrs (stdenv.buildPlatform.libc == "glibc"){ LOCALE_ARCHIVE = "${glibcLocales}/lib/locale/locale-archive"; }
|
2024-05-27 14:21:16 +00:00
|
|
|
// optionalAttrs (disallowedRequisites != [] || disallowGhcReference) {
|
|
|
|
disallowedRequisites =
|
|
|
|
disallowedRequisites
|
|
|
|
++ (
|
|
|
|
if disallowGhcReference
|
|
|
|
then [ghc]
|
|
|
|
else []
|
|
|
|
);
|
|
|
|
}
|
2023-11-09 02:54:55 +00:00
|
|
|
|
2023-11-13 23:41:44 +00:00
|
|
|
# Implicit pointer to integer conversions are errors by default since clang 15.
|
|
|
|
# Works around https://gitlab.haskell.org/ghc/ghc/-/issues/23456.
|
2024-05-27 14:21:16 +00:00
|
|
|
// optionalAttrs (stdenv.hasCC && stdenv.cc.isClang) {
|
2023-11-13 23:41:44 +00:00
|
|
|
NIX_CFLAGS_COMPILE = "-Wno-error=int-conversion";
|
|
|
|
}
|
2015-01-10 08:12:37 +00:00
|
|
|
)
|
2018-09-17 21:20:29 +00:00
|
|
|
)
|