@@ -11,6 +11,7 @@ import Distribution.Pretty (pretty)
11
11
import Data.Char (toUpper )
12
12
import System.FilePath
13
13
import Data.ByteString (ByteString )
14
+ import Data.Maybe (catMaybes )
14
15
15
16
import Distribution.Types.CondTree
16
17
import Distribution.Types.Library
@@ -23,16 +24,17 @@ import Distribution.Types.PkgconfigDependency
23
24
import Distribution.Types.PkgconfigName
24
25
import Distribution.Types.VersionRange
25
26
import Distribution.Compiler
26
- import Distribution.Types.PackageName (PackageName )
27
- import Distribution.Simple.BuildToolDepends (getAllToolDependencies )
27
+ import Distribution.Types.PackageName (PackageName , mkPackageName )
28
+ import Distribution.Simple.BuildToolDepends (desugarBuildTool )
28
29
29
- import Data.String (fromString )
30
+ import Data.String (fromString , IsString )
30
31
31
32
-- import Distribution.Types.GenericPackageDescription
32
33
-- import Distribution.Types.PackageDescription
33
34
import Distribution.Types.PackageId
34
35
-- import Distribution.Types.Condition
35
36
import Distribution.Types.UnqualComponentName
37
+ import Data.List.NonEmpty (NonEmpty (.. ))
36
38
import Nix.Expr
37
39
import Data.Fix (Fix (.. ))
38
40
import Data.Text (Text )
@@ -44,7 +46,7 @@ data Src
44
46
| Git String String (Maybe String ) (Maybe String )
45
47
deriving Show
46
48
47
- pkgs , hsPkgs , flags :: Text
49
+ pkgs , hsPkgs , pkgconfPkgs , flags :: Text
48
50
pkgs = " pkgs"
49
51
hsPkgs = " hsPkgs"
50
52
pkgconfPkgs = " pkgconfPkgs"
@@ -76,11 +78,11 @@ genExtra Hpack = mkNonRecSet [ "cabal-generator" $= mkStr "hpack" ]
76
78
77
79
cabal2nix :: Maybe Src -> CabalFile -> IO NExpr
78
80
cabal2nix src = \ case
79
- (OnDisk path) -> fmap ( gpd2nix src Nothing )
80
- $ readGenericPackageDescription normal path
81
- (InMemory gen _ body) -> fmap ( gpd2nix src (genExtra <$> gen) )
82
- $ case ( runParseResult (parseGenericPackageDescription body) ) of
83
- (_, Left (_, err)) -> ( error (" Failed to parse in-memory cabal file: " ++ show err) )
81
+ (OnDisk path) -> gpd2nix src Nothing
82
+ <$> readGenericPackageDescription normal path
83
+ (InMemory gen _ body) -> gpd2nix src (genExtra <$> gen)
84
+ <$> case runParseResult (parseGenericPackageDescription body) of
85
+ (_, Left (_, err)) -> error (" Failed to parse in-memory cabal file: " ++ show err)
84
86
(_, Right desc) -> pure desc
85
87
86
88
gpd2nix :: Maybe Src -> Maybe NExpr -> GenericPackageDescription -> NExpr
@@ -118,7 +120,7 @@ shakeTree :: (Foldable t, Foldable f) => CondTree v (t c) (f a) -> Maybe (CondTr
118
120
shakeTree (CondNode d c bs) = case (null d, null bs') of
119
121
(True , True ) -> Nothing
120
122
_ -> Just (CondNode d c bs')
121
- where bs' = [b | Just b <- shakeBranch <$> bs ]
123
+ where bs' = catMaybes ( shakeBranch <$> bs)
122
124
123
125
shakeBranch :: (Foldable t , Foldable f ) => CondBranch v (t c ) (f a ) -> Maybe (CondBranch v (t c ) (f a ))
124
126
shakeBranch (CondBranch c t f) = case (shakeTree t, f >>= shakeTree) of
@@ -129,7 +131,7 @@ shakeBranch (CondBranch c t f) = case (shakeTree t, f >>= shakeTree) of
129
131
--- String helper
130
132
transformFst :: (Char -> Char ) -> String -> String
131
133
transformFst _ [] = []
132
- transformFst f (x: xs) = ( f x) : xs
134
+ transformFst f (x: xs) = f x : xs
133
135
capitalize :: String -> String
134
136
capitalize = transformFst toUpper
135
137
@@ -165,21 +167,23 @@ instance ToNixExpr PackageIdentifier where
165
167
, " version" $= mkStr (fromString (show (disp (pkgVersion ident))))]
166
168
167
169
instance ToNixExpr PackageDescription where
168
- toNix pd = mkNonRecSet [ " specVersion" $= mkStr (fromString (show (disp (specVersion pd))))
169
- , " identifier" $= toNix (package pd)
170
- , " license" $= mkStr (fromString (show (pretty (license pd))))
170
+ toNix pd = mkNonRecSet $ [ " specVersion" $= mkStr (fromString (show (disp (specVersion pd))))
171
+ , " identifier" $= toNix (package pd)
172
+ , " license" $= mkStr (fromString (show (pretty (license pd))))
171
173
172
- , " copyright" $= mkStr (fromString (copyright pd))
173
- , " maintainer" $= mkStr (fromString (maintainer pd))
174
- , " author" $= mkStr (fromString (author pd))
174
+ , " copyright" $= mkStr (fromString (copyright pd))
175
+ , " maintainer" $= mkStr (fromString (maintainer pd))
176
+ , " author" $= mkStr (fromString (author pd))
175
177
176
- , " homepage" $= mkStr (fromString (homepage pd))
177
- , " url" $= mkStr (fromString (pkgUrl pd))
178
+ , " homepage" $= mkStr (fromString (homepage pd))
179
+ , " url" $= mkStr (fromString (pkgUrl pd))
178
180
179
- , " synopsis" $= mkStr (fromString (synopsis pd))
180
- , " description" $= mkStr (fromString (description pd))
181
+ , " synopsis" $= mkStr (fromString (synopsis pd))
182
+ , " description" $= mkStr (fromString (description pd))
181
183
182
- , " buildType" $= mkStr (fromString (show (pretty (buildType pd)))) ]
184
+ , " buildType" $= mkStr (fromString (show (pretty (buildType pd))))
185
+ ] ++
186
+ [ " setup-depends" $= toNix (BuildToolDependency . depPkgName <$> deps) | Just deps <- [setupDepends <$> setupBuildInfo pd ]]
183
187
184
188
newtype SysDependency = SysDependency { unSysDependency :: String } deriving (Show , Eq , Ord )
185
189
newtype BuildToolDependency = BuildToolDependency { unBuildToolDependency :: PackageName } deriving (Show , Eq , Ord )
@@ -188,10 +192,11 @@ mkSysDep :: String -> SysDependency
188
192
mkSysDep = SysDependency
189
193
190
194
instance ToNixExpr GenericPackageDescription where
191
- toNix gpd = mkNonRecSet $ [ " flags" $= (mkNonRecSet . fmap toNixBinding $ genPackageFlags gpd)
192
- , " package" $= (toNix (packageDescription gpd))
193
- , " components" $= components ]
194
- where packageName = fromString . show . disp . pkgName . package . packageDescription $ gpd
195
+ toNix gpd = mkNonRecSet [ " flags" $= (mkNonRecSet . fmap toNixBinding $ genPackageFlags gpd)
196
+ , " package" $= toNix (packageDescription gpd)
197
+ , " components" $= components ]
198
+ where _packageName :: IsString a => a
199
+ _packageName = fromString . show . disp . pkgName . package . packageDescription $ gpd
195
200
component unQualName comp
196
201
= quoted name $=
197
202
mkNonRecSet ([ " depends" $= toNix deps | Just deps <- [shakeTree . fmap ( targetBuildDepends . getBuildInfo) $ comp ] ] ++
@@ -200,7 +205,12 @@ instance ToNixExpr GenericPackageDescription where
200
205
[ " pkgconfig" $= toNix deps | Just deps <- [shakeTree . fmap ( pkgconfigDepends . getBuildInfo) $ comp ] ] ++
201
206
[ " build-tools" $= toNix deps | Just deps <- [shakeTree . fmap ( toolDeps . getBuildInfo) $ comp ] ])
202
207
where name = fromString $ unUnqualComponentName unQualName
203
- toolDeps bi = [ BuildToolDependency pkg | ExeDependency pkg _ _ <- getAllToolDependencies (packageDescription gpd) bi ]
208
+ toolDeps = getToolDependencies (packageDescription gpd)
209
+ toBuildToolDep (ExeDependency pkg _ _) = BuildToolDependency pkg
210
+ getToolDependencies pkg bi =
211
+ map toBuildToolDep (buildToolDepends bi)
212
+ <> map (\ led -> maybe (guess led) toBuildToolDep $ desugarBuildTool pkg led) (buildTools bi)
213
+ guess (LegacyExeDependency n _) = BuildToolDependency (mkPackageName n)
204
214
components = mkNonRecSet $
205
215
[ component " library" lib | Just lib <- [condLibrary gpd] ] ++
206
216
(bindTo " sublibs" . mkNonRecSet <$> filter (not . null ) [ uncurry component <$> condSubLibraries gpd ]) ++
@@ -219,10 +229,17 @@ instance ToNixExpr PkgconfigDependency where
219
229
toNix (PkgconfigDependency name _versionRange)= (@.) (mkSym pkgconfPkgs) . quoted . fromString . unPkgconfigName $ name
220
230
221
231
instance ToNixExpr ExeDependency where
222
- toNix (ExeDependency pkgName _unqualCompName _versionRange) = mkSym . fromString . show . pretty $ pkgName
232
+ toNix (ExeDependency pkgName' _unqualCompName _versionRange) = mkSym . fromString . show . pretty $ pkgName'
223
233
224
234
instance ToNixExpr BuildToolDependency where
225
- toNix (BuildToolDependency pkgName) = mkSym hsPkgs @. " buildPackages" @. (fromString . show . pretty $ pkgName)
235
+ toNix (BuildToolDependency pkgName') =
236
+ -- TODO once https://github.com/haskell-nix/hnix/issues/52
237
+ -- is reolved use something like:
238
+ -- [nix| hsPkgs.buildPackages.$((pkgName)) or pkgs.buildPackages.$((pkgName)) ]
239
+ Fix $ NSelect (mkSym hsPkgs) buildPackagesDotName
240
+ (Just . Fix $ NSelect (mkSym pkgs) buildPackagesDotName Nothing )
241
+ where
242
+ buildPackagesDotName = StaticKey " buildPackages" :| [StaticKey (fromString . show . pretty $ pkgName')]
226
243
227
244
instance ToNixExpr LegacyExeDependency where
228
245
toNix (LegacyExeDependency name _versionRange) = mkSym hsPkgs @. fromString name
@@ -237,22 +254,22 @@ instance ToNixExpr ConfVar where
237
254
toNix (OS os) = mkSym " system" @. (fromString . (" is" ++ ) . capitalize . show . pretty $ os)
238
255
toNix (Arch arch) = mkSym " system" @. (fromString . (" is" ++ ) . capitalize . show . pretty $ arch)
239
256
toNix (Flag flag) = mkSym flags @. (fromString . show . pretty $ flag)
240
- toNix (Impl flavour range) = toNix flavour $&& toNix range
257
+ toNix (Impl flavour range) = toNix flavour $&& toNix (projectVersionRange range)
241
258
242
259
instance ToNixExpr CompilerFlavor where
243
260
toNix flavour = mkSym " compiler" @. (fromString . (" is" ++ ) . capitalize . show . pretty $ flavour)
244
261
245
- instance ToNixExpr VersionRange where
246
- toNix AnyVersion = mkBool True
247
- toNix (ThisVersion ver) = mkSym " compiler" @. " version" @. " eq" @@ mkStr (fromString (show (disp ver)))
248
- toNix (LaterVersion ver) = mkSym " compiler" @. " version" @. " gt" @@ mkStr (fromString (show (disp ver)))
249
- toNix (OrLaterVersion ver) = mkSym " compiler" @. " version" @. " ge" @@ mkStr (fromString (show (disp ver)))
250
- toNix (EarlierVersion ver) = mkSym " compiler" @. " version" @. " lt" @@ mkStr (fromString (show (disp ver)))
251
- toNix (OrEarlierVersion ver) = mkSym " compiler" @. " version" @. " le" @@ mkStr (fromString (show (disp ver)))
252
- toNix (WildcardVersion ver ) = mkBool False
253
- -- toNix (MajorBoundVersion ver) = mkSym "compiler" @. "version" @. "eq" @@ mkStr (fromString (show (disp ver)))
254
- toNix (IntersectVersionRanges v1 v2) = toNix v1 $&& toNix v2
255
- toNix x = error $ " ToNixExpr VersionRange for `" ++ ( show x) ++ " ` not implemented!"
262
+ instance ToNixExpr ( VersionRangeF VersionRange ) where
263
+ toNix AnyVersionF = mkBool True
264
+ toNix (ThisVersionF ver) = mkSym " compiler" @. " version" @. " eq" @@ mkStr (fromString (show (disp ver)))
265
+ toNix (LaterVersionF ver) = mkSym " compiler" @. " version" @. " gt" @@ mkStr (fromString (show (disp ver)))
266
+ toNix (OrLaterVersionF ver) = mkSym " compiler" @. " version" @. " ge" @@ mkStr (fromString (show (disp ver)))
267
+ toNix (EarlierVersionF ver) = mkSym " compiler" @. " version" @. " lt" @@ mkStr (fromString (show (disp ver)))
268
+ toNix (OrEarlierVersionF ver) = mkSym " compiler" @. " version" @. " le" @@ mkStr (fromString (show (disp ver)))
269
+ toNix (WildcardVersionF _ver ) = mkBool False
270
+ -- toNix (MajorBoundVersionF ver) = mkSym "compiler" @. "version" @. "eq" @@ mkStr (fromString (show (disp ver)))
271
+ toNix (IntersectVersionRangesF v1 v2) = toNix (projectVersionRange v1) $&& toNix (projectVersionRange v2)
272
+ toNix x = error $ " ToNixExpr VersionRange for `" ++ show x ++ " ` not implemented!"
256
273
257
274
instance ToNixExpr a => ToNixExpr (Condition a ) where
258
275
toNix (Var a) = toNix a
0 commit comments