packages feed

cabal2nix-1.69: src/Cabal2Nix/Generate.hs

module Cabal2Nix.Generate ( cabal2nix ) where

import Cabal2Nix.Flags
import Cabal2Nix.License
import Cabal2Nix.Normalize
import Cabal2Nix.PostProcess
import Data.Maybe
import Distribution.Compiler
import Distribution.NixOS.Derivation.Cabal
import qualified Distribution.Package as Cabal
import qualified Distribution.PackageDescription as Cabal
import Distribution.PackageDescription.Configuration
import Distribution.System

cabal2nix :: Cabal.GenericPackageDescription -> Derivation
cabal2nix cabal = normalize $ postProcess MkDerivation
  { pname          = let Cabal.PackageName x = Cabal.pkgName pkg in x
  , version        = Cabal.pkgVersion pkg
  , src            = error "cabal2nix left the src field undefined"
  , isLibrary      = isJust (Cabal.library tpkg)
  , isExecutable   = not (null (Cabal.executables tpkg))
  , extraFunctionArgs = []
  , buildDepends   = map unDep deps
  , testDepends    = map unDep tstDeps ++ concatMap Cabal.extraLibs tests
  , buildTools     = map unDep tools
  , extraLibs      = libs
  , pkgConfDeps    = pcs
  , configureFlags = []
  , cabalFlags     = configureCabalFlags pkg
  , runHaddock     = True
  , jailbreak      = False
  , doCheck        = True
  , testTarget     = ""
  , hyperlinkSource = True
  , enableSplitObjs = True
  , phaseOverrides = ""
  , metaSection    = Meta
                   { homepage       = Cabal.homepage descr
                   , description    = Cabal.synopsis descr
                   , license        = fromCabalLicense (Cabal.license descr)
                   , platforms      = []
                   , hydraPlatforms = []
                   , maintainers    = []
                   }
  }
  where
    descr   = Cabal.packageDescription cabal
    pkg     = Cabal.package descr
    deps    = Cabal.buildDepends tpkg
    tests   = map Cabal.testBuildInfo (Cabal.testSuites tpkg)
    libDeps = map Cabal.libBuildInfo (maybeToList (Cabal.library tpkg))
    exeDeps = map Cabal.buildInfo (Cabal.executables tpkg)
    tstDeps = concatMap Cabal.buildTools tests ++ concatMap Cabal.pkgconfigDepends tests ++
              concatMap Cabal.targetBuildDepends tests
    tools   = concatMap Cabal.buildTools (libDeps ++ exeDeps)
    libs    = concatMap Cabal.extraLibs (libDeps ++ exeDeps)
    pcs     = map unDep (concatMap Cabal.pkgconfigDepends (libDeps ++ exeDeps))
    Right (tpkg, _) = finalizePackageDescription
                        (configureCabalFlags pkg)
                        (const True)
                        (Platform I386 Linux)                   -- shouldn't be hardcoded
                        (CompilerId GHC (Version [7,6,3] []))   -- dito
                        [] cabal

unDep :: Cabal.Dependency -> String
unDep (Cabal.Dependency (Cabal.PackageName x) _) = x