diff options
author | Matthew Bauer <mjbauer95@gmail.com> | 2020-01-17 18:00:27 -0500 |
---|---|---|
committer | Matthew Bauer <mjbauer95@gmail.com> | 2020-01-17 18:00:27 -0500 |
commit | 07db0b248c4c0d5404a54c01d61b0c07f744a859 (patch) | |
tree | fbe06b854d78ff802b3cf79e00f2cfd8da1b5dfd /pkgs/development/haskell-modules/generic-builder.nix | |
parent | ac65998957255aa4b67f771e9889534dcfe2298d (diff) | |
parent | cb46b97ae93b0c26af5ab65ee7f2f9b291027f43 (diff) | |
download | nixlib-07db0b248c4c0d5404a54c01d61b0c07f744a859.tar nixlib-07db0b248c4c0d5404a54c01d61b0c07f744a859.tar.gz nixlib-07db0b248c4c0d5404a54c01d61b0c07f744a859.tar.bz2 nixlib-07db0b248c4c0d5404a54c01d61b0c07f744a859.tar.lz nixlib-07db0b248c4c0d5404a54c01d61b0c07f744a859.tar.xz nixlib-07db0b248c4c0d5404a54c01d61b0c07f744a859.tar.zst nixlib-07db0b248c4c0d5404a54c01d61b0c07f744a859.zip |
Merge remote-tracking branch 'obsidiansystems/work-on-multi-shellFor'
Diffstat (limited to 'pkgs/development/haskell-modules/generic-builder.nix')
-rw-r--r-- | pkgs/development/haskell-modules/generic-builder.nix | 148 |
1 files changed, 127 insertions, 21 deletions
diff --git a/pkgs/development/haskell-modules/generic-builder.nix b/pkgs/development/haskell-modules/generic-builder.nix index 5410fccf0bb4..c93fc5b7e451 100644 --- a/pkgs/development/haskell-modules/generic-builder.nix +++ b/pkgs/development/haskell-modules/generic-builder.nix @@ -1,5 +1,6 @@ { stdenv, buildPackages, buildHaskellPackages, ghc -, jailbreak-cabal, hscolour, cpphs, nodejs, shellFor +, jailbreak-cabal, hscolour, cpphs, nodejs +, ghcWithHoogle, ghcWithPackages }: let @@ -206,21 +207,28 @@ let optionals doCheck testPkgconfigDepends ++ optionals doBenchmark benchmarkPkgconfigDepends; depsBuildBuild = [ nativeGhc ]; - nativeBuildInputs = [ ghc removeReferencesTo ] ++ optional (allPkgconfigDepends != []) pkgconfig ++ - setupHaskellDepends ++ - buildTools ++ libraryToolDepends ++ executableToolDepends ++ - optionals doCheck testToolDepends ++ - optionals doBenchmark benchmarkToolDepends; + collectedToolDepends = + buildTools ++ libraryToolDepends ++ executableToolDepends ++ + optionals doCheck testToolDepends ++ + optionals doBenchmark benchmarkToolDepends; + nativeBuildInputs = + [ ghc removeReferencesTo ] ++ optional (allPkgconfigDepends != []) pkgconfig ++ + setupHaskellDepends ++ collectedToolDepends; propagatedBuildInputs = buildDepends ++ libraryHaskellDepends ++ executableHaskellDepends ++ libraryFrameworkDepends; - otherBuildInputs = extraLibraries ++ librarySystemDepends ++ executableSystemDepends ++ executableFrameworkDepends ++ - allPkgconfigDepends ++ - optionals doCheck (testDepends ++ testHaskellDepends ++ testSystemDepends ++ testFrameworkDepends) ++ - optionals doBenchmark (benchmarkDepends ++ benchmarkHaskellDepends ++ benchmarkSystemDepends ++ benchmarkFrameworkDepends); - - - allBuildInputs = propagatedBuildInputs ++ otherBuildInputs ++ depsBuildBuild ++ nativeBuildInputs; - isHaskellPartition = - stdenv.lib.partition isHaskellPkg allBuildInputs; + 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); setupCommand = "./Setup"; @@ -462,17 +470,61 @@ stdenv.mkDerivation ({ runHook postInstall ''; - passthru = passthru // { + passthru = passthru // rec { inherit pname version; compiler = ghc; + # 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 + pkgconfigDepends + setupHaskellDepends + ; + } // stdenv.lib.optionalAttrs doCheck { + inherit + testDepends + testFrameworkDepends + testHaskellDepends + testPkgconfigDepends + testSystemDepends + testToolDepends + ; + } // stdenv.lib.optionalAttrs doBenchmark { + inherit + benchmarkDepends + benchmarkFrameworkDepends + benchmarkHaskellDepends + benchmarkPkgconfigDepends + benchmarkSystemDepends + benchmarkToolDepends + ; + }; - getBuildInputs = { + # Attributes for the old definition of `shellFor`. Should be removed but + # this predates the warning at the top of `getCabalDeps`. + getBuildInputs = rec { inherit propagatedBuildInputs otherBuildInputs allPkgconfigDepends; haskellBuildInputs = isHaskellPartition.right; systemBuildInputs = isHaskellPartition.wrong; + isHaskellPartition = stdenv.lib.partition + isHaskellPkg + (propagatedBuildInputs ++ otherBuildInputs ++ depsBuildBuild ++ nativeBuildInputs); }; isHaskellLibrary = isLibrary; @@ -485,10 +537,64 @@ stdenv.mkDerivation ({ # TODO: fetch the self from the fixpoint instead haddockDir = self: if doHaddock then "${docdir self.doc}/html" else null; - env = shellFor { - packages = p: [ drv ]; - inherit shellHook; - }; + # 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 ++ + stdenv.lib.optionals (!isCross) setupHaskellDepends); + + ghcCommandCaps = stdenv.lib.toUpper ghcCommand'; + in stdenv.mkDerivation ({ + inherit name shellHook; + + depsBuildBuild = stdenv.lib.optional isCross ghcEnvForBuild; + nativeBuildInputs = + [ ghcEnv ] ++ optional (allPkgconfigDepends != []) pkgconfig ++ + collectedToolDepends; + buildInputs = + otherBuildInputsSystem; + phases = ["installPhase"]; + installPhase = "echo $nativeBuildInputs $buildInputs > $out"; + LANG = "en_US.UTF-8"; + LOCALE_ARCHIVE = stdenv.lib.optionalString (stdenv.hostPlatform.libc == "glibc") "${buildPackages.glibcLocales}/lib/locale/locale-archive"; + "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}" + else "${ghcEnv}/lib/${ghcCommand}-${ghc.version}"; + }); + + env = envFunc { }; }; |