stackage2nix-0.4.0: src/Distribution/Nixpkgs/Haskell/Stack.hs
{-# LANGUAGE CPP #-}
module Distribution.Nixpkgs.Haskell.Stack where
import Control.Lens
import Data.Maybe (fromMaybe)
import Data.Text as T
import Distribution.Compiler as Compiler
import Distribution.Nixpkgs.Fetch
import Distribution.Nixpkgs.Haskell.Derivation
import Distribution.Nixpkgs.Haskell.FromCabal as FromCabal
import Distribution.Nixpkgs.Haskell.FromStack as FromStack
import Distribution.Nixpkgs.Haskell.PackageSourceSpec as PackageSourceSpec
import Distribution.PackageDescription as PackageDescription
import Distribution.System as System
import Network.URI as URI
import Stack.Config
newtype HackageDb = HackageDb { fromHackageDB :: T.Text }
deriving (Eq, Ord, Show)
makePrisms ''HackageDb
unHackageDb :: HackageDb -> String
unHackageDb = T.unpack . fromHackageDB
data StackPackagesConfig = StackPackagesConfig
{ _spcHaskellResolver :: !HaskellResolver
, _spcNixpkgsResolver :: !NixpkgsResolver
, _spcTargetPlatform :: !Platform
, _spcTargetCompiler :: !CompilerInfo
, _spcFlagAssignment :: !FlagAssignment
, _spcDoCheckPackages :: !Bool
, _spcDoHaddockPackages :: !Bool
, _spcDoCheckStackage :: !Bool
, _spcDoHaddockStackage :: !Bool
}
makeLenses ''StackPackagesConfig
getStackPackageFromDb
:: Maybe HackageDb
-> StackPackage
-> IO Package
getStackPackageFromDb optHackageDb stackPackage =
#if MIN_VERSION_cabal2nix(2,6,0)
PackageSourceSpec.getPackage
False
(unHackageDb <$> optHackageDb)
Nothing
(stackLocationToSource (stackPackage ^. spLocation) (stackPackage ^. spDir))
#else
PackageSourceSpec.getPackage
(unHackageDb <$> optHackageDb)
(stackLocationToSource (stackPackage ^. spLocation) (stackPackage ^. spDir))
#endif
stackLocationToSource
:: PackageLocation
-- ^ Subdirectory in the package containing cabal file.
-> Maybe FilePath
-> Source
stackLocationToSource pl mCabalDir = case pl of
HackagePackage p -> Source
{ sourceUrl = "cabal://" ++ T.unpack p
, sourceRevision = mempty
, sourceHash = UnknownHash
, sourceCabalDir = cabalDir }
StackFilePath p -> Source
{ sourceUrl = p
, sourceRevision = mempty
, sourceHash = UnknownHash
, sourceCabalDir = cabalDir }
StackUri uri -> Source
{ sourceUrl = URI.uriToString id uri mempty
, sourceRevision = mempty
, sourceHash = UnknownHash
, sourceCabalDir = cabalDir }
StackRepo r -> Source
{ sourceUrl = T.unpack $ r ^. rUri
, sourceRevision = T.unpack $ r ^. rCommit
, sourceHash = UnknownHash
, sourceCabalDir = cabalDir }
where
cabalDir = fromMaybe mempty mCabalDir
packageDerivation
:: StackPackagesConfig
-> Maybe HackageDb
-> StackPackage
-> IO Derivation
packageDerivation conf optHackageDb stackPackage = do
pkg <- getStackPackageFromDb optHackageDb stackPackage
let
drv = genericPackageDerivation conf pkg
& subpath %~ flip fromMaybe (stackPackage ^. spDir)
isExtraDep = stackPackage ^. spExtraDep
pconf = PackageConfig
{ enableCheck = if isExtraDep then conf ^. spcDoCheckStackage else conf ^. spcDoCheckPackages
, enableHaddock = if isExtraDep then conf ^. spcDoHaddockStackage else conf ^. spcDoHaddockPackages }
return $ finalizePackage pkg pconf drv
genericPackageDerivation
:: StackPackagesConfig
-> Package
-> Derivation
genericPackageDerivation conf pkg =
FromCabal.fromGenericPackageDescription
(conf ^. spcHaskellResolver)
(conf ^. spcNixpkgsResolver)
(conf ^. spcTargetPlatform)
(conf ^. spcTargetCompiler)
(conf ^. spcFlagAssignment)
[]
(pkgCabal pkg)