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/make-package-set.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/make-package-set.nix')
-rw-r--r-- | pkgs/development/haskell-modules/make-package-set.nix | 82 |
1 files changed, 39 insertions, 43 deletions
diff --git a/pkgs/development/haskell-modules/make-package-set.nix b/pkgs/development/haskell-modules/make-package-set.nix index e2d01c5798f9..9ba25e09db93 100644 --- a/pkgs/development/haskell-modules/make-package-set.nix +++ b/pkgs/development/haskell-modules/make-package-set.nix @@ -38,12 +38,12 @@ let inherit (stdenv) buildPlatform hostPlatform; inherit (stdenv.lib) fix' extends makeOverridable; - inherit (haskellLib) overrideCabal getBuildInputs; + inherit (haskellLib) overrideCabal; mkDerivationImpl = pkgs.callPackage ./generic-builder.nix { inherit stdenv; nodejs = buildPackages.nodejs-slim; - inherit (self) buildHaskellPackages ghc shellFor; + inherit (self) buildHaskellPackages ghc ghcWithHoogle ghcWithPackages; inherit (self.buildHaskellPackages) jailbreak-cabal; hscolour = overrideCabal self.buildHaskellPackages.hscolour (drv: { isLibrary = false; @@ -258,6 +258,8 @@ in package-set { inherit pkgs stdenv callPackage; } self // { # packages themselves. Using nix-shell on this derivation will # give you an environment suitable for developing the listed # packages with an incremental tool like cabal-install. + # In addition to the "packages" arg and "withHoogle" arg, anything that + # can be passed into stdenv.mkDerivation can be included in the input attrset # # # default.nix # with import <nixpkgs> {}; @@ -268,9 +270,11 @@ in package-set { inherit pkgs stdenv callPackage; } self // { # }) # # # shell.nix + # let pkgs = import <nixpkgs> {} in # (import ./.).shellFor { # packages = p: [p.frontend p.backend p.common]; # withHoogle = true; + # buildInputs = [ pkgs.python ]; # } # # -- cabal.project @@ -280,49 +284,41 @@ in package-set { inherit pkgs stdenv callPackage; } self // { # common/ # # bash$ nix-shell --run "cabal new-build all" + # bash$ nix-shell --run "python" shellFor = { packages, withHoogle ? false, ... } @ args: let - selected = packages self; - - packageInputs = map getBuildInputs selected; - - name = if pkgs.lib.length selected == 1 - then "ghc-shell-for-${(pkgs.lib.head selected).name}" - else "ghc-shell-for-packages"; - - # If `packages = [ a b ]` and `a` depends on `b`, don't build `b`, - # because cabal will end up ignoring that built version, assuming - # new-style commands. - haskellInputs = pkgs.lib.filter - (input: pkgs.lib.all (p: input.outPath != p.outPath) selected) - (pkgs.lib.concatMap (p: p.haskellBuildInputs) packageInputs); - systemInputs = pkgs.lib.concatMap (p: p.systemBuildInputs) packageInputs; - - withPackages = if withHoogle then self.ghcWithHoogle else self.ghcWithPackages; - ghcEnv = withPackages (p: haskellInputs); - nativeBuildInputs = pkgs.lib.concatMap (p: p.nativeBuildInputs) selected; - - ghcCommand' = if ghc.isGhcjs or false then "ghcjs" else "ghc"; - ghcCommand = "${ghc.targetPrefix}${ghcCommand'}"; - ghcCommandCaps= pkgs.lib.toUpper ghcCommand'; - - mkDrvArgs = builtins.removeAttrs args ["packages" "withHoogle"]; - in pkgs.stdenv.mkDerivation (mkDrvArgs // { - name = mkDrvArgs.name or name; - - buildInputs = systemInputs ++ mkDrvArgs.buildInputs or []; - nativeBuildInputs = [ ghcEnv ] ++ nativeBuildInputs ++ mkDrvArgs.nativeBuildInputs or []; - phases = ["installPhase"]; - installPhase = "echo $nativeBuildInputs $buildInputs > $out"; - LANG = "en_US.UTF-8"; - LOCALE_ARCHIVE = pkgs.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}"; + combinedPackageFor = packages: + let + selected = packages self; + + pname = if pkgs.lib.length selected == 1 + then (pkgs.lib.head selected).name + else "packages"; + + # If `packages = [ a b ]` and `a` depends on `b`, don't build `b`, + # because cabal will end up ignoring that built version, assuming + # new-style commands. + combinedPackages = pkgs.lib.filter + (input: pkgs.lib.all (p: input.outPath or null != p.outPath) selected); + + # Returns an attrset containing a combined list packages' inputs for each + # stage of the build process + packageInputs = pkgs.lib.zipAttrsWith + (_: pkgs.lib.concatMap combinedPackages) + (map (p: p.getCabalDeps) selected); + + genericBuilderArgs = { + inherit pname; + version = "0"; + license = null; + } // packageInputs; + + in self.mkDerivation genericBuilderArgs; + + envFuncArgs = builtins.removeAttrs args [ "packages" ]; + in (combinedPackageFor packages).env.overrideAttrs (old: envFuncArgs // { + nativeBuildInputs = old.nativeBuildInputs ++ envFuncArgs.nativeBuildInputs or []; + buildInputs = old.buildInputs ++ envFuncArgs.buildInputs or []; }); ghc = ghc // { |