Skip to content

Commit c9c10ab

Browse files
authored
Use Cabal 3.4 (input-output-hk#103)
* Also fixes dependencies on sublibs
1 parent 65cbd10 commit c9c10ab

File tree

4 files changed

+51
-18
lines changed

4 files changed

+51
-18
lines changed

cabal.project

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
1-
index-state: 2021-02-08T00:00:00Z
1+
index-state: 2021-02-25T00:00:00Z
22

33
packages: .
44

55
source-repository-package
66
type: git
77
location: https://github.com/hamishmack/hackage-db.git
8-
tag: 3f12730c0d6092efce142cad87264e7b7eb2b05a
9-
--sha256: 13nl8swdd3g1rh14f29v6nhnzaxgc8l70vs6hviw8qgdpbxvhs45
8+
tag: 173783814c9e2d7b80d5d4b5a628334361a0b34a
9+
--sha256: sha256-T6cKhYvCaWua6S87PYo6LrOvhg2JGjdjm2XLan9300Y=
1010

1111
-- hnix requires hnix-store-core < 0.2, however hnix-store-core-0.1 breaks
1212
-- plan construction.

lib/Cabal2Nix.hs

Lines changed: 44 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
{-# LANGUAGE LambdaCase #-}
22
{-# LANGUAGE OverloadedStrings #-}
33
{-# LANGUAGE FlexibleInstances #-}
4+
{-# LANGUAGE ScopedTypeVariables #-}
45

56
module Cabal2Nix (cabal2nix, gpd2nix, Src(..), CabalFile(..), CabalFileGenerator(..), cabalFilePath, cabalFilePkgName, CabalDetailLevel(..)) where
67

@@ -12,6 +13,7 @@ import Data.Char (toUpper)
1213
import System.FilePath
1314
import Data.ByteString (ByteString)
1415
import Data.Maybe (catMaybes, maybeToList)
16+
import Data.Foldable (toList)
1517

1618
import Distribution.Types.CondTree
1719
import Distribution.Types.Library
@@ -22,7 +24,9 @@ import Distribution.Types.ExeDependency
2224
import Distribution.Types.LegacyExeDependency
2325
import Distribution.Types.PkgconfigDependency
2426
import Distribution.Types.PkgconfigName
27+
import Distribution.Types.Version
2528
import Distribution.Types.VersionRange
29+
import Distribution.CabalSpecVersion
2630
import Distribution.Compiler
2731
import Distribution.Types.PackageName (PackageName, mkPackageName, unPackageName)
2832
import Distribution.Simple.BuildToolDepends (desugarBuildTool)
@@ -181,7 +185,7 @@ instance ToNixExpr PackageIdentifier where
181185

182186
toNixPackageDescription :: Bool -> CabalDetailLevel -> PackageDescription -> NExpr
183187
toNixPackageDescription isLocal detailLevel pd = mkNonRecSet $
184-
[ "specVersion" $= mkStr (fromString (show (pretty (specVersion pd))))
188+
[ "specVersion" $= mkStr (fromString (showCabalSpecVersion (specVersion pd)))
185189
, "identifier" $= toNix (package pd)
186190
, "license" $= mkStr (fromString (show (pretty (license pd))))
187191

@@ -199,7 +203,7 @@ toNixPackageDescription isLocal detailLevel pd = mkNonRecSet $
199203
] ++
200204
[ "isLocal" $= mkBool True | isLocal
201205
] ++
202-
[ "setup-depends" $= toNix (SetupDependency . depPkgName <$> deps) | Just deps <- [setupDepends <$> setupBuildInfo pd ]] ++
206+
[ "setup-depends" $= toNix deps | Just deps <- [(>>= toSetupDepends) . setupDepends <$> setupBuildInfo pd ]] ++
203207
if detailLevel == MinimalDetails
204208
then []
205209
else
@@ -211,6 +215,8 @@ toNixPackageDescription isLocal detailLevel pd = mkNonRecSet $
211215
, "extraTmpFiles" $= toNix (extraTmpFiles pd)
212216
, "extraDocFiles" $= toNix (extraDocFiles pd)
213217
]
218+
where
219+
toSetupDepends (Dependency pkg _ libs) = SetupDependency pkg <$> toList libs
214220

215221
srcToNix :: PackageIdentifier -> Src -> NExpr
216222
srcToNix _ (Path p) = mkRecSet [ "src" $= applyMkDefault (mkRelPath p) ]
@@ -242,7 +248,8 @@ mkPrivateHackageUrl hackageUrl pi' =
242248
pkgNameVersion = unPackageName (pkgName pi') <> "-" <> show (pretty (pkgVersion pi'))
243249

244250
newtype SysDependency = SysDependency { unSysDependency :: String } deriving (Show, Eq, Ord)
245-
newtype SetupDependency = SetupDependency { unSetupDependency :: PackageName } deriving (Show, Eq, Ord)
251+
data SetupDependency = SetupDependency PackageName LibraryName deriving (Show, Eq, Ord)
252+
data HaskellLibDependency = HaskellLibDependency PackageName LibraryName deriving (Show, Eq, Ord)
246253
data BuildToolDependency = BuildToolDependency PackageName UnqualComponentName deriving (Show, Eq, Ord)
247254

248255
mkSysDep :: String -> SysDependency
@@ -259,7 +266,7 @@ toNixGenericPackageDescription isLocal detailLevel gpd = mkNonRecSet
259266
component unQualName comp
260267
= quoted name $=
261268
mkNonRecSet (
262-
[ "depends" $= toNix deps | Just deps <- [shakeTree . fmap ( targetBuildDepends . getBuildInfo) $ comp ] ] ++
269+
[ "depends" $= toNix deps | Just deps <- [shakeTree . fmap ( (>>= depends) . targetBuildDepends . getBuildInfo) $ comp ] ] ++
263270
[ "libs" $= toNix deps | Just deps <- [shakeTree . fmap ( fmap mkSysDep . extraLibs . getBuildInfo) $ comp ] ] ++
264271
[ "frameworks" $= toNix deps | Just deps <- [shakeTree . fmap ( fmap mkSysDep . frameworks . getBuildInfo) $ comp ] ] ++
265272
[ "pkgconfig" $= toNix deps | Just deps <- [shakeTree . fmap ( pkgconfigDepends . getBuildInfo) $ comp ] ] ++
@@ -279,6 +286,7 @@ toNixGenericPackageDescription isLocal detailLevel gpd = mkNonRecSet
279286
[ "includes" $= toNix dir | Just dir <- [shakeTree . fmap (includes . getBuildInfo) $ comp] ] ++
280287
[ "mainPath" $= toNix p | Just p <- [shakeTree . fmap (maybeToList . getMainPath) $ comp] ])
281288
where name = fromString $ unUnqualComponentName unQualName
289+
depends (Dependency pkg _ libs) = HaskellLibDependency pkg <$> toList libs
282290
toolDeps = getToolDependencies (packageDescription gpd)
283291
toBuildToolDep (ExeDependency pkg c _) = BuildToolDependency pkg c
284292
getToolDependencies pkg bi =
@@ -300,6 +308,22 @@ instance ToNixExpr Dependency where
300308
where
301309
pkg = fromString . show . pretty . depPkgName $ d
302310

311+
instance ToNixExpr HaskellLibDependency where
312+
toNix (HaskellLibDependency p LMainLibName) = selectOr (mkSym hsPkgs) (
313+
mkSelector (quoted pkg))
314+
(mkSym errorHandler @. buildDepError @@ mkStr pkg)
315+
where
316+
pkg = fromString . show $ pretty p
317+
toNix (HaskellLibDependency p (LSubLibName l)) = selectOr (mkSym hsPkgs) (
318+
mkSelector (quoted pkg)
319+
<> mkSelector "components"
320+
<> mkSelector "sublibs"
321+
<> mkSelector lName)
322+
(mkSym errorHandler @. buildDepError @@ mkStr (pkg <> ":" <> lName))
323+
where
324+
pkg = fromString . show $ pretty p
325+
lName = fromString $ unUnqualComponentName l
326+
303327
instance ToNixExpr SysDependency where
304328
toNix d = selectOr (mkSym pkgs) (mkSelector $ quoted pkg) (mkSym errorHandler @. sysDepError @@ mkStr pkg)
305329
where
@@ -316,7 +340,7 @@ instance ToNixExpr ExeDependency where
316340
pkg = fromString . show . pretty $ pkgName'
317341

318342
instance ToNixExpr SetupDependency where
319-
toNix (SetupDependency pkgName') =
343+
toNix (SetupDependency pkgName' LMainLibName) =
320344
-- TODO once https://github.com/haskell-nix/hnix/issues/52
321345
-- is reolved use something like:
322346
-- [nix| hsPkgs.buildPackages.$((pkgName)) or pkgs.buildPackages.$((pkgName)) ]
@@ -325,6 +349,16 @@ instance ToNixExpr SetupDependency where
325349
where
326350
pkg = fromString . show . pretty $ pkgName'
327351
buildPackagesDotName = mkSelector "buildPackages" <> mkSelector pkg
352+
toNix (SetupDependency pkgName' (LSubLibName l)) = selectOr (mkSym hsPkgs) (
353+
mkSelector "buildPackages"
354+
<> mkSelector (quoted pkg)
355+
<> mkSelector "components"
356+
<> mkSelector "sublibs"
357+
<> mkSelector lName)
358+
(mkSym errorHandler @. setupDepError @@ mkStr (pkg <> ":" <> lName))
359+
where
360+
pkg = fromString . show $ pretty pkgName'
361+
lName = fromString $ unUnqualComponentName l
328362

329363
instance ToNixExpr BuildToolDependency where
330364
toNix (BuildToolDependency pkgName' componentName') =
@@ -354,21 +388,20 @@ instance {-# OVERLAPS #-} ToNixExpr a => ToNixExpr [a] where
354388
instance ToNixExpr ConfVar where
355389
toNix (OS os) = mkSym "system" @. (fromString . ("is" ++) . capitalize . show . pretty $ os)
356390
toNix (Arch arch) = mkSym "system" @. (fromString . ("is" ++) . capitalize . show . pretty $ arch)
357-
toNix (Flag flag) = mkSym flags @. (fromString . show . pretty $ flag)
391+
toNix (PackageFlag flag) = mkSym flags @. (fromString . show . pretty $ flag)
358392
toNix (Impl flavour range) = toNix flavour $&& toNix (projectVersionRange range)
359393

360394
instance ToNixExpr CompilerFlavor where
361395
toNix flavour = mkSym "compiler" @. (fromString . ("is" ++) . capitalize . show . pretty $ flavour)
362396

363397
instance ToNixExpr (VersionRangeF VersionRange) where
364-
toNix AnyVersionF = mkBool True
398+
toNix (OrLaterVersionF ver) | ver == version0 = mkBool True
365399
toNix (ThisVersionF ver) = mkSym "compiler" @. "version" @. "eq" @@ mkStr (fromString (show (pretty ver)))
366400
toNix (LaterVersionF ver) = mkSym "compiler" @. "version" @. "gt" @@ mkStr (fromString (show (pretty ver)))
367401
toNix (OrLaterVersionF ver) = mkSym "compiler" @. "version" @. "ge" @@ mkStr (fromString (show (pretty ver)))
368402
toNix (EarlierVersionF ver) = mkSym "compiler" @. "version" @. "lt" @@ mkStr (fromString (show (pretty ver)))
369403
toNix (OrEarlierVersionF ver) = mkSym "compiler" @. "version" @. "le" @@ mkStr (fromString (show (pretty ver)))
370-
toNix (WildcardVersionF _ver) = mkBool False
371-
-- toNix (MajorBoundVersionF ver) = mkSym "compiler" @. "version" @. "eq" @@ mkStr (fromString (show (pretty ver)))
404+
toNix (MajorBoundVersionF ver) = toNix (IntersectVersionRangesF (orLaterVersion ver) (earlierVersion (majorUpperBound ver)))
372405
toNix (IntersectVersionRangesF v1 v2) = toNix (projectVersionRange v1) $&& toNix (projectVersionRange v2)
373406
toNix x = error $ "ToNixExpr VersionRange for `" ++ show x ++ "` not implemented!"
374407

@@ -404,5 +437,5 @@ boolTreeToNix (CondNode True _c bs) =
404437
[] -> mkBool True
405438
bs' -> foldl1 ($&&) bs'
406439

407-
instance ToNixBinding Flag where
408-
toNixBinding (MkFlag name _desc def _manual) = (fromString . show . pretty $ name) $= mkBool def
440+
instance ToNixBinding PackageFlag where
441+
toNixBinding (MkPackageFlag name _desc def _manual) = (fromString . show . pretty $ name) $= mkBool def

nix-tools.cabal

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ library
2929
, Stack2nix.Project
3030
, Stack2nix.Stack
3131
build-depends: base >=4 && <4.15
32-
, Cabal >= 3.2 && <3.3
32+
, Cabal >= 3.4 && <3.5
3333
, aeson
3434
, aeson-pretty
3535
, base16-bytestring

nix/sources.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,10 @@
55
"homepage": "https://input-output-hk.github.io/haskell.nix",
66
"owner": "input-output-hk",
77
"repo": "haskell.nix",
8-
"rev": "cd91692380339f1d8fae8a798e8cc32e2d5bc39d",
9-
"sha256": "0wm9ym7q2xyxkzw0n7r0z5783i2s1ibb0qld1skzp3dz37mjmcrn",
8+
"rev": "958e9d3e9ec53fbce72ac720b10a6418f3b477f0",
9+
"sha256": "0j9p3xyck636gv87rwd6yl7w9ssv3jwrfqyxvhpchszkj097qwi6",
1010
"type": "tarball",
11-
"url": "https://github.com/input-output-hk/haskell.nix/archive/cd91692380339f1d8fae8a798e8cc32e2d5bc39d.tar.gz",
11+
"url": "https://github.com/input-output-hk/haskell.nix/archive/958e9d3e9ec53fbce72ac720b10a6418f3b477f0.tar.gz",
1212
"url_template": "https://github.com/<owner>/<repo>/archive/<rev>.tar.gz"
1313
},
1414
"niv": {

0 commit comments

Comments
 (0)