Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
reflex-frp
GitHub Repository: reflex-frp/reflex-platform
Path: blob/develop/nix-utils/work-on-multi/default.nix
1 views
{ reflex-platform ? import ../.. { hideDeprecated = false; } }:

let
  inherit (reflex-platform)
    nixpkgs
    ghc
    overrideCabal
    generalDevTools'
    ;
  inherit (nixpkgs) lib;
in

{ envFunc, packageNames, tools ? _: [], shellToolOverrides ? _: _: {} }:

let
  inherit (builtins) listToAttrs filter attrValues all concatLists;
    combinableAttrs = p: [
      "buildDepends"
      "buildTools"
      "executableFrameworkDepends"
      "executableHaskellDepends"
      "executablePkgconfigDepends"
      "executableSystemDepends"
      "executableToolDepends"
      "extraLibraries"
      "libraryFrameworkDepends"
      "libraryHaskellDepends"
      "libraryPkgconfigDepends"
      "librarySystemDepends"
      "libraryToolDepends"
      "pkgconfigDepends"
      "setupHaskellDepends"
    ] ++ lib.optionals (p.doCheck or true) [
      "testDepends"
      "testFrameworkDepends"
      "testHaskellDepends"
      "testPkgconfigDepends"
      "testSystemDepends"
      "testToolDepends"
    ] ++ lib.optionals (p.doBenchmark or false) [
      "benchmarkDepends"
      "benchmarkFrameworkDepends"
      "benchmarkHaskellDepends"
      "benchmarkPkgconfigDepends"
      "benchmarkSystemDepends"
      "benchmarkToolDepends"
    ];

    concatCombinableAttrs = haskellConfigs: lib.filterAttrs
      (n: v: v != [])
      (lib.zipAttrsWith (_: concatLists) (map
        (haskellConfig: lib.listToAttrs (map
          (name: {
            inherit name;
            value = haskellConfig.${name} or [];
          })
          (combinableAttrs haskellConfig)))
        haskellConfigs
        ));

    getHaskellConfig = p: (overrideCabal p (args: {
      passthru = (args.passthru or {}) // {
        out = args;
      };
    })).out;
    notInTargetPackageSet = p: all (pname: (p.pname or "") != pname) packageNames;
    baseTools = generalDevTools' {};
    env = envFunc reflex-platform;
    overriddenTools = baseTools // shellToolOverrides env baseTools;
    depAttrs = lib.mapAttrs (_: v: filter notInTargetPackageSet v) (concatCombinableAttrs (concatLists [
      (map getHaskellConfig (lib.attrVals packageNames env))
      [{
        buildTools = [
          (nixpkgs.buildEnv {
            name = "build-tools-wrapper";
            paths = attrValues overriddenTools ++ tools env;
            pathsToLink = [ "/bin" ];
            extraOutputsToInstall = [ "bin" ];
          })
          overriddenTools.Cabal
        ];
      }]
    ]));

in (env.mkDerivation (depAttrs // {
  pname = "work-on-multi--combined-pkg";
  version = "0";
  license = null;
})).env