{-# LANGUAGE CPP #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}

module Distribution.Nixpkgs.Haskell.FromCabal
  ( HaskellResolver, NixpkgsResolver
  , fromGenericPackageDescription , finalizeGenericPackageDescription , fromPackageDescription
  ) where

import Control.Lens
import Data.Maybe
import Data.Set ( Set )
import qualified Data.Set as Set
import Distribution.Compiler
import Distribution.Nixpkgs.Haskell
import qualified Distribution.Nixpkgs.Haskell as Nix
import Distribution.Nixpkgs.Haskell.Constraint
import Distribution.Nixpkgs.Haskell.FromCabal.License
import Distribution.Nixpkgs.Haskell.FromCabal.Name
import Distribution.Nixpkgs.Haskell.FromCabal.Normalize
import Distribution.Nixpkgs.Haskell.FromCabal.PostProcess (postProcess)
import qualified Distribution.Nixpkgs.License as Nix
import qualified Distribution.Nixpkgs.Meta as Nix
import Distribution.Package
import Distribution.PackageDescription
import qualified Distribution.PackageDescription as Cabal
import Distribution.PackageDescription.Configuration as Cabal
import Distribution.System
import Distribution.Text ( display )
import Distribution.Types.ComponentRequestedSpec as Cabal
import Distribution.Types.ExeDependency as Cabal
import Distribution.Types.LegacyExeDependency as Cabal
import Distribution.Types.PkgconfigDependency as Cabal
import Distribution.Types.UnqualComponentName as Cabal
import Distribution.Utils.ShortText ( fromShortText )
import Distribution.Version
import Language.Nix

type HaskellResolver = Dependency -> Bool
type NixpkgsResolver = Identifier -> Maybe Binding

fromGenericPackageDescription :: HaskellResolver -> NixpkgsResolver -> Platform -> CompilerInfo -> FlagAssignment -> [Constraint] -> GenericPackageDescription -> Derivation
fromGenericPackageDescription :: HaskellResolver
-> NixpkgsResolver
-> Platform
-> CompilerInfo
-> FlagAssignment
-> [Constraint]
-> GenericPackageDescription
-> Derivation
fromGenericPackageDescription HaskellResolver
haskellResolver NixpkgsResolver
nixpkgsResolver Platform
arch CompilerInfo
compiler FlagAssignment
flags [Constraint]
constraints GenericPackageDescription
genDesc =
  HaskellResolver
-> NixpkgsResolver
-> [Constraint]
-> FlagAssignment
-> PackageDescription
-> Derivation
fromPackageDescription HaskellResolver
haskellResolver NixpkgsResolver
nixpkgsResolver [Constraint]
missingDeps FlagAssignment
flags PackageDescription
descr
    where
      (PackageDescription
descr, [Constraint]
missingDeps) = HaskellResolver
-> Platform
-> CompilerInfo
-> FlagAssignment
-> [Constraint]
-> GenericPackageDescription
-> (PackageDescription, [Constraint])
finalizeGenericPackageDescription HaskellResolver
haskellResolver Platform
arch CompilerInfo
compiler FlagAssignment
flags [Constraint]
constraints GenericPackageDescription
genDesc

finalizeGenericPackageDescription :: HaskellResolver -> Platform -> CompilerInfo -> FlagAssignment -> [Constraint] -> GenericPackageDescription -> (PackageDescription, [Dependency])
finalizeGenericPackageDescription :: HaskellResolver
-> Platform
-> CompilerInfo
-> FlagAssignment
-> [Constraint]
-> GenericPackageDescription
-> (PackageDescription, [Constraint])
finalizeGenericPackageDescription HaskellResolver
haskellResolver Platform
arch CompilerInfo
compiler FlagAssignment
flags [Constraint]
constraints GenericPackageDescription
genDesc =
  let
    -- We have to call the Cabal finalizer several times with different resolver
    -- functions, and this convenience function makes our code shorter.
    finalize :: HaskellResolver -> Either [Dependency] (PackageDescription,FlagAssignment)
    finalize :: HaskellResolver
-> Either [Constraint] (PackageDescription, FlagAssignment)
finalize HaskellResolver
resolver = FlagAssignment
-> ComponentRequestedSpec
-> HaskellResolver
-> Platform
-> CompilerInfo
-> [Constraint]
-> GenericPackageDescription
-> Either [Constraint] (PackageDescription, FlagAssignment)
finalizePD FlagAssignment
flags ComponentRequestedSpec
requestedComponents HaskellResolver
resolver Platform
arch CompilerInfo
compiler [Constraint]
constraints GenericPackageDescription
genDesc

    requestedComponents :: ComponentRequestedSpec
    requestedComponents :: ComponentRequestedSpec
requestedComponents = ComponentRequestedSpec :: Bool -> Bool -> ComponentRequestedSpec
ComponentRequestedSpec
                          { testsRequested :: Bool
testsRequested      = Bool
True
                          , benchmarksRequested :: Bool
benchmarksRequested = Bool
True
                          }

    jailbroken :: HaskellResolver -> HaskellResolver
    jailbroken :: HaskellResolver -> HaskellResolver
jailbroken HaskellResolver
resolver (Dependency PackageName
pkg VersionRange
_ Set LibraryName
_) = HaskellResolver
resolver (PackageName -> VersionRange -> Set LibraryName -> Constraint
Dependency PackageName
pkg VersionRange
anyVersion Set LibraryName
forall a. Monoid a => a
mempty)

    withInternalLibs :: HaskellResolver -> HaskellResolver
    withInternalLibs :: HaskellResolver -> HaskellResolver
withInternalLibs HaskellResolver
resolver Constraint
d = Constraint -> PackageName
depPkgName Constraint
d PackageName -> [PackageName] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [PackageName]
internalNames Bool -> Bool -> Bool
|| HaskellResolver
resolver Constraint
d

    internalNames :: [PackageName]
    internalNames :: [PackageName]
internalNames =    [ UnqualComponentName -> PackageName
unqualComponentNameToPackageName UnqualComponentName
n | (UnqualComponentName
n,CondTree ConfVar [Constraint] Library
_) <- GenericPackageDescription
-> [(UnqualComponentName, CondTree ConfVar [Constraint] Library)]
condSubLibraries GenericPackageDescription
genDesc ]
                    [PackageName] -> [PackageName] -> [PackageName]
forall a. [a] -> [a] -> [a]
++ [ UnqualComponentName -> PackageName
unqualComponentNameToPackageName UnqualComponentName
n | LSubLibName UnqualComponentName
n <- Library -> LibraryName
libName (Library -> LibraryName) -> [Library] -> [LibraryName]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> PackageDescription -> [Library]
subLibraries (GenericPackageDescription -> PackageDescription
packageDescription GenericPackageDescription
genDesc) ]

  in case HaskellResolver
-> Either [Constraint] (PackageDescription, FlagAssignment)
finalize (HaskellResolver -> HaskellResolver
jailbroken (HaskellResolver -> HaskellResolver
withInternalLibs HaskellResolver
haskellResolver)) of
    Left [Constraint]
m -> case HaskellResolver
-> Either [Constraint] (PackageDescription, FlagAssignment)
finalize (Bool -> HaskellResolver
forall a b. a -> b -> a
const Bool
True) of
                Left [Constraint]
_      -> [Char] -> (PackageDescription, [Constraint])
forall a. HasCallStack => [Char] -> a
error ([Char]
"Cabal cannot finalize " [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ PackageIdentifier -> [Char]
forall a. Pretty a => a -> [Char]
display (GenericPackageDescription -> PackageIdentifier
forall pkg. Package pkg => pkg -> PackageIdentifier
packageId GenericPackageDescription
genDesc))
                Right (PackageDescription
d,FlagAssignment
_) -> (PackageDescription
d,[Constraint]
m)
    Right (PackageDescription
d,FlagAssignment
_)  -> (PackageDescription
d,[])

fromPackageDescription :: HaskellResolver -> NixpkgsResolver -> [Dependency] -> FlagAssignment -> PackageDescription -> Derivation
fromPackageDescription :: HaskellResolver
-> NixpkgsResolver
-> [Constraint]
-> FlagAssignment
-> PackageDescription
-> Derivation
fromPackageDescription HaskellResolver
haskellResolver NixpkgsResolver
nixpkgsResolver [Constraint]
missingDeps FlagAssignment
flags PackageDescription {[Char]
[[Char]]
[([Char], [Char])]
[(CompilerFlavor, VersionRange)]
[Benchmark]
[Executable]
[ForeignLib]
[Library]
[TestSuite]
[SourceRepo]
Maybe Library
Maybe SetupBuildInfo
Maybe BuildType
Either License License
Either Version VersionRange
PackageIdentifier
ShortText
specVersionRaw :: PackageDescription -> Either Version VersionRange
package :: PackageDescription -> PackageIdentifier
licenseRaw :: PackageDescription -> Either License License
licenseFiles :: PackageDescription -> [[Char]]
copyright :: PackageDescription -> ShortText
maintainer :: PackageDescription -> ShortText
author :: PackageDescription -> ShortText
stability :: PackageDescription -> ShortText
testedWith :: PackageDescription -> [(CompilerFlavor, VersionRange)]
homepage :: PackageDescription -> ShortText
pkgUrl :: PackageDescription -> ShortText
bugReports :: PackageDescription -> ShortText
sourceRepos :: PackageDescription -> [SourceRepo]
synopsis :: PackageDescription -> ShortText
description :: PackageDescription -> ShortText
category :: PackageDescription -> ShortText
customFieldsPD :: PackageDescription -> [([Char], [Char])]
buildTypeRaw :: PackageDescription -> Maybe BuildType
setupBuildInfo :: PackageDescription -> Maybe SetupBuildInfo
library :: PackageDescription -> Maybe Library
executables :: PackageDescription -> [Executable]
foreignLibs :: PackageDescription -> [ForeignLib]
testSuites :: PackageDescription -> [TestSuite]
benchmarks :: PackageDescription -> [Benchmark]
dataFiles :: PackageDescription -> [[Char]]
dataDir :: PackageDescription -> [Char]
extraSrcFiles :: PackageDescription -> [[Char]]
extraTmpFiles :: PackageDescription -> [[Char]]
extraDocFiles :: PackageDescription -> [[Char]]
extraDocFiles :: [[Char]]
extraTmpFiles :: [[Char]]
extraSrcFiles :: [[Char]]
dataDir :: [Char]
dataFiles :: [[Char]]
benchmarks :: [Benchmark]
testSuites :: [TestSuite]
foreignLibs :: [ForeignLib]
executables :: [Executable]
subLibraries :: [Library]
library :: Maybe Library
setupBuildInfo :: Maybe SetupBuildInfo
buildTypeRaw :: Maybe BuildType
customFieldsPD :: [([Char], [Char])]
category :: ShortText
description :: ShortText
synopsis :: ShortText
sourceRepos :: [SourceRepo]
bugReports :: ShortText
pkgUrl :: ShortText
homepage :: ShortText
testedWith :: [(CompilerFlavor, VersionRange)]
stability :: ShortText
author :: ShortText
maintainer :: ShortText
copyright :: ShortText
licenseFiles :: [[Char]]
licenseRaw :: Either License License
package :: PackageIdentifier
specVersionRaw :: Either Version VersionRange
subLibraries :: PackageDescription -> [Library]
..} = Derivation -> Derivation
normalize (Derivation -> Derivation) -> Derivation -> Derivation
forall a b. (a -> b) -> a -> b
$ Derivation -> Derivation
postProcess (Derivation -> Derivation) -> Derivation -> Derivation
forall a b. (a -> b) -> a -> b
$ Derivation
nullDerivation
    Derivation -> (Derivation -> Derivation) -> Derivation
forall a b. a -> (a -> b) -> b
& (Bool -> Identity Bool) -> Derivation -> Identity Derivation
Lens' Derivation Bool
isLibrary ((Bool -> Identity Bool) -> Derivation -> Identity Derivation)
-> Bool -> Derivation -> Derivation
forall s t a b. ASetter s t a b -> b -> s -> t
.~ Maybe Library -> Bool
forall a. Maybe a -> Bool
isJust Maybe Library
library
    Derivation -> (Derivation -> Derivation) -> Derivation
forall a b. a -> (a -> b) -> b
& (PackageIdentifier -> Identity PackageIdentifier)
-> Derivation -> Identity Derivation
Lens' Derivation PackageIdentifier
pkgid ((PackageIdentifier -> Identity PackageIdentifier)
 -> Derivation -> Identity Derivation)
-> PackageIdentifier -> Derivation -> Derivation
forall s t a b. ASetter s t a b -> b -> s -> t
.~ PackageIdentifier
package
    Derivation -> (Derivation -> Derivation) -> Derivation
forall a b. a -> (a -> b) -> b
& (Int -> Identity Int) -> Derivation -> Identity Derivation
Lens' Derivation Int
revision ((Int -> Identity Int) -> Derivation -> Identity Derivation)
-> Int -> Derivation -> Derivation
forall s t a b. ASetter s t a b -> b -> s -> t
.~ Int
xrev
    Derivation -> (Derivation -> Derivation) -> Derivation
forall a b. a -> (a -> b) -> b
& (Bool -> Identity Bool) -> Derivation -> Identity Derivation
Lens' Derivation Bool
isLibrary ((Bool -> Identity Bool) -> Derivation -> Identity Derivation)
-> Bool -> Derivation -> Derivation
forall s t a b. ASetter s t a b -> b -> s -> t
.~ Maybe Library -> Bool
forall a. Maybe a -> Bool
isJust Maybe Library
library
    Derivation -> (Derivation -> Derivation) -> Derivation
forall a b. a -> (a -> b) -> b
& (Bool -> Identity Bool) -> Derivation -> Identity Derivation
Lens' Derivation Bool
isExecutable ((Bool -> Identity Bool) -> Derivation -> Identity Derivation)
-> Bool -> Derivation -> Derivation
forall s t a b. ASetter s t a b -> b -> s -> t
.~ Bool -> Bool
not ([Executable] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [Executable]
executables)
    Derivation -> (Derivation -> Derivation) -> Derivation
forall a b. a -> (a -> b) -> b
& (Set Binding -> Identity (Set Binding))
-> Derivation -> Identity Derivation
Lens' Derivation (Set Binding)
extraFunctionArgs ((Set Binding -> Identity (Set Binding))
 -> Derivation -> Identity Derivation)
-> Set Binding -> Derivation -> Derivation
forall s t a b. ASetter s t a b -> b -> s -> t
.~ Set Binding
forall a. Monoid a => a
mempty
    Derivation -> (Derivation -> Derivation) -> Derivation
forall a b. a -> (a -> b) -> b
& (Map [Char] [Char] -> Identity (Map [Char] [Char]))
-> Derivation -> Identity Derivation
Lens' Derivation (Map [Char] [Char])
extraAttributes ((Map [Char] [Char] -> Identity (Map [Char] [Char]))
 -> Derivation -> Identity Derivation)
-> Map [Char] [Char] -> Derivation -> Derivation
forall s t a b. ASetter s t a b -> b -> s -> t
.~ Map [Char] [Char]
forall a. Monoid a => a
mempty
    Derivation -> (Derivation -> Derivation) -> Derivation
forall a b. a -> (a -> b) -> b
& (BuildInfo -> Identity BuildInfo)
-> Derivation -> Identity Derivation
Lens' Derivation BuildInfo
libraryDepends ((BuildInfo -> Identity BuildInfo)
 -> Derivation -> Identity Derivation)
-> BuildInfo -> Derivation -> Derivation
forall s t a b. ASetter s t a b -> b -> s -> t
.~ (Library -> BuildInfo) -> [Library] -> BuildInfo
forall (t :: * -> *) m a.
(Foldable t, Monoid m) =>
(a -> m) -> t a -> m
foldMap (BuildInfo -> BuildInfo
convertBuildInfo (BuildInfo -> BuildInfo)
-> (Library -> BuildInfo) -> Library -> BuildInfo
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Library -> BuildInfo
libBuildInfo) (Maybe Library -> [Library]
forall a. Maybe a -> [a]
maybeToList Maybe Library
library [Library] -> [Library] -> [Library]
forall a. [a] -> [a] -> [a]
++ [Library]
subLibraries)
    Derivation -> (Derivation -> Derivation) -> Derivation
forall a b. a -> (a -> b) -> b
& (BuildInfo -> Identity BuildInfo)
-> Derivation -> Identity Derivation
Lens' Derivation BuildInfo
executableDepends ((BuildInfo -> Identity BuildInfo)
 -> Derivation -> Identity Derivation)
-> BuildInfo -> Derivation -> Derivation
forall s t a b. ASetter s t a b -> b -> s -> t
.~ [BuildInfo] -> BuildInfo
forall a. Monoid a => [a] -> a
mconcat ((Executable -> BuildInfo) -> [Executable] -> [BuildInfo]
forall a b. (a -> b) -> [a] -> [b]
map (BuildInfo -> BuildInfo
convertBuildInfo (BuildInfo -> BuildInfo)
-> (Executable -> BuildInfo) -> Executable -> BuildInfo
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Executable -> BuildInfo
buildInfo) [Executable]
executables)
    Derivation -> (Derivation -> Derivation) -> Derivation
forall a b. a -> (a -> b) -> b
& (BuildInfo -> Identity BuildInfo)
-> Derivation -> Identity Derivation
Lens' Derivation BuildInfo
testDepends ((BuildInfo -> Identity BuildInfo)
 -> Derivation -> Identity Derivation)
-> BuildInfo -> Derivation -> Derivation
forall s t a b. ASetter s t a b -> b -> s -> t
.~ [BuildInfo] -> BuildInfo
forall a. Monoid a => [a] -> a
mconcat ((TestSuite -> BuildInfo) -> [TestSuite] -> [BuildInfo]
forall a b. (a -> b) -> [a] -> [b]
map (BuildInfo -> BuildInfo
convertBuildInfo (BuildInfo -> BuildInfo)
-> (TestSuite -> BuildInfo) -> TestSuite -> BuildInfo
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TestSuite -> BuildInfo
testBuildInfo) [TestSuite]
testSuites)
    Derivation -> (Derivation -> Derivation) -> Derivation
forall a b. a -> (a -> b) -> b
& (BuildInfo -> Identity BuildInfo)
-> Derivation -> Identity Derivation
Lens' Derivation BuildInfo
benchmarkDepends ((BuildInfo -> Identity BuildInfo)
 -> Derivation -> Identity Derivation)
-> BuildInfo -> Derivation -> Derivation
forall s t a b. ASetter s t a b -> b -> s -> t
.~ [BuildInfo] -> BuildInfo
forall a. Monoid a => [a] -> a
mconcat ((Benchmark -> BuildInfo) -> [Benchmark] -> [BuildInfo]
forall a b. (a -> b) -> [a] -> [b]
map (BuildInfo -> BuildInfo
convertBuildInfo (BuildInfo -> BuildInfo)
-> (Benchmark -> BuildInfo) -> Benchmark -> BuildInfo
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Benchmark -> BuildInfo
benchmarkBuildInfo) [Benchmark]
benchmarks)
    Derivation -> (Derivation -> Derivation) -> Derivation
forall a b. a -> (a -> b) -> b
& (BuildInfo -> Identity BuildInfo)
-> Derivation -> Identity Derivation
Lens' Derivation BuildInfo
Nix.setupDepends ((BuildInfo -> Identity BuildInfo)
 -> Derivation -> Identity Derivation)
-> BuildInfo -> Derivation -> Derivation
forall s t a b. ASetter s t a b -> b -> s -> t
.~ BuildInfo
-> (SetupBuildInfo -> BuildInfo)
-> Maybe SetupBuildInfo
-> BuildInfo
forall b a. b -> (a -> b) -> Maybe a -> b
maybe BuildInfo
forall a. Monoid a => a
mempty SetupBuildInfo -> BuildInfo
convertSetupBuildInfo Maybe SetupBuildInfo
setupBuildInfo
    Derivation -> (Derivation -> Derivation) -> Derivation
forall a b. a -> (a -> b) -> b
& (Set [Char] -> Identity (Set [Char]))
-> Derivation -> Identity Derivation
Lens' Derivation (Set [Char])
configureFlags ((Set [Char] -> Identity (Set [Char]))
 -> Derivation -> Identity Derivation)
-> Set [Char] -> Derivation -> Derivation
forall s t a b. ASetter s t a b -> b -> s -> t
.~ Set [Char]
forall a. Monoid a => a
mempty
    Derivation -> (Derivation -> Derivation) -> Derivation
forall a b. a -> (a -> b) -> b
& (FlagAssignment -> Identity FlagAssignment)
-> Derivation -> Identity Derivation
Lens' Derivation FlagAssignment
cabalFlags ((FlagAssignment -> Identity FlagAssignment)
 -> Derivation -> Identity Derivation)
-> FlagAssignment -> Derivation -> Derivation
forall s t a b. ASetter s t a b -> b -> s -> t
.~ FlagAssignment
flags
    Derivation -> (Derivation -> Derivation) -> Derivation
forall a b. a -> (a -> b) -> b
& (Bool -> Identity Bool) -> Derivation -> Identity Derivation
Lens' Derivation Bool
runHaddock ((Bool -> Identity Bool) -> Derivation -> Identity Derivation)
-> Bool -> Derivation -> Derivation
forall s t a b. ASetter s t a b -> b -> s -> t
.~ Bool
doHaddockPhase
    Derivation -> (Derivation -> Derivation) -> Derivation
forall a b. a -> (a -> b) -> b
& (Bool -> Identity Bool) -> Derivation -> Identity Derivation
Lens' Derivation Bool
jailbreak ((Bool -> Identity Bool) -> Derivation -> Identity Derivation)
-> Bool -> Derivation -> Derivation
forall s t a b. ASetter s t a b -> b -> s -> t
.~ Bool
False
    Derivation -> (Derivation -> Derivation) -> Derivation
forall a b. a -> (a -> b) -> b
& (Bool -> Identity Bool) -> Derivation -> Identity Derivation
Lens' Derivation Bool
doCheck ((Bool -> Identity Bool) -> Derivation -> Identity Derivation)
-> Bool -> Derivation -> Derivation
forall s t a b. ASetter s t a b -> b -> s -> t
.~ Bool
True
    Derivation -> (Derivation -> Derivation) -> Derivation
forall a b. a -> (a -> b) -> b
& (Bool -> Identity Bool) -> Derivation -> Identity Derivation
Lens' Derivation Bool
doBenchmark ((Bool -> Identity Bool) -> Derivation -> Identity Derivation)
-> Bool -> Derivation -> Derivation
forall s t a b. ASetter s t a b -> b -> s -> t
.~ Bool
False
    Derivation -> (Derivation -> Derivation) -> Derivation
forall a b. a -> (a -> b) -> b
& ([Char] -> Identity [Char]) -> Derivation -> Identity Derivation
Lens' Derivation [Char]
testTarget (([Char] -> Identity [Char]) -> Derivation -> Identity Derivation)
-> [Char] -> Derivation -> Derivation
forall s t a b. ASetter s t a b -> b -> s -> t
.~ [Char]
forall a. Monoid a => a
mempty
    Derivation -> (Derivation -> Derivation) -> Derivation
forall a b. a -> (a -> b) -> b
& (Bool -> Identity Bool) -> Derivation -> Identity Derivation
Lens' Derivation Bool
hyperlinkSource ((Bool -> Identity Bool) -> Derivation -> Identity Derivation)
-> Bool -> Derivation -> Derivation
forall s t a b. ASetter s t a b -> b -> s -> t
.~ Bool
True
    Derivation -> (Derivation -> Derivation) -> Derivation
forall a b. a -> (a -> b) -> b
& (Bool -> Identity Bool) -> Derivation -> Identity Derivation
Lens' Derivation Bool
enableSplitObjs ((Bool -> Identity Bool) -> Derivation -> Identity Derivation)
-> Bool -> Derivation -> Derivation
forall s t a b. ASetter s t a b -> b -> s -> t
.~ Bool
True
    Derivation -> (Derivation -> Derivation) -> Derivation
forall a b. a -> (a -> b) -> b
& (Bool -> Identity Bool) -> Derivation -> Identity Derivation
Lens' Derivation Bool
enableLibraryProfiling ((Bool -> Identity Bool) -> Derivation -> Identity Derivation)
-> Bool -> Derivation -> Derivation
forall s t a b. ASetter s t a b -> b -> s -> t
.~ Bool
False
    Derivation -> (Derivation -> Derivation) -> Derivation
forall a b. a -> (a -> b) -> b
& (Bool -> Identity Bool) -> Derivation -> Identity Derivation
Lens' Derivation Bool
enableExecutableProfiling ((Bool -> Identity Bool) -> Derivation -> Identity Derivation)
-> Bool -> Derivation -> Derivation
forall s t a b. ASetter s t a b -> b -> s -> t
.~ Bool
False
    Derivation -> (Derivation -> Derivation) -> Derivation
forall a b. a -> (a -> b) -> b
& (Bool -> Identity Bool) -> Derivation -> Identity Derivation
Lens' Derivation Bool
enableSeparateDataOutput ((Bool -> Identity Bool) -> Derivation -> Identity Derivation)
-> Bool -> Derivation -> Derivation
forall s t a b. ASetter s t a b -> b -> s -> t
.~ Bool -> Bool
not ([[Char]] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [[Char]]
dataFiles)
    Derivation -> (Derivation -> Derivation) -> Derivation
forall a b. a -> (a -> b) -> b
& ([Char] -> Identity [Char]) -> Derivation -> Identity Derivation
Lens' Derivation [Char]
subpath (([Char] -> Identity [Char]) -> Derivation -> Identity Derivation)
-> [Char] -> Derivation -> Derivation
forall s t a b. ASetter s t a b -> b -> s -> t
.~ [Char]
"."
    Derivation -> (Derivation -> Derivation) -> Derivation
forall a b. a -> (a -> b) -> b
& ([Char] -> Identity [Char]) -> Derivation -> Identity Derivation
Lens' Derivation [Char]
phaseOverrides (([Char] -> Identity [Char]) -> Derivation -> Identity Derivation)
-> [Char] -> Derivation -> Derivation
forall s t a b. ASetter s t a b -> b -> s -> t
.~ [Char]
forall a. Monoid a => a
mempty
    Derivation -> (Derivation -> Derivation) -> Derivation
forall a b. a -> (a -> b) -> b
& ([Char] -> Identity [Char]) -> Derivation -> Identity Derivation
Lens' Derivation [Char]
editedCabalFile (([Char] -> Identity [Char]) -> Derivation -> Identity Derivation)
-> [Char] -> Derivation -> Derivation
forall s t a b. ASetter s t a b -> b -> s -> t
.~ (if Int
xrev Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
0
                             then [Char] -> Maybe [Char] -> [Char]
forall a. a -> Maybe a -> a
fromMaybe ([Char] -> [Char]
forall a. HasCallStack => [Char] -> a
error (PackageIdentifier -> [Char]
forall a. Pretty a => a -> [Char]
display PackageIdentifier
package [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
": X-Cabal-File-Hash field is missing")) ([Char] -> [([Char], [Char])] -> Maybe [Char]
forall a b. Eq a => a -> [(a, b)] -> Maybe b
lookup [Char]
"X-Cabal-File-Hash" [([Char], [Char])]
customFieldsPD)
                             else [Char]
"")
    Derivation -> (Derivation -> Derivation) -> Derivation
forall a b. a -> (a -> b) -> b
& (Meta -> Identity Meta) -> Derivation -> Identity Derivation
Lens' Derivation Meta
metaSection ((Meta -> Identity Meta) -> Derivation -> Identity Derivation)
-> Meta -> Derivation -> Derivation
forall s t a b. ASetter s t a b -> b -> s -> t
.~ ( Meta
Nix.nullMeta
#if MIN_VERSION_Cabal(3,2,0)
                     Meta -> (Meta -> Meta) -> Meta
forall a b. a -> (a -> b) -> b
& ([Char] -> Identity [Char]) -> Meta -> Identity Meta
Lens' Meta [Char]
Nix.homepage (([Char] -> Identity [Char]) -> Meta -> Identity Meta)
-> [Char] -> Meta -> Meta
forall s t a b. ASetter s t a b -> b -> s -> t
.~ [Char] -> [Char]
stripRedundanceSpaces (ShortText -> [Char]
fromShortText ShortText
homepage)
                     Meta -> (Meta -> Meta) -> Meta
forall a b. a -> (a -> b) -> b
& ([Char] -> Identity [Char]) -> Meta -> Identity Meta
Lens' Meta [Char]
Nix.description (([Char] -> Identity [Char]) -> Meta -> Identity Meta)
-> [Char] -> Meta -> Meta
forall s t a b. ASetter s t a b -> b -> s -> t
.~ [Char] -> [Char]
stripRedundanceSpaces (ShortText -> [Char]
fromShortText ShortText
synopsis)
#else
                     & Nix.homepage .~ stripRedundanceSpaces homepage
                     & Nix.description .~ stripRedundanceSpaces synopsis
#endif
                     Meta -> (Meta -> Meta) -> Meta
forall a b. a -> (a -> b) -> b
& (License -> Identity License) -> Meta -> Identity Meta
Lens' Meta License
Nix.license ((License -> Identity License) -> Meta -> Identity Meta)
-> License -> Meta -> Meta
forall s t a b. ASetter s t a b -> b -> s -> t
.~ License
nixLicense
                     Meta -> (Meta -> Meta) -> Meta
forall a b. a -> (a -> b) -> b
& (Set Platform -> Identity (Set Platform)) -> Meta -> Identity Meta
Lens' Meta (Set Platform)
Nix.platforms ((Set Platform -> Identity (Set Platform))
 -> Meta -> Identity Meta)
-> Set Platform -> Meta -> Meta
forall s t a b. ASetter s t a b -> b -> s -> t
.~ Set Platform
Nix.allKnownPlatforms
                     Meta -> (Meta -> Meta) -> Meta
forall a b. a -> (a -> b) -> b
& (Set Platform -> Identity (Set Platform)) -> Meta -> Identity Meta
Lens' Meta (Set Platform)
Nix.hydraPlatforms ((Set Platform -> Identity (Set Platform))
 -> Meta -> Identity Meta)
-> Set Platform -> Meta -> Meta
forall s t a b. ASetter s t a b -> b -> s -> t
.~ (if License -> Bool
isFreeLicense License
nixLicense then Set Platform
Nix.allKnownPlatforms else Set Platform
forall a. Set a
Set.empty)
                     Meta -> (Meta -> Meta) -> Meta
forall a b. a -> (a -> b) -> b
& (Set Identifier -> Identity (Set Identifier))
-> Meta -> Identity Meta
Lens' Meta (Set Identifier)
Nix.maintainers ((Set Identifier -> Identity (Set Identifier))
 -> Meta -> Identity Meta)
-> Set Identifier -> Meta -> Meta
forall s t a b. ASetter s t a b -> b -> s -> t
.~ Set Identifier
forall a. Monoid a => a
mempty
                     Meta -> (Meta -> Meta) -> Meta
forall a b. a -> (a -> b) -> b
& (Bool -> Identity Bool) -> Meta -> Identity Meta
Lens' Meta Bool
Nix.broken ((Bool -> Identity Bool) -> Meta -> Identity Meta)
-> Bool -> Meta -> Meta
forall s t a b. ASetter s t a b -> b -> s -> t
.~ Bool -> Bool
not ([Constraint] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [Constraint]
missingDeps)
                     )
  where
    xrev :: Int
xrev = Int -> ([Char] -> Int) -> Maybe [Char] -> Int
forall b a. b -> (a -> b) -> Maybe a -> b
maybe Int
0 [Char] -> Int
forall a. Read a => [Char] -> a
read ([Char] -> [([Char], [Char])] -> Maybe [Char]
forall a b. Eq a => a -> [(a, b)] -> Maybe b
lookup [Char]
"x-revision" [([Char], [Char])]
customFieldsPD)

    nixLicense :: Nix.License
    nixLicense :: License
nixLicense =  (License -> License)
-> (License -> License) -> Either License License -> License
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either License -> License
fromSPDXLicense License -> License
fromCabalLicense Either License License
licenseRaw

    resolveInHackage :: Identifier -> Binding
    resolveInHackage :: Identifier -> Binding
resolveInHackage Identifier
i | (Identifier
iIdentifier -> Getting [Char] Identifier [Char] -> [Char]
forall s a. s -> Getting a s a -> a
^.Getting [Char] Identifier [Char]
Iso' Identifier [Char]
ident) [Char] -> [[Char]] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [ PackageName -> [Char]
unPackageName PackageName
n | (Dependency PackageName
n VersionRange
_ Set LibraryName
_) <- [Constraint]
missingDeps ] = Identifier -> Binding
bindNull Identifier
i
                       | Bool
otherwise = Tagged (Identifier, Path) (Identity (Identifier, Path))
-> Tagged Binding (Identity Binding)
Iso' Binding (Identifier, Path)
binding (Tagged (Identifier, Path) (Identity (Identifier, Path))
 -> Tagged Binding (Identity Binding))
-> (Identifier, Path) -> Binding
forall t b. AReview t b -> b -> t
# (Identifier
i, Tagged [Identifier] (Identity [Identifier])
-> Tagged Path (Identity Path)
Iso' Path [Identifier]
path (Tagged [Identifier] (Identity [Identifier])
 -> Tagged Path (Identity Path))
-> [Identifier] -> Path
forall t b. AReview t b -> b -> t
# [Identifier
"self",Identifier
i])   -- TODO: "self" shouldn't be hardcoded.

    -- TODO: This is all very confusing. Haskell packages refer to the Nixpkgs
    -- derivation 'foo' as 'pkgs.foo', because they live in the 'haskellPackages'
    -- name space -- not on the top level. Therefore, we built our Nixpkgs lookup
    -- function so that top level names are returned as 'pkgs.foo'. As a result, we
    -- end up pre-pending that path to all kinds of names all over the place. I
    -- suppose the correct approach would be to assume that the lookup function
    -- returns names that live in the top-level and to adapt the code in
    -- PostProcess.hs et all to that fact.
    goodScopes :: Set [Identifier]
    goodScopes :: Set [Identifier]
goodScopes = [[Identifier]] -> Set [Identifier]
forall a. Ord a => [a] -> Set a
Set.fromList (([Identifier] -> [Identifier]) -> [[Identifier]] -> [[Identifier]]
forall a b. (a -> b) -> [a] -> [b]
map (Identifier
"pkgs"Identifier -> [Identifier] -> [Identifier]
forall a. a -> [a] -> [a]
:) [[], [Identifier
"xorg"], [Identifier
"xlibs"], [Identifier
"gnome2"], [Identifier
"gnome"], [Identifier
"gnome3"], [Identifier
"kde4"]])

    resolveInNixpkgs :: Identifier -> Binding
    resolveInNixpkgs :: Identifier -> Binding
resolveInNixpkgs Identifier
i
      | Identifier
i Identifier -> [Identifier] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [Identifier
"clang",Identifier
"lldb",Identifier
"llvm"] = Tagged (Identifier, Path) (Identity (Identifier, Path))
-> Tagged Binding (Identity Binding)
Iso' Binding (Identifier, Path)
binding (Tagged (Identifier, Path) (Identity (Identifier, Path))
 -> Tagged Binding (Identity Binding))
-> (Identifier, Path) -> Binding
forall t b. AReview t b -> b -> t
# (Identifier
i, Tagged [Identifier] (Identity [Identifier])
-> Tagged Path (Identity Path)
Iso' Path [Identifier]
path (Tagged [Identifier] (Identity [Identifier])
 -> Tagged Path (Identity Path))
-> [Identifier] -> Path
forall t b. AReview t b -> b -> t
# [Identifier
"self",Identifier
"llvmPackages",Identifier
i])     -- TODO: evil!
      | Identifier
i Identifier -> Identifier -> Bool
forall a. Eq a => a -> a -> Bool
== Identifier
"gtk2"                      = Tagged (Identifier, Path) (Identity (Identifier, Path))
-> Tagged Binding (Identity Binding)
Iso' Binding (Identifier, Path)
binding (Tagged (Identifier, Path) (Identity (Identifier, Path))
 -> Tagged Binding (Identity Binding))
-> (Identifier, Path) -> Binding
forall t b. AReview t b -> b -> t
# (Identifier
i, Tagged [Identifier] (Identity [Identifier])
-> Tagged Path (Identity Path)
Iso' Path [Identifier]
path (Tagged [Identifier] (Identity [Identifier])
 -> Tagged Path (Identity Path))
-> [Identifier] -> Path
forall t b. AReview t b -> b -> t
# [Identifier
"pkgs",Identifier
"gtk2"])               -- TODO: these cases should not be necessary
      | Identifier
i Identifier -> Identifier -> Bool
forall a. Eq a => a -> a -> Bool
== Identifier
"gtk3"                      = Tagged (Identifier, Path) (Identity (Identifier, Path))
-> Tagged Binding (Identity Binding)
Iso' Binding (Identifier, Path)
binding (Tagged (Identifier, Path) (Identity (Identifier, Path))
 -> Tagged Binding (Identity Binding))
-> (Identifier, Path) -> Binding
forall t b. AReview t b -> b -> t
# (Identifier
i, Tagged [Identifier] (Identity [Identifier])
-> Tagged Path (Identity Path)
Iso' Path [Identifier]
path (Tagged [Identifier] (Identity [Identifier])
 -> Tagged Path (Identity Path))
-> [Identifier] -> Path
forall t b. AReview t b -> b -> t
# [Identifier
"pkgs",Identifier
"gtk3"])
      | Identifier
i Identifier -> Identifier -> Bool
forall a. Eq a => a -> a -> Bool
== Identifier
"gtksourceview3"            = Tagged (Identifier, Path) (Identity (Identifier, Path))
-> Tagged Binding (Identity Binding)
Iso' Binding (Identifier, Path)
binding (Tagged (Identifier, Path) (Identity (Identifier, Path))
 -> Tagged Binding (Identity Binding))
-> (Identifier, Path) -> Binding
forall t b. AReview t b -> b -> t
# (Identifier
i, Tagged [Identifier] (Identity [Identifier])
-> Tagged Path (Identity Path)
Iso' Path [Identifier]
path (Tagged [Identifier] (Identity [Identifier])
 -> Tagged Path (Identity Path))
-> [Identifier] -> Path
forall t b. AReview t b -> b -> t
# [Identifier
"pkgs",Identifier
"gtksourceview3"])
      | Identifier
i Identifier -> Identifier -> Bool
forall a. Eq a => a -> a -> Bool
== Identifier
"vte_291"                   = Tagged (Identifier, Path) (Identity (Identifier, Path))
-> Tagged Binding (Identity Binding)
Iso' Binding (Identifier, Path)
binding (Tagged (Identifier, Path) (Identity (Identifier, Path))
 -> Tagged Binding (Identity Binding))
-> (Identifier, Path) -> Binding
forall t b. AReview t b -> b -> t
# (Identifier
i, Tagged [Identifier] (Identity [Identifier])
-> Tagged Path (Identity Path)
Iso' Path [Identifier]
path (Tagged [Identifier] (Identity [Identifier])
 -> Tagged Path (Identity Path))
-> [Identifier] -> Path
forall t b. AReview t b -> b -> t
# [Identifier
"pkgs",Identifier
"vte"])
      | Just Binding
p <- NixpkgsResolver
nixpkgsResolver Identifier
i, [Identifier] -> [Identifier]
forall a. [a] -> [a]
init (Getting [Identifier] Binding [Identifier]
-> Binding -> [Identifier]
forall s (m :: * -> *) a. MonadReader s m => Getting a s a -> m a
view ((Path -> Const [Identifier] Path)
-> Binding -> Const [Identifier] Binding
Lens' Binding Path
reference ((Path -> Const [Identifier] Path)
 -> Binding -> Const [Identifier] Binding)
-> (([Identifier] -> Const [Identifier] [Identifier])
    -> Path -> Const [Identifier] Path)
-> Getting [Identifier] Binding [Identifier]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ([Identifier] -> Const [Identifier] [Identifier])
-> Path -> Const [Identifier] Path
Iso' Path [Identifier]
path) Binding
p) [Identifier] -> Set [Identifier] -> Bool
forall a. Ord a => a -> Set a -> Bool
`Set.member` Set [Identifier]
goodScopes = Binding
p
      | Bool
otherwise                        = Identifier -> Binding
bindNull Identifier
i

    resolveInHackageThenNixpkgs :: Identifier -> Binding
    resolveInHackageThenNixpkgs :: Identifier -> Binding
resolveInHackageThenNixpkgs Identifier
i | HaskellResolver
haskellResolver (PackageName -> VersionRange -> Set LibraryName -> Constraint
Dependency ([Char] -> PackageName
mkPackageName (Identifier
iIdentifier -> Getting [Char] Identifier [Char] -> [Char]
forall s a. s -> Getting a s a -> a
^.Getting [Char] Identifier [Char]
Iso' Identifier [Char]
ident)) VersionRange
anyVersion Set LibraryName
forall a. Monoid a => a
mempty) = Identifier -> Binding
resolveInHackage Identifier
i
                                  | Bool
otherwise = Identifier -> Binding
resolveInNixpkgs Identifier
i

    internalLibNames :: [PackageName]
    internalLibNames :: [PackageName]
internalLibNames = [ UnqualComponentName -> PackageName
unqualComponentNameToPackageName UnqualComponentName
n | LSubLibName UnqualComponentName
n <- Library -> LibraryName
libName (Library -> LibraryName) -> [Library] -> [LibraryName]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [Library]
subLibraries ]

    doHaddockPhase :: Bool
    doHaddockPhase :: Bool
doHaddockPhase | Bool -> Bool
not ([PackageName] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [PackageName]
internalLibNames) = Bool
False
                   | Just Library
l <- Maybe Library
library           = Bool -> Bool
not ([ModuleName] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null (Library -> [ModuleName]
exposedModules Library
l))
                   | Bool
otherwise                   = Bool
True

    convertBuildInfo :: Cabal.BuildInfo -> Nix.BuildInfo
    convertBuildInfo :: BuildInfo -> BuildInfo
convertBuildInfo Cabal.BuildInfo {Bool
[[Char]]
[([Char], [Char])]
[Language]
[Extension]
[Constraint]
[ExeDependency]
[LegacyExeDependency]
[Mixin]
[ModuleName]
[PkgconfigDependency]
Maybe Language
PerCompilerFlavor [[Char]]
buildable :: BuildInfo -> Bool
buildTools :: BuildInfo -> [LegacyExeDependency]
buildToolDepends :: BuildInfo -> [ExeDependency]
cppOptions :: BuildInfo -> [[Char]]
asmOptions :: BuildInfo -> [[Char]]
cmmOptions :: BuildInfo -> [[Char]]
ccOptions :: BuildInfo -> [[Char]]
cxxOptions :: BuildInfo -> [[Char]]
ldOptions :: BuildInfo -> [[Char]]
pkgconfigDepends :: BuildInfo -> [PkgconfigDependency]
frameworks :: BuildInfo -> [[Char]]
extraFrameworkDirs :: BuildInfo -> [[Char]]
asmSources :: BuildInfo -> [[Char]]
cmmSources :: BuildInfo -> [[Char]]
cSources :: BuildInfo -> [[Char]]
cxxSources :: BuildInfo -> [[Char]]
jsSources :: BuildInfo -> [[Char]]
hsSourceDirs :: BuildInfo -> [[Char]]
otherModules :: BuildInfo -> [ModuleName]
virtualModules :: BuildInfo -> [ModuleName]
autogenModules :: BuildInfo -> [ModuleName]
defaultLanguage :: BuildInfo -> Maybe Language
otherLanguages :: BuildInfo -> [Language]
defaultExtensions :: BuildInfo -> [Extension]
otherExtensions :: BuildInfo -> [Extension]
oldExtensions :: BuildInfo -> [Extension]
extraLibs :: BuildInfo -> [[Char]]
extraGHCiLibs :: BuildInfo -> [[Char]]
extraBundledLibs :: BuildInfo -> [[Char]]
extraLibFlavours :: BuildInfo -> [[Char]]
extraDynLibFlavours :: BuildInfo -> [[Char]]
extraLibDirs :: BuildInfo -> [[Char]]
includeDirs :: BuildInfo -> [[Char]]
includes :: BuildInfo -> [[Char]]
autogenIncludes :: BuildInfo -> [[Char]]
installIncludes :: BuildInfo -> [[Char]]
options :: BuildInfo -> PerCompilerFlavor [[Char]]
profOptions :: BuildInfo -> PerCompilerFlavor [[Char]]
sharedOptions :: BuildInfo -> PerCompilerFlavor [[Char]]
staticOptions :: BuildInfo -> PerCompilerFlavor [[Char]]
customFieldsBI :: BuildInfo -> [([Char], [Char])]
targetBuildDepends :: BuildInfo -> [Constraint]
mixins :: BuildInfo -> [Mixin]
mixins :: [Mixin]
targetBuildDepends :: [Constraint]
customFieldsBI :: [([Char], [Char])]
staticOptions :: PerCompilerFlavor [[Char]]
sharedOptions :: PerCompilerFlavor [[Char]]
profOptions :: PerCompilerFlavor [[Char]]
options :: PerCompilerFlavor [[Char]]
installIncludes :: [[Char]]
autogenIncludes :: [[Char]]
includes :: [[Char]]
includeDirs :: [[Char]]
extraLibDirs :: [[Char]]
extraDynLibFlavours :: [[Char]]
extraLibFlavours :: [[Char]]
extraBundledLibs :: [[Char]]
extraGHCiLibs :: [[Char]]
extraLibs :: [[Char]]
oldExtensions :: [Extension]
otherExtensions :: [Extension]
defaultExtensions :: [Extension]
otherLanguages :: [Language]
defaultLanguage :: Maybe Language
autogenModules :: [ModuleName]
virtualModules :: [ModuleName]
otherModules :: [ModuleName]
hsSourceDirs :: [[Char]]
jsSources :: [[Char]]
cxxSources :: [[Char]]
cSources :: [[Char]]
cmmSources :: [[Char]]
asmSources :: [[Char]]
extraFrameworkDirs :: [[Char]]
frameworks :: [[Char]]
pkgconfigDepends :: [PkgconfigDependency]
ldOptions :: [[Char]]
cxxOptions :: [[Char]]
ccOptions :: [[Char]]
cmmOptions :: [[Char]]
asmOptions :: [[Char]]
cppOptions :: [[Char]]
buildToolDepends :: [ExeDependency]
buildTools :: [LegacyExeDependency]
buildable :: Bool
..} | Bool -> Bool
not Bool
buildable = BuildInfo
forall a. Monoid a => a
mempty
    convertBuildInfo Cabal.BuildInfo {Bool
[[Char]]
[([Char], [Char])]
[Language]
[Extension]
[Constraint]
[ExeDependency]
[LegacyExeDependency]
[Mixin]
[ModuleName]
[PkgconfigDependency]
Maybe Language
PerCompilerFlavor [[Char]]
mixins :: [Mixin]
targetBuildDepends :: [Constraint]
customFieldsBI :: [([Char], [Char])]
staticOptions :: PerCompilerFlavor [[Char]]
sharedOptions :: PerCompilerFlavor [[Char]]
profOptions :: PerCompilerFlavor [[Char]]
options :: PerCompilerFlavor [[Char]]
installIncludes :: [[Char]]
autogenIncludes :: [[Char]]
includes :: [[Char]]
includeDirs :: [[Char]]
extraLibDirs :: [[Char]]
extraDynLibFlavours :: [[Char]]
extraLibFlavours :: [[Char]]
extraBundledLibs :: [[Char]]
extraGHCiLibs :: [[Char]]
extraLibs :: [[Char]]
oldExtensions :: [Extension]
otherExtensions :: [Extension]
defaultExtensions :: [Extension]
otherLanguages :: [Language]
defaultLanguage :: Maybe Language
autogenModules :: [ModuleName]
virtualModules :: [ModuleName]
otherModules :: [ModuleName]
hsSourceDirs :: [[Char]]
jsSources :: [[Char]]
cxxSources :: [[Char]]
cSources :: [[Char]]
cmmSources :: [[Char]]
asmSources :: [[Char]]
extraFrameworkDirs :: [[Char]]
frameworks :: [[Char]]
pkgconfigDepends :: [PkgconfigDependency]
ldOptions :: [[Char]]
cxxOptions :: [[Char]]
ccOptions :: [[Char]]
cmmOptions :: [[Char]]
asmOptions :: [[Char]]
cppOptions :: [[Char]]
buildToolDepends :: [ExeDependency]
buildTools :: [LegacyExeDependency]
buildable :: Bool
buildable :: BuildInfo -> Bool
buildTools :: BuildInfo -> [LegacyExeDependency]
buildToolDepends :: BuildInfo -> [ExeDependency]
cppOptions :: BuildInfo -> [[Char]]
asmOptions :: BuildInfo -> [[Char]]
cmmOptions :: BuildInfo -> [[Char]]
ccOptions :: BuildInfo -> [[Char]]
cxxOptions :: BuildInfo -> [[Char]]
ldOptions :: BuildInfo -> [[Char]]
pkgconfigDepends :: BuildInfo -> [PkgconfigDependency]
frameworks :: BuildInfo -> [[Char]]
extraFrameworkDirs :: BuildInfo -> [[Char]]
asmSources :: BuildInfo -> [[Char]]
cmmSources :: BuildInfo -> [[Char]]
cSources :: BuildInfo -> [[Char]]
cxxSources :: BuildInfo -> [[Char]]
jsSources :: BuildInfo -> [[Char]]
hsSourceDirs :: BuildInfo -> [[Char]]
otherModules :: BuildInfo -> [ModuleName]
virtualModules :: BuildInfo -> [ModuleName]
autogenModules :: BuildInfo -> [ModuleName]
defaultLanguage :: BuildInfo -> Maybe Language
otherLanguages :: BuildInfo -> [Language]
defaultExtensions :: BuildInfo -> [Extension]
otherExtensions :: BuildInfo -> [Extension]
oldExtensions :: BuildInfo -> [Extension]
extraLibs :: BuildInfo -> [[Char]]
extraGHCiLibs :: BuildInfo -> [[Char]]
extraBundledLibs :: BuildInfo -> [[Char]]
extraLibFlavours :: BuildInfo -> [[Char]]
extraDynLibFlavours :: BuildInfo -> [[Char]]
extraLibDirs :: BuildInfo -> [[Char]]
includeDirs :: BuildInfo -> [[Char]]
includes :: BuildInfo -> [[Char]]
autogenIncludes :: BuildInfo -> [[Char]]
installIncludes :: BuildInfo -> [[Char]]
options :: BuildInfo -> PerCompilerFlavor [[Char]]
profOptions :: BuildInfo -> PerCompilerFlavor [[Char]]
sharedOptions :: BuildInfo -> PerCompilerFlavor [[Char]]
staticOptions :: BuildInfo -> PerCompilerFlavor [[Char]]
customFieldsBI :: BuildInfo -> [([Char], [Char])]
targetBuildDepends :: BuildInfo -> [Constraint]
mixins :: BuildInfo -> [Mixin]
..} = BuildInfo
forall a. Monoid a => a
mempty
      BuildInfo -> (BuildInfo -> BuildInfo) -> BuildInfo
forall a b. a -> (a -> b) -> b
& (Set Binding -> Identity (Set Binding))
-> BuildInfo -> Identity BuildInfo
Lens' BuildInfo (Set Binding)
haskell ((Set Binding -> Identity (Set Binding))
 -> BuildInfo -> Identity BuildInfo)
-> Set Binding -> BuildInfo -> BuildInfo
forall s t a b. ASetter s t a b -> b -> s -> t
.~ [Binding] -> Set Binding
forall a. Ord a => [a] -> Set a
Set.fromList [ Identifier -> Binding
resolveInHackage (PackageName -> Identifier
toNixName PackageName
x) | (Dependency PackageName
x VersionRange
_ Set LibraryName
_) <- [Constraint]
targetBuildDepends, PackageName
x PackageName -> [PackageName] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`notElem` [PackageName]
internalLibNames ]
      BuildInfo -> (BuildInfo -> BuildInfo) -> BuildInfo
forall a b. a -> (a -> b) -> b
& (Set Binding -> Identity (Set Binding))
-> BuildInfo -> Identity BuildInfo
Lens' BuildInfo (Set Binding)
system ((Set Binding -> Identity (Set Binding))
 -> BuildInfo -> Identity BuildInfo)
-> Set Binding -> BuildInfo -> BuildInfo
forall s t a b. ASetter s t a b -> b -> s -> t
.~ [Binding] -> Set Binding
forall a. Ord a => [a] -> Set a
Set.fromList [ Identifier -> Binding
resolveInNixpkgs Identifier
y | [Char]
x <- [[Char]]
extraLibs, Identifier
y <- [Char] -> [Identifier]
libNixName [Char]
x ]
      BuildInfo -> (BuildInfo -> BuildInfo) -> BuildInfo
forall a b. a -> (a -> b) -> b
& (Set Binding -> Identity (Set Binding))
-> BuildInfo -> Identity BuildInfo
Lens' BuildInfo (Set Binding)
pkgconfig ((Set Binding -> Identity (Set Binding))
 -> BuildInfo -> Identity BuildInfo)
-> Set Binding -> BuildInfo -> BuildInfo
forall s t a b. ASetter s t a b -> b -> s -> t
.~ [Binding] -> Set Binding
forall a. Ord a => [a] -> Set a
Set.fromList [ Identifier -> Binding
resolveInNixpkgs Identifier
y | PkgconfigDependency PkgconfigName
x PkgconfigVersionRange
_ <- [PkgconfigDependency]
pkgconfigDepends, Identifier
y <- [Char] -> [Identifier]
libNixName (PkgconfigName -> [Char]
unPkgconfigName PkgconfigName
x) ]
      BuildInfo -> (BuildInfo -> BuildInfo) -> BuildInfo
forall a b. a -> (a -> b) -> b
& (Set Binding -> Identity (Set Binding))
-> BuildInfo -> Identity BuildInfo
Lens' BuildInfo (Set Binding)
tool ((Set Binding -> Identity (Set Binding))
 -> BuildInfo -> Identity BuildInfo)
-> Set Binding -> BuildInfo -> BuildInfo
forall s t a b. ASetter s t a b -> b -> s -> t
.~ [Binding] -> Set Binding
forall a. Ord a => [a] -> Set a
Set.fromList ((Identifier -> Binding) -> [Identifier] -> [Binding]
forall a b. (a -> b) -> [a] -> [b]
map Identifier -> Binding
resolveInHackageThenNixpkgs ([Identifier] -> [Binding])
-> ([[Char]] -> [Identifier]) -> [[Char]] -> [Binding]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ([Char] -> [Identifier]) -> [[Char]] -> [Identifier]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap [Char] -> [Identifier]
buildToolNixName
              ([[Char]] -> [Binding]) -> [[Char]] -> [Binding]
forall a b. (a -> b) -> a -> b
$ [ PackageName -> [Char]
unPackageName PackageName
x | ExeDependency PackageName
x UnqualComponentName
_ VersionRange
_ <- [ExeDependency]
buildToolDepends ] [[Char]] -> [[Char]] -> [[Char]]
forall a. [a] -> [a] -> [a]
++ [ [Char]
x | LegacyExeDependency [Char]
x VersionRange
_ <- [LegacyExeDependency]
buildTools ])

    convertSetupBuildInfo :: Cabal.SetupBuildInfo -> Nix.BuildInfo
    convertSetupBuildInfo :: SetupBuildInfo -> BuildInfo
convertSetupBuildInfo SetupBuildInfo
bi = BuildInfo
forall a. Monoid a => a
mempty
      BuildInfo -> (BuildInfo -> BuildInfo) -> BuildInfo
forall a b. a -> (a -> b) -> b
& (Set Binding -> Identity (Set Binding))
-> BuildInfo -> Identity BuildInfo
Lens' BuildInfo (Set Binding)
haskell ((Set Binding -> Identity (Set Binding))
 -> BuildInfo -> Identity BuildInfo)
-> Set Binding -> BuildInfo -> BuildInfo
forall s t a b. ASetter s t a b -> b -> s -> t
.~ [Binding] -> Set Binding
forall a. Ord a => [a] -> Set a
Set.fromList [ Identifier -> Binding
resolveInHackage (PackageName -> Identifier
toNixName PackageName
x) | (Dependency PackageName
x VersionRange
_ Set LibraryName
_) <- SetupBuildInfo -> [Constraint]
Cabal.setupDepends SetupBuildInfo
bi ]

bindNull :: Identifier -> Binding
bindNull :: Identifier -> Binding
bindNull Identifier
i = Tagged (Identifier, Path) (Identity (Identifier, Path))
-> Tagged Binding (Identity Binding)
Iso' Binding (Identifier, Path)
binding (Tagged (Identifier, Path) (Identity (Identifier, Path))
 -> Tagged Binding (Identity Binding))
-> (Identifier, Path) -> Binding
forall t b. AReview t b -> b -> t
# (Identifier
i, Tagged [Identifier] (Identity [Identifier])
-> Tagged Path (Identity Path)
Iso' Path [Identifier]
path (Tagged [Identifier] (Identity [Identifier])
 -> Tagged Path (Identity Path))
-> [Identifier] -> Path
forall t b. AReview t b -> b -> t
# [Identifier
"null"])

stripRedundanceSpaces :: String -> String
stripRedundanceSpaces :: [Char] -> [Char]
stripRedundanceSpaces = [[Char]] -> [Char]
unwords ([[Char]] -> [Char]) -> ([Char] -> [[Char]]) -> [Char] -> [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Char] -> [[Char]]
words