From 3461d04eab5868028b5c5a7aa820efbacac620f9 Mon Sep 17 00:00:00 2001 From: Hamish Mackenzie Date: Thu, 15 Sep 2022 16:53:12 +1200 Subject: [PATCH] Add cabal-issue-8352-workaround See https://github.com/haskell/cabal/issues/8352 --- build.nix | 2 +- lib/cabal-project-parser.nix | 4 +- overlays/haskell.nix | 97 +++++++++++++++++++----------------- scripts/update-hackage.nix | 2 +- 4 files changed, 54 insertions(+), 51 deletions(-) diff --git a/build.nix b/build.nix index 30f1952861..a3c6c3f2a7 100644 --- a/build.nix +++ b/build.nix @@ -49,7 +49,7 @@ in rec { # Update scripts use the internal nix-tools and cabal-install (compiled with a fixed GHC version) nix-tools = haskell.internal-nix-tools; cabal-install = haskell.internal-cabal-install; - inherit (haskell) update-index-state-hashes; + inherit (haskell) update-index-state-hashes cabal-issue-8352-workaround; }; update-stackage = haskell.callPackage ./scripts/update-stackage.nix { inherit (pkgs) stdenv lib writeScript coreutils glibc git diff --git a/lib/cabal-project-parser.nix b/lib/cabal-project-parser.nix index 0d93ba157b..f63bfb7da2 100644 --- a/lib/cabal-project-parser.nix +++ b/lib/cabal-project-parser.nix @@ -145,7 +145,7 @@ let repoContents = if inputMap ? ${attrs.url} # If there is an input use it to make `file:` url and create a suitable `.cabal/packages/${name}` directory then evalPackages.runCommand name ({ - nativeBuildInputs = [ cabal-install ]; + nativeBuildInputs = [ cabal-install ] ++ evalPackages.haskell-nix.cabal-issue-8352-workaround; preferLocalBuild = true; }) '' HOME=$(mktemp -d) @@ -162,7 +162,7 @@ let cp -r $HOME/.cabal/packages/${name} $out '' else evalPackages.runCommand name ({ - nativeBuildInputs = [ cabal-install evalPackages.curl nix-tools ]; + nativeBuildInputs = [ cabal-install evalPackages.curl nix-tools ] ++ evalPackages.haskell-nix.cabal-issue-8352-workaround; LOCALE_ARCHIVE = pkgs.lib.optionalString (evalPackages.stdenv.buildPlatform.libc == "glibc") "${evalPackages.glibcLocales}/lib/locale/locale-archive"; LANG = "en_US.UTF-8"; preferLocalBuild = true; diff --git a/overlays/haskell.nix b/overlays/haskell.nix index 6568d0fc3a..93fae413bc 100644 --- a/overlays/haskell.nix +++ b/overlays/haskell.nix @@ -205,6 +205,55 @@ final: prev: { # Creates Cabal local repository from { name, index } set. mkLocalHackageRepo = import ../mk-local-hackage-repo final; + # Dummy version of ghc to work around https://github.com/haskell/cabal/issues/8352 + cabal-issue-8352-workaround = [ + (final.writeTextFile { + name = "dummy-ghc"; + executable = true; + destination = "/bin/ghc"; + text = '' + #!${final.runtimeShell} + case "$*" in + --version*) + echo 'The Glorious Glasgow Haskell Compilation System, version 8.10.7' + ;; + --numeric-version*) + echo '8.10.7' + ;; + --supported-languages*) + echo Haskell2010 + ;; + --info*) + echo '[]' + ;; + *) + echo "Unknown argument '$*'" >&2 + exit 1 + ;; + esac + exit 0 + ''; + }) + (final.writeTextFile { + name = "dummy-ghc"; + executable = true; + destination = "/bin/ghc-pkg"; + text = '' + #!${final.runtimeShell} + case "$*" in + --version*) + echo 'GHC package manager version 8.10.7' + ;; + *) + echo "Unknown argument '$*'" >&2 + exit 1 + ;; + esac + exit 0 + ''; + }) + ]; + dotCabal = { index-state, sha256, cabal-install, extra-hackage-tarballs ? {}, extra-hackage-repos ? {}, ... }@args: let allTarballs = hackageTarball args // extra-hackage-tarballs; @@ -212,54 +261,8 @@ final: prev: { # Main Hackage index-state is embedded in its name and thus will propagate to # dotCabalName anyway. dotCabalName = "dot-cabal-" + allNames; - # Dummy version of ghc to work around https://github.com/haskell/cabal/issues/8352 - dummy-ghc = final.writeTextFile { - name = "dummy-ghc"; - executable = true; - destination = "/bin/ghc"; - text = '' - #!${final.runtimeShell} - case "$*" in - --version*) - echo 'The Glorious Glasgow Haskell Compilation System, version 8.10.7' - ;; - --numeric-version*) - echo '8.10.7' - ;; - --supported-languages*) - echo Haskell2010 - ;; - --info*) - echo '[]' - ;; - *) - echo "Unknown argument '$*'" >&2 - exit 1 - ;; - esac - exit 0 - ''; - }; - dummy-ghc-pkg = final.writeTextFile { - name = "dummy-ghc"; - executable = true; - destination = "/bin/ghc-pkg"; - text = '' - #!${final.runtimeShell} - case "$*" in - --version*) - echo 'GHC package manager version 8.10.7' - ;; - *) - echo "Unknown argument '$*'" >&2 - exit 1 - ;; - esac - exit 0 - ''; - }; tarballRepoFor = name: index: final.runCommand "tarballRepo_${name}" { - nativeBuildInputs = [ cabal-install dummy-ghc dummy-ghc-pkg ]; + nativeBuildInputs = [ cabal-install cabal-issue-8352-workaround ]; } '' set -xe diff --git a/scripts/update-hackage.nix b/scripts/update-hackage.nix index e0ef77d530..a4e431b1e2 100644 --- a/scripts/update-hackage.nix +++ b/scripts/update-hackage.nix @@ -1,7 +1,7 @@ { stdenv, lib, writeScript, coreutils, glibc, git, openssh , nix-tools, cabal-install, nixFlakes , gawk, bash, curl, findutils -, update-index-state-hashes }@args: +, update-index-state-hashes, cabal-issue-8352-workaround }@args: import ./update-external.nix (removeAttrs args ["update-index-state-hashes"]) {