let pinned = import ./nix/pinnedNixpkgs.nix;

in { src ? { rev = ""; }
, nixpkgs ? pinned.nixpkgs
, nixpkgsStaticLinux ? pinned.nixpkgsStaticLinux
, dhallLang ? null
, system ? builtins.currentSystem
}:

let
  callShared = args:
    import ./nix/shared.nix ({ inherit nixpkgs nixpkgsStaticLinux dhallLang system; } // args);

  shared_7_10_3 = callShared { compiler = "ghc7103"; };

  shared_8_6_1 = callShared { compiler = "ghc861"; };

  shared_ghcjs = callShared { compiler = "ghcjs"; };

  shared = callShared { };

  shared_linux = callShared { system = "x86_64-linux"; };

  coverage = callShared { coverage = true; };

in
  { dhall = shared.aggregate
      { name = "dhall";

        constituents = [
          # Verify that the packages build against the oldest supported version
          # of the compiler
          shared_7_10_3.dhall
          shared_7_10_3.dhall-bash
          shared_7_10_3.dhall-json
          # `HsYAML-aeson` requires Cabal >= 2.2
          # shared_7_10_3.dhall-yaml
          # `base-noprelude` depends on a specific version of `base`
          # shared_7_10_3.dhall-lsp-server
          # `hnix` depends on `lens-family-th`, which doesn't support GHC 7.10.3
          # shared_7_10_3.dhall-nix

          # Verify that the packages build against the latest supported version
          # of the compiler
          shared_8_6_1.dhall
          shared_8_6_1.dhall-bash
          shared_8_6_1.dhall-json
          shared_8_6_1.dhall-yaml
          # `base-noprelude` depends on a specific version of `base`
          # shared_8_6_1.dhall-lsp-server
          # `hnix` depends on `unix-2.7.*` and doesn't work with GHC 8.6
          # shared_8_6_1.dhall-nix

          # However, we still use GHC 8.4.3 to build the distributed tarballs
          # due to a bug in GHC 8.6.1.  See:
          #
          # https://ghc.haskell.org/trac/ghc/ticket/15696
          shared.tarball-dhall
          shared.tarball-dhall-bash
          shared.tarball-dhall-json
          shared.tarball-dhall-lsp-server
          shared.tarball-dhall-nix
          shared.tarball-dhall-yaml

          shared_ghcjs.tarball-website

          # This is the only `dhall` build that runs the test suite
          coverage.dhall
          coverage.dhall-json
          coverage.dhall-yaml

          # Check that the package builds with HTTP support compiled out
          shared.dhall-no-http

          (shared.trivial src.rev)
        ];
      };

    "coverage-dhall" = coverage.dhall;

    inherit (shared_ghcjs) tarball-website;

    inherit (shared)
      tarball-dhall
      tarball-dhall-bash
      tarball-dhall-json
      tarball-dhall-lsp-server
      tarball-dhall-nix
      tarball-dhall-yaml
    ;

    linux-dhall            = shared_linux.possibly-static.dhall;
    linux-dhall-bash       = shared_linux.possibly-static.dhall-bash;
    linux-dhall-json       = shared_linux.possibly-static.dhall-json;
    linux-dhall-lsp-server = shared_linux.possibly-static.dhall-lsp-server;
    linux-dhall-nix        = shared_linux.possibly-static.dhall-nix;
    linux-dhall-yaml       = shared_linux.possibly-static.dhall-yaml;

    inherit (shared_linux)
      image-dhall
      image-dhall-bash
      image-dhall-json
      image-dhall-lsp-server
      image-dhall-nix
      image-dhall-yaml
    ;
  }
