diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -1,6 +1,11 @@
 Cabal2nix
 =========
 
+[![hackage release](https://img.shields.io/hackage/v/cabal2nix.svg?label=hackage)](http://hackage.haskell.org/package/cabal2nix)
+[![stackage LTS package](http://stackage.org/package/cabal2nix/badge/lts)](http://stackage.org/lts/package/cabal2nix)
+[![stackage Nightly package](http://stackage.org/package/cabal2nix/badge/nightly)](http://stackage.org/nightly/package/cabal2nix)
+[![travis build status](https://img.shields.io/travis/NixOS/cabal2nix/master.svg?label=travis+build)](https://travis-ci.org/NixOS/cabal2nix)
+
 `cabal2nix` converts a single Cabal file into a single Nix build expression.
 For example:
 
diff --git a/cabal2nix.cabal b/cabal2nix.cabal
--- a/cabal2nix.cabal
+++ b/cabal2nix.cabal
@@ -1,5 +1,5 @@
 name:               cabal2nix
-version:            2.10.0
+version:            2.10.1
 synopsis:           Convert Cabal files into Nix build instructions.
 description:
   Convert Cabal files into Nix build instructions. Users of Nix can install the latest
diff --git a/src/Distribution/Nixpkgs/Haskell/FromCabal/PostProcess.hs b/src/Distribution/Nixpkgs/Haskell/FromCabal/PostProcess.hs
--- a/src/Distribution/Nixpkgs/Haskell/FromCabal/PostProcess.hs
+++ b/src/Distribution/Nixpkgs/Haskell/FromCabal/PostProcess.hs
@@ -1,12 +1,16 @@
 {-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE ScopedTypeVariables #-}
 
 module Distribution.Nixpkgs.Haskell.FromCabal.PostProcess ( postProcess, pkg ) where
 
 import Control.Lens
+import Control.Monad.Trans.State
 import Data.List.Split
+import Data.Map ( Map )
+import qualified Data.Map as Map
+import Data.Map.Lens
 import Data.Set ( Set )
 import qualified Data.Set as Set
-import Data.Set.Lens
 import Distribution.Nixpkgs.Haskell
 import Distribution.Nixpkgs.Meta
 import Distribution.Package
@@ -16,7 +20,11 @@
 import Language.Nix
 
 postProcess :: Derivation -> Derivation
-postProcess deriv = foldr ($) (fixGtkBuilds deriv) [ f | (Dependency n vr, f) <- hooks, packageName deriv == n, packageVersion deriv `withinRange` vr ]
+postProcess deriv =
+ foldr (.) id [ f | (Dependency n vr, f) <- hooks, packageName deriv == n, packageVersion deriv `withinRange` vr ]
+ . fixGtkBuilds
+ . fixBuildDependsForTools
+ $ deriv
 
 fixGtkBuilds :: Derivation -> Derivation
 fixGtkBuilds drv = drv & dependencies . pkgconfig %~ Set.filter (not . collidesWithHaskellName)
@@ -24,26 +32,55 @@
                        & dependencies . tool %~ Set.filter (not . collidesWithHaskellName)
   where
     collidesWithHaskellName :: Binding -> Bool
-    collidesWithHaskellName b = view localName b `Set.member` buildDeps
+    collidesWithHaskellName b = case buildDeps Map.!? view localName b of
+      Nothing -> False -- totally uncollided
+      Just p  -> p /= view reference b -- identical is not collision, and important to preserve for cross
 
     myName :: Identifier
     myName = ident # unPackageName (packageName drv)
 
-    buildDeps :: Set Identifier
-    buildDeps = Set.delete myName (setOf (dependencies . haskell . folded . localName) drv)
+    buildDeps :: Map Identifier Path
+    buildDeps = Map.delete myName (toMapOf (dependencies . haskell . to Set.toList . traverse . binding . ifolded) drv)
 
+-- Per https://github.com/haskell/cabal/issues/5412 hvr considers
+-- `build-depends` providing executables an accident, and fragile one at that,
+-- unworthy of any compatibility hacks. But while he and the other Hackage
+-- maintainers is dedicated to fixing executables and libraries on Hackage, test
+-- suites and benchmarks are not a priority, as it is trivial to skip building
+-- test-suites with cabal-install. Nix however wishes to build test suites much
+-- more widely, so skipping those components is not an option.
+--
+-- Between that, and Stack not changing behavior as of
+-- https://github.com/commercialhaskell/stack/pull/4132, it seems likely that
+-- for a while packages scraped from Hackage will continue to improperly use
+-- `build-depends: package-for-tool` instead of `build-tool-depends` (which does
+-- also work for Stack). Until that changes, we provide do this to work around
+-- those package's brokeness.
+fixBuildDependsForTools :: Derivation -> Derivation
+fixBuildDependsForTools = foldr (.) id
+  [ fmap snd $ runState $ do
+      needs <- use $ cloneLens c . haskell . contains p
+      cloneLens c . tool . contains p ||= needs
+  | (c :: ALens' Derivation BuildInfo) <- [ testDepends, benchmarkDepends ]
+  , p <- self <$> [ "hspec-discover"
+                  , "tasty-discover"
+                  , "hsx2hs"
+                  , "markdown-unlit"
+                  ]
+  ]
+
 hooks :: [(Dependency, Derivation -> Derivation)]
 hooks =
   [ ("Agda < 2.5", set (executableDepends . tool . contains (pkg "emacs")) True . set phaseOverrides agdaPostInstall)
   , ("Agda >= 2.5", set (executableDepends . tool . contains (pkg "emacs")) True . set phaseOverrides agda25PostInstall)
   , ("alex < 3.1.5",  set (testDepends . tool . contains (pkg "perl")) True)
-  , ("alex",  set (executableDepends . tool . contains (bind "self.happy")) True)
+  , ("alex",  set (executableDepends . tool . contains (self "happy")) True)
   , ("alsa-core", over (metaSection . platforms) (Set.filter (\(Platform _ os) -> os == Linux)))                                                                                                      , ("bustle", set (libraryDepends . pkgconfig . contains "system-glib = pkgs.glib") True)
   , ("bindings-GLFW", over (libraryDepends . system) (Set.union (Set.fromList [bind "pkgs.xorg.libXext", bind "pkgs.xorg.libXfixes"])))
   , ("bindings-lxc", over (metaSection . platforms) (Set.filter (\(Platform _ os) -> os == Linux)))                                                                                                      , ("bustle", set (libraryDepends . pkgconfig . contains "system-glib = pkgs.glib") True)
   , ("bustle", set (libraryDepends . pkgconfig . contains "system-glib = pkgs.glib") True)
   , ("Cabal", set doCheck False) -- test suite doesn't work in Nix
-  , ("Cabal >2.2", over (setupDepends . haskell) (Set.union (Set.fromList [bind "self.mtl", bind "self.parsec"]))) -- https://github.com/haskell/cabal/issues/5391
+  , ("Cabal >2.2", over (setupDepends . haskell) (Set.union (Set.fromList [self "mtl", self "parsec"]))) -- https://github.com/haskell/cabal/issues/5391
   , ("cabal-helper", set doCheck False) -- https://github.com/DanielG/cabal-helper/issues/17
   , ("cabal-install", set doCheck False . set phaseOverrides cabalInstallPostInstall)
   , ("darcs", set phaseOverrides darcsInstallPostInstall . set doCheck False)
@@ -88,14 +125,14 @@
   , ("http-client-tls >= 0.2.2", set doCheck False) -- attempts to access the network
   , ("http-conduit", set doCheck False)         -- attempts to access the network
   , ("imagemagick", set (libraryDepends . pkgconfig . contains (pkg "imagemagick")) True) -- https://github.com/NixOS/cabal2nix/issues/136
-  , ("include-file <= 0.1.0.2", set (libraryDepends . haskell . contains (bind "self.random")) True) -- https://github.com/Daniel-Diaz/include-file/issues/1
+  , ("include-file <= 0.1.0.2", set (libraryDepends . haskell . contains (self "random")) True) -- https://github.com/Daniel-Diaz/include-file/issues/1
   , ("js-jquery", set doCheck False)            -- attempts to access the network
   , ("libconfig", over (libraryDepends . system) (replace "config = null" (pkg "libconfig")))
   , ("libxml", set (configureFlags . contains "--extra-include-dir=${libxml2.dev}/include/libxml2") True)
   , ("liquid-fixpoint", set (executableDepends . system . contains (pkg "ocaml")) True . set (testDepends . system . contains (pkg "z3")) True . set (testDepends . system . contains (pkg "nettools")) True . set (testDepends . system . contains (pkg "git")) True . set doCheck False)
   , ("liquidhaskell", set (testDepends . system . contains (pkg "z3")) True)
-  , ("lzma-clib", over (metaSection . platforms) (Set.filter (\(Platform _  os) -> os == Windows)) . set (libraryDepends . haskell . contains (bind "self.only-buildable-on-windows")) False)
-  , ("MFlow < 4.6", set (libraryDepends . tool . contains (bind "self.cpphs")) True)
+  , ("lzma-clib", over (metaSection . platforms) (Set.filter (\(Platform _  os) -> os == Windows)) . set (libraryDepends . haskell . contains (self "only-buildable-on-windows")) False)
+  , ("MFlow < 4.6", set (libraryDepends . tool . contains (self "cpphs")) True)
   , ("mwc-random", set doCheck False)
   , ("mysql", set (libraryDepends . system . contains (pkg "mysql")) True)
   , ("network-attoparsec", set doCheck False) -- test suite requires network access
@@ -118,7 +155,7 @@
   , ("target", set (testDepends . system . contains (pkg "z3")) True)
   , ("terminfo", set (libraryDepends . system . contains (pkg "ncurses")) True)
   , ("text", set doCheck False)         -- break infinite recursion
-  , ("thyme", set (libraryDepends . tool . contains (bind "self.cpphs")) True) -- required on Darwin
+  , ("thyme", set (libraryDepends . tool . contains (self "cpphs")) True) -- required on Darwin
   , ("twilio", set doCheck False)         -- attempts to access the network
   , ("tz", set phaseOverrides "preConfigure = \"export TZDIR=${pkgs.tzdata}/share/zoneinfo\";")
   , ("udev", over (metaSection . platforms) (Set.filter (\(Platform _ os) -> os == Linux)))                                                                                                      , ("bustle", set (libraryDepends . pkgconfig . contains "system-glib = pkgs.glib") True)
@@ -131,12 +168,15 @@
   , ("wxcore", set (libraryDepends . pkgconfig . contains (pkg "wxGTK")) True)
   , ("X11", over (libraryDepends . system) (Set.union (Set.fromList $ map bind ["pkgs.xorg.libXinerama","pkgs.xorg.libXext","pkgs.xorg.libXrender","pkgs.xorg.libXScrnSaver"])))
   , ("xmonad", set phaseOverrides xmonadPostInstall)
-  , ("zip-archive < 0.3.1", over (testDepends . tool) (replace (bind "self.zip") (pkg "zip")))
+  , ("zip-archive < 0.3.1", over (testDepends . tool) (replace (self "zip") (pkg "zip")))
   , ("zip-archive >= 0.3.1 && < 0.3.2.3", over (testDepends . tool) (Set.union (Set.fromList [pkg "zip", pkg "unzip"])))   -- https://github.com/jgm/zip-archive/issues/35
   ]
 
 pkg :: Identifier -> Binding
 pkg i = binding # (i, path # ["pkgs",i])
+
+self :: Identifier -> Binding
+self i = binding # (i, path # ["self",i])
 
 pkgs :: [Identifier] -> Set Binding
 pkgs = Set.fromList . map pkg
diff --git a/test/Main.hs b/test/Main.hs
--- a/test/Main.hs
+++ b/test/Main.hs
@@ -78,7 +78,10 @@
 --    some temporary location that is empty.
 --
 --  * Run this test with different kinds of encodings.
-
+--
+--  * Run tests with a different target OS, like Darwin. The packages "iconv",
+--    "crypt-sha512", "gl" might be worthwhile for testing since their output
+--    differs on Darwin.
 
 testExecutable :: FilePath -> FilePath -> TestTree
 testExecutable exe cabalFile = do
@@ -89,7 +92,7 @@
     (\ref new -> ["diff", "-u", ref, new])
     goldenFile
     nixFile
-    (callCommand (unwords ["env LANG=en_US.UTF-8", exe, "--sha256=deadbeef", "--compiler=ghc-8.2", "--", cabalFile, ">"++nixFile]))
+    (callCommand (unwords ["env LANG=en_US.UTF-8", exe, "--sha256=deadbeef", "--system=x86_64-linux", "--compiler=ghc-8.2", "--", cabalFile, ">"++nixFile]))
 
 -------------------------------------------------------------------------------
 -- * Helper functions
diff --git a/test/golden-test-cases/nvim-hs.nix.golden b/test/golden-test-cases/nvim-hs.nix.golden
--- a/test/golden-test-cases/nvim-hs.nix.golden
+++ b/test/golden-test-cases/nvim-hs.nix.golden
@@ -32,6 +32,7 @@
     template-haskell text time time-locale-compat transformers
     transformers-base utf8-string
   ];
+  testToolDepends = [ hspec-discover ];
   homepage = "https://github.com/neovimhaskell/nvim-hs";
   description = "Haskell plugin backend for neovim";
   license = stdenv.lib.licenses.asl20;
diff --git a/test/golden-test-cases/pinch.nix.golden b/test/golden-test-cases/pinch.nix.golden
--- a/test/golden-test-cases/pinch.nix.golden
+++ b/test/golden-test-cases/pinch.nix.golden
@@ -14,6 +14,7 @@
     base bytestring containers hspec hspec-discover QuickCheck text
     unordered-containers vector
   ];
+  testToolDepends = [ hspec-discover ];
   homepage = "https://github.com/abhinav/pinch#readme";
   description = "An alternative implementation of Thrift for Haskell";
   license = stdenv.lib.licenses.bsd3;
diff --git a/test/golden-test-cases/test-fixture.nix.golden b/test/golden-test-cases/test-fixture.nix.golden
--- a/test/golden-test-cases/test-fixture.nix.golden
+++ b/test/golden-test-cases/test-fixture.nix.golden
@@ -13,6 +13,7 @@
   testHaskellDepends = [
     base hspec hspec-discover mtl template-haskell transformers
   ];
+  testToolDepends = [ hspec-discover ];
   homepage = "http://github.com/cjdev/test-fixture#readme";
   description = "Test monadic side-effects";
   license = stdenv.lib.licenses.bsd3;
