git.iko.soy/typeable/cabal2nix
on master help sign in
Require Cabal 2.x.
cbae3e6Peter Simons
.travis.yml+3
@@ -41,6 +41,9 @@ matrix:
41 - compiler: "ghc-8.0.2"
41 - compiler: "ghc-8.0.2"
42 # env: TEST=--disable-tests BENCH=--disable-benchmarks
42 # env: TEST=--disable-tests BENCH=--disable-benchmarks
43 addons: {apt: {packages: [ghc-ppa-tools,cabal-install-head,ghc-8.0.2], sources: [hvr-ghc]}}
43 addons: {apt: {packages: [ghc-ppa-tools,cabal-install-head,ghc-8.0.2], sources: [hvr-ghc]}}
44+ - compiler: "ghc-8.2.1"
45+ # env: TEST=--disable-tests BENCH=--disable-benchmarks
46+ addons: {apt: {packages: [ghc-ppa-tools,cabal-install-head,ghc-8.2.1], sources: [hvr-ghc]}}
44
47
45before_install:
48before_install:
46 - HC=${CC}
49 - HC=${CC}
cabal2nix.cabal+5−5
@@ -66,7 +66,7 @@ author: Peter Simons,
66maintainer: Peter Simons <simons@cryp.to>
66maintainer: Peter Simons <simons@cryp.to>
67license: BSD3
67license: BSD3
68license-file: LICENSE
68license-file: LICENSE
69−tested-with: GHC > 7.10 && < 8.1
69+tested-with: GHC > 7.10 && < 8.3
70build-type: Custom
70build-type: Custom
71cabal-version: >= 1.10
71cabal-version: >= 1.10
72
72
@@ -93,7 +93,7 @@ library
93 , ansi-wl-pprint
93 , ansi-wl-pprint
94 , base < 5
94 , base < 5
95 , bytestring
95 , bytestring
96− , Cabal > 1.24 && < 2
96+ , Cabal > 2
97 , containers
97 , containers
98 , deepseq >= 1.4
98 , deepseq >= 1.4
99 , directory
99 , directory
@@ -141,7 +141,7 @@ executable cabal2nix
141 , ansi-wl-pprint
141 , ansi-wl-pprint
142 , base < 5
142 , base < 5
143 , bytestring
143 , bytestring
144− , Cabal > 1.24 && < 2
144+ , Cabal > 2
145 , containers
145 , containers
146 , deepseq >= 1.4
146 , deepseq >= 1.4
147 , directory
147 , directory
@@ -173,7 +173,7 @@ executable hackage2nix
173 , ansi-wl-pprint
173 , ansi-wl-pprint
174 , base < 5
174 , base < 5
175 , bytestring
175 , bytestring
176− , Cabal > 1.24 && < 2
176+ , Cabal > 2
177 , containers
177 , containers
178 , deepseq >= 1.4
178 , deepseq >= 1.4
179 , directory
179 , directory
@@ -212,7 +212,7 @@ test-suite doctests
212 , ansi-wl-pprint
212 , ansi-wl-pprint
213 , base < 5
213 , base < 5
214 , bytestring
214 , bytestring
215− , Cabal > 1.24 && < 2
215+ , Cabal > 2
216 , containers
216 , containers
217 , deepseq >= 1.4
217 , deepseq >= 1.4
218 , directory
218 , directory
hackage2nix/HackageGit.hs+3−3
@@ -16,7 +16,7 @@ import Distribution.Nixpkgs.Hashes
16import Distribution.Nixpkgs.Haskell.OrphanInstances ( )
16import Distribution.Nixpkgs.Haskell.OrphanInstances ( )
17import Distribution.Package
17import Distribution.Package
18import Distribution.PackageDescription
18import Distribution.PackageDescription
19−import Distribution.PackageDescription.Parse ( parsePackageDescription, ParseResult(..) )
19+import Distribution.PackageDescription.Parse ( parseGenericPackageDescription, ParseResult(..) )
20import Distribution.Text
20import Distribution.Text
21import Distribution.Version
21import Distribution.Version
22import OpenSSL.Digest ( digest, digestByName )
22import OpenSSL.Digest ( digest, digestByName )
@@ -31,7 +31,7 @@ readHackage path = getSubDirs path >>= foldM discoverPackageVersions mempty
31 discoverPackageVersions :: Hackage -> String -> IO Hackage
31 discoverPackageVersions :: Hackage -> String -> IO Hackage
32 discoverPackageVersions db pkg = do
32 discoverPackageVersions db pkg = do
33 vs <- getSubDirs (path </> pkg)
33 vs <- getSubDirs (path </> pkg)
34− return (Map.insert (PackageName pkg) (Set.fromList (Prelude.map fromString vs)) db)
34+ return (Map.insert (mkPackageName pkg) (Set.fromList (Prelude.map fromString vs)) db)
35
35
36getSubDirs :: FilePath -> IO [FilePath]
36getSubDirs :: FilePath -> IO [FilePath]
37getSubDirs path = do
37getSubDirs path = do
@@ -47,7 +47,7 @@ readPackage :: FilePath -> PackageIdentifier -> IO (GenericPackageDescription, S
47readPackage dirPrefix (PackageIdentifier name version) = do
47readPackage dirPrefix (PackageIdentifier name version) = do
48 let cabalFile = dirPrefix </> unPackageName name </> display version </> unPackageName name <.> "cabal"
48 let cabalFile = dirPrefix </> unPackageName name </> display version </> unPackageName name <.> "cabal"
49 buf <- BS.readFile cabalFile
49 buf <- BS.readFile cabalFile
50− cabal <- case parsePackageDescription (decodeUTF8 buf) of
50+ cabal <- case parseGenericPackageDescription (decodeUTF8 buf) of
51 ParseOk _ a -> return a
51 ParseOk _ a -> return a
52 ParseFailed err -> fail (cabalFile ++ ": " ++ show err)
52 ParseFailed err -> fail (cabalFile ++ ": " ++ show err)
53 return (cabal, printSHA256 (digest (digestByName "sha256") buf))
53 return (cabal, printSHA256 (digest (digestByName "sha256") buf))
hackage2nix/Main.hs+1−1
@@ -201,4 +201,4 @@ resolveConstraint' (Dependency name vrange) hackage
201 | otherwise = Nothing
201 | otherwise = Nothing
202
202
203mangle :: PackageIdentifier -> String
203mangle :: PackageIdentifier -> String
204−mangle (PackageIdentifier (PackageName name) v) = name ++ '_' : [ if c == '.' then '_' else c | c <- display v ]
204+mangle (PackageIdentifier name v) = unPackageName name ++ '_' : [ if c == '.' then '_' else c | c <- display v ]
package.yaml+2−2
@@ -59,7 +59,7 @@ license-file: LICENSE
59github: nixos/cabal2nix
59github: nixos/cabal2nix
60category: Distribution, Nix
60category: Distribution, Nix
61stability: stable
61stability: stable
62−tested-with: GHC > 7.10 && < 8.1
62+tested-with: GHC > 7.10 && < 8.3
63description: >
63description: >
64 Convert Cabal files into Nix build instructions. Users of Nix can install the
64 Convert Cabal files into Nix build instructions. Users of Nix can install the
65 latest version by running:
65 latest version by running:
@@ -84,7 +84,7 @@ dependencies:
84 - ansi-wl-pprint
84 - ansi-wl-pprint
85 - base < 5
85 - base < 5
86 - bytestring
86 - bytestring
87− - Cabal > 1.24 && < 2
87+ - Cabal > 2
88 - containers
88 - containers
89 - deepseq >= 1.4
89 - deepseq >= 1.4
90 - directory
90 - directory
src/Cabal2nix.hs+4−4
@@ -19,7 +19,7 @@ import Distribution.Nixpkgs.Haskell
19import Distribution.Nixpkgs.Haskell.FromCabal
19import Distribution.Nixpkgs.Haskell.FromCabal
20import Distribution.Nixpkgs.Haskell.PackageSourceSpec
20import Distribution.Nixpkgs.Haskell.PackageSourceSpec
21import Distribution.Nixpkgs.Meta
21import Distribution.Nixpkgs.Meta
22−import Distribution.PackageDescription ( FlagName(..), FlagAssignment )
22+import Distribution.PackageDescription ( mkFlagName, FlagAssignment )
23import Distribution.Simple.Utils ( lowercase )
23import Distribution.Simple.Utils ( lowercase )
24import Distribution.System
24import Distribution.System
25import Distribution.Text
25import Distribution.Text
@@ -34,7 +34,7 @@ import Text.PrettyPrint.HughesPJClass ( Doc, Pretty(..), text, vcat, hcat, semi
34data Options = Options
34data Options = Options
35 { optSha256 :: Maybe String
35 { optSha256 :: Maybe String
36 , optMaintainer :: [String]
36 , optMaintainer :: [String]
37−--, optPlatform :: [String] -- TODO: fix command line handling of platforms
37+--, optPlatform :: [String] -- TODO: fix command line handling of platforms
38 , optHaddock :: Bool
38 , optHaddock :: Bool
39 , optDoCheck :: Bool
39 , optDoCheck :: Bool
40 , optJailbreak :: Bool
40 , optJailbreak :: Bool
@@ -176,5 +176,5 @@ cabal2nix args = do
176
176
177readFlagList :: [String] -> FlagAssignment
177readFlagList :: [String] -> FlagAssignment
178readFlagList = map tagWithValue
178readFlagList = map tagWithValue
179− where tagWithValue ('-':fname) = (FlagName (lowercase fname), False)
179+ where tagWithValue ('-':fname) = (mkFlagName (lowercase fname), False)
180− tagWithValue fname = (FlagName (lowercase fname), True)
180+ tagWithValue fname = (mkFlagName (lowercase fname), True)
src/Distribution/Nixpkgs/Haskell/Derivation.hs+2−2
@@ -23,7 +23,7 @@ import Distribution.Nixpkgs.Haskell.BuildInfo
23import Distribution.Nixpkgs.Haskell.OrphanInstances ( )
23import Distribution.Nixpkgs.Haskell.OrphanInstances ( )
24import Distribution.Nixpkgs.Meta
24import Distribution.Nixpkgs.Meta
25import Distribution.Package
25import Distribution.Package
26−import Distribution.PackageDescription ( FlagAssignment, FlagName(..) )
26+import Distribution.PackageDescription ( FlagAssignment, unFlagName )
27import GHC.Generics ( Generic )
27import GHC.Generics ( Generic )
28import Language.Nix
28import Language.Nix
29import Language.Nix.PrettyPrinting
29import Language.Nix.PrettyPrinting
@@ -137,7 +137,7 @@ instance Pretty Derivation where
137 , Set.fromList ["fetch" ++ derivKind _src | derivKind _src /= "" && not isHackagePackage]
137 , Set.fromList ["fetch" ++ derivKind _src | derivKind _src /= "" && not isHackagePackage]
138 ]
138 ]
139
139
140− renderedFlags = [ text "-f" <> (if enable then empty else char '-') <> text f | (FlagName f, enable) <- _cabalFlags ]
140+ renderedFlags = [ text "-f" <> (if enable then empty else char '-') <> text (unFlagName f) | (f, enable) <- _cabalFlags ]
141 ++ map text (toAscList _configureFlags)
141 ++ map text (toAscList _configureFlags)
142 isHackagePackage = "mirror://hackage/" `isPrefixOf` derivUrl _src
142 isHackagePackage = "mirror://hackage/" `isPrefixOf` derivUrl _src
143 sourceAttr (DerivationSource{..})
143 sourceAttr (DerivationSource{..})
src/Distribution/Nixpkgs/Haskell/FromCabal.hs+15−25
@@ -7,7 +7,6 @@ module Distribution.Nixpkgs.Haskell.FromCabal
7 )
7 )
8 where
8 where
9
9
10−import Control.Arrow ( second )
11import Control.Lens
10import Control.Lens
12import Data.Maybe
11import Data.Maybe
13import Data.Set ( Set )
12import Data.Set ( Set )
@@ -24,7 +23,10 @@ import qualified Distribution.Nixpkgs.Meta as Nix
24import Distribution.Package
23import Distribution.Package
25import Distribution.PackageDescription
24import Distribution.PackageDescription
26import qualified Distribution.PackageDescription as Cabal
25import qualified Distribution.PackageDescription as Cabal
26+import Distribution.Types.LegacyExeDependency as Cabal
27+import Distribution.Types.PkgconfigDependency as Cabal
27−import Distribution.PackageDescription.Configuration
28+import Distribution.PackageDescription.Configuration as Cabal
29+import Distribution.Types.ComponentRequestedSpec as Cabal
28import Distribution.System
30import Distribution.System
29import Distribution.Text ( display )
31import Distribution.Text ( display )
30import Distribution.Version
32import Distribution.Version
@@ -40,7 +42,13 @@ fromGenericPackageDescription haskellResolver nixpkgsResolver arch compiler flag
40 -- We have to call the Cabal finalizer several times with different resolver
42 -- We have to call the Cabal finalizer several times with different resolver
41 -- functions, and this convenience function makes our code shorter.
43 -- functions, and this convenience function makes our code shorter.
42 finalize :: HaskellResolver -> Either [Dependency] (PackageDescription,FlagAssignment)
44 finalize :: HaskellResolver -> Either [Dependency] (PackageDescription,FlagAssignment)
43− finalize resolver = finalizePackageDescription flags resolver arch compiler constraints (enableBenchmarks (enableTests genDesc))
45+ finalize resolver = finalizePD flags requestedComponents resolver arch compiler constraints genDesc
46+
47+ requestedComponents :: ComponentRequestedSpec
48+ requestedComponents = defaultComponentRequestedSpec
49+ { testsRequested = True
50+ , benchmarksRequested = True
51+ }
44
52
45 descr :: PackageDescription; missingDeps :: [Dependency]
53 descr :: PackageDescription; missingDeps :: [Dependency]
46 (descr,missingDeps) = case finalize jailbrokenResolver of
54 (descr,missingDeps) = case finalize jailbrokenResolver of
@@ -93,7 +101,7 @@ fromPackageDescription haskellResolver nixpkgsResolver missingDeps flags (Packag
93 xrev = maybe 0 read (lookup "x-revision" customFieldsPD)
101 xrev = maybe 0 read (lookup "x-revision" customFieldsPD)
94
102
95 resolveInHackage :: Identifier -> Binding
103 resolveInHackage :: Identifier -> Binding
96− resolveInHackage i | (i^.ident) `elem` [ n | (Dependency (PackageName n) _) <- missingDeps ] = bindNull i
104+ resolveInHackage i | (i^.ident) `elem` [ unPackageName n | (Dependency n _) <- missingDeps ] = bindNull i
97 | otherwise = binding # (i, path # ["self",i]) -- TODO: "self" shouldn't be hardcoded.
105 | otherwise = binding # (i, path # ["self",i]) -- TODO: "self" shouldn't be hardcoded.
98
106
99 goodScopes :: Set [Identifier]
107 goodScopes :: Set [Identifier]
@@ -109,15 +117,15 @@ fromPackageDescription haskellResolver nixpkgsResolver missingDeps flags (Packag
109 | otherwise = bindNull i
117 | otherwise = bindNull i
110
118
111 resolveInHackageThenNixpkgs :: Identifier -> Binding
119 resolveInHackageThenNixpkgs :: Identifier -> Binding
112− resolveInHackageThenNixpkgs i | haskellResolver (Dependency (PackageName (i^.ident)) anyVersion) = resolveInHackage i
120+ resolveInHackageThenNixpkgs i | haskellResolver (Dependency (mkPackageName (i^.ident)) anyVersion) = resolveInHackage i
113 | otherwise = resolveInNixpkgs i
121 | otherwise = resolveInNixpkgs i
114
122
115 convertBuildInfo :: Cabal.BuildInfo -> Nix.BuildInfo
123 convertBuildInfo :: Cabal.BuildInfo -> Nix.BuildInfo
116 convertBuildInfo Cabal.BuildInfo {..} = mempty
124 convertBuildInfo Cabal.BuildInfo {..} = mempty
117 & haskell .~ Set.fromList [ resolveInHackage (toNixName x) | (Dependency x _) <- targetBuildDepends ]
125 & haskell .~ Set.fromList [ resolveInHackage (toNixName x) | (Dependency x _) <- targetBuildDepends ]
118 & system .~ Set.fromList [ resolveInNixpkgs y | x <- extraLibs, y <- libNixName x ]
126 & system .~ Set.fromList [ resolveInNixpkgs y | x <- extraLibs, y <- libNixName x ]
119− & pkgconfig .~ Set.fromList [ resolveInNixpkgs y | Dependency (PackageName x) _ <- pkgconfigDepends, y <- libNixName x ]
127+ & pkgconfig .~ Set.fromList [ resolveInNixpkgs y | PkgconfigDependency x _ <- pkgconfigDepends, y <- libNixName (unPkgconfigName x) ]
120− & tool .~ Set.fromList [ resolveInHackageThenNixpkgs y | Dependency (PackageName x) _ <- buildTools, y <- buildToolNixName x ]
128+ & tool .~ Set.fromList [ resolveInHackageThenNixpkgs y | LegacyExeDependency x _ <- buildTools, y <- buildToolNixName x ]
121
129
122 convertSetupBuildInfo :: Cabal.SetupBuildInfo -> Nix.BuildInfo
130 convertSetupBuildInfo :: Cabal.SetupBuildInfo -> Nix.BuildInfo
123 convertSetupBuildInfo bi = mempty
131 convertSetupBuildInfo bi = mempty
@@ -125,21 +133,3 @@ fromPackageDescription haskellResolver nixpkgsResolver missingDeps flags (Packag
125
133
126bindNull :: Identifier -> Binding
134bindNull :: Identifier -> Binding
127bindNull i = binding # (i, path # ["null"])
135bindNull i = binding # (i, path # ["null"])
128−
129−enableTests :: GenericPackageDescription -> GenericPackageDescription
130−enableTests gd = gd { condTestSuites = flaggedTests }
131− where
132− flaggedTests :: [(String, CondTree ConfVar [Dependency] TestSuite)]
133− flaggedTests = map (second (mapTreeData enableTest)) (condTestSuites gd)
134−
135− enableTest :: TestSuite -> TestSuite
136− enableTest t = t { testEnabled = True }
137−
138−enableBenchmarks :: GenericPackageDescription -> GenericPackageDescription
139−enableBenchmarks gd = gd { condBenchmarks = flaggedBenchmarks }
140− where
141− flaggedBenchmarks :: [(String, CondTree ConfVar [Dependency] Benchmark)]
142− flaggedBenchmarks = map (second (mapTreeData enableBenchmark)) (condBenchmarks gd)
143−
144− enableBenchmark :: Benchmark -> Benchmark
145− enableBenchmark t = t { benchmarkEnabled = True }
src/Distribution/Nixpkgs/Haskell/FromCabal/Flags.hs+4−4
@@ -6,7 +6,7 @@ import Distribution.Nixpkgs.Haskell.OrphanInstances ( )
6
6
7import Distribution.Package
7import Distribution.Package
8import Distribution.PackageDescription
8import Distribution.PackageDescription
9−import Data.Version
9+import Distribution.Version
10
10
11configureCabalFlags :: PackageIdentifier -> FlagAssignment
11configureCabalFlags :: PackageIdentifier -> FlagAssignment
12configureCabalFlags (PackageIdentifier name version)
12configureCabalFlags (PackageIdentifier name version)
@@ -38,7 +38,7 @@ configureCabalFlags (PackageIdentifier name version)
38 | name == "haskeline" = [enable "terminfo"]
38 | name == "haskeline" = [enable "terminfo"]
39 | name == "haste-compiler" = [enable "portable"]
39 | name == "haste-compiler" = [enable "portable"]
40 | name == "highlighting-kate" = [enable "pcre-light"]
40 | name == "highlighting-kate" = [enable "pcre-light"]
41− | name == "hlibsass" && version >= Version [0,1,5] []
41+ | name == "hlibsass" && version >= mkVersion [0,1,5]
42 = [enable "externalLibsass"]
42 = [enable "externalLibsass"]
43 | name == "hmatrix" = [enable "openblas"]
43 | name == "hmatrix" = [enable "openblas"]
44 | name == "hslua" = [enable "system-lua"]
44 | name == "hslua" = [enable "system-lua"]
@@ -55,7 +55,7 @@ configureCabalFlags (PackageIdentifier name version)
55 | otherwise = []
55 | otherwise = []
56
56
57enable :: String -> (FlagName,Bool)
57enable :: String -> (FlagName,Bool)
58−enable name = (FlagName name, True)
58+enable name = (mkFlagName name, True)
59
59
60disable :: String -> (FlagName,Bool)
60disable :: String -> (FlagName,Bool)
61−disable name = (FlagName name, False)
61+disable name = (mkFlagName name, False)
src/Distribution/Nixpkgs/Haskell/FromCabal/License.hs+29−27
@@ -1,37 +1,39 @@
1+{-# LANGUAGE ViewPatterns #-}
2+
1module Distribution.Nixpkgs.Haskell.FromCabal.License ( fromCabalLicense ) where
3module Distribution.Nixpkgs.Haskell.FromCabal.License ( fromCabalLicense ) where
2
4
3import Distribution.Nixpkgs.License
5import Distribution.Nixpkgs.License
4import Distribution.License ( License(..), knownLicenses )
6import Distribution.License ( License(..), knownLicenses )
5import Distribution.Text (display)
7import Distribution.Text (display)
6import Data.List (intercalate)
8import Data.List (intercalate)
7−import Data.Version
9+import Distribution.Version
8
10
9-- TODO: Programatically strip trailing zeros from license version numbers.
11-- TODO: Programatically strip trailing zeros from license version numbers.
10
12
11fromCabalLicense :: Distribution.License.License -> Distribution.Nixpkgs.License.License
13fromCabalLicense :: Distribution.License.License -> Distribution.Nixpkgs.License.License
12−fromCabalLicense (GPL Nothing) = Unknown (Just "GPL")
14+fromCabalLicense (GPL Nothing) = Unknown (Just "GPL")
13−fromCabalLicense (GPL (Just (Version [2] []))) = Known "stdenv.lib.licenses.gpl2"
15+fromCabalLicense (GPL (Just (versionNumbers -> [2]))) = Known "stdenv.lib.licenses.gpl2"
14−fromCabalLicense (GPL (Just (Version [3] []))) = Known "stdenv.lib.licenses.gpl3"
16+fromCabalLicense (GPL (Just (versionNumbers -> [3]))) = Known "stdenv.lib.licenses.gpl3"
15−fromCabalLicense (GPL (Just (Version [3,0] []))) = Known "stdenv.lib.licenses.gpl3"
17+fromCabalLicense (GPL (Just (versionNumbers -> [3,0]))) = Known "stdenv.lib.licenses.gpl3"
16−fromCabalLicense (LGPL Nothing) = Unknown (Just "LGPL")
18+fromCabalLicense (LGPL Nothing) = Unknown (Just "LGPL")
17−fromCabalLicense (LGPL (Just (Version [2,1] []))) = Known "stdenv.lib.licenses.lgpl21"
19+fromCabalLicense (LGPL (Just (versionNumbers -> [2,1]))) = Known "stdenv.lib.licenses.lgpl21"
18−fromCabalLicense (LGPL (Just (Version [2] []))) = Known "stdenv.lib.licenses.lgpl2"
20+fromCabalLicense (LGPL (Just (versionNumbers -> [2]))) = Known "stdenv.lib.licenses.lgpl2"
19−fromCabalLicense (LGPL (Just (Version [3] []))) = Known "stdenv.lib.licenses.lgpl3"
21+fromCabalLicense (LGPL (Just (versionNumbers -> [3]))) = Known "stdenv.lib.licenses.lgpl3"
20−fromCabalLicense (LGPL (Just (Version [3,0] []))) = Known "stdenv.lib.licenses.lgpl3"
22+fromCabalLicense (LGPL (Just (versionNumbers -> [3,0]))) = Known "stdenv.lib.licenses.lgpl3"
21−fromCabalLicense (AGPL Nothing) = Unknown (Just "AGPL")
23+fromCabalLicense (AGPL Nothing) = Unknown (Just "AGPL")
22−fromCabalLicense (AGPL (Just (Version [3] []))) = Known "stdenv.lib.licenses.agpl3"
24+fromCabalLicense (AGPL (Just (versionNumbers -> [3]))) = Known "stdenv.lib.licenses.agpl3"
23−fromCabalLicense (AGPL (Just (Version [3,0] []))) = Known "stdenv.lib.licenses.agpl3"
25+fromCabalLicense (AGPL (Just (versionNumbers -> [3,0]))) = Known "stdenv.lib.licenses.agpl3"
24−fromCabalLicense (MPL (Version [2,0] [])) = Known "stdenv.lib.licenses.mpl20"
26+fromCabalLicense (MPL (versionNumbers -> [2,0])) = Known "stdenv.lib.licenses.mpl20"
25−fromCabalLicense BSD2 = Known "stdenv.lib.licenses.bsd2"
27+fromCabalLicense BSD2 = Known "stdenv.lib.licenses.bsd2"
26−fromCabalLicense BSD3 = Known "stdenv.lib.licenses.bsd3"
28+fromCabalLicense BSD3 = Known "stdenv.lib.licenses.bsd3"
27−fromCabalLicense BSD4 = Known "stdenv.lib.licenses.bsdOriginal"
29+fromCabalLicense BSD4 = Known "stdenv.lib.licenses.bsdOriginal"
28−fromCabalLicense MIT = Known "stdenv.lib.licenses.mit"
30+fromCabalLicense MIT = Known "stdenv.lib.licenses.mit"
29−fromCabalLicense PublicDomain = Known "stdenv.lib.licenses.publicDomain"
31+fromCabalLicense PublicDomain = Known "stdenv.lib.licenses.publicDomain"
30−fromCabalLicense UnspecifiedLicense = Known "stdenv.lib.licenses.unfree"
32+fromCabalLicense UnspecifiedLicense = Known "stdenv.lib.licenses.unfree"
31−fromCabalLicense AllRightsReserved = Known "stdenv.lib.licenses.unfree"
33+fromCabalLicense AllRightsReserved = Known "stdenv.lib.licenses.unfree"
32−fromCabalLicense (Apache Nothing) = Known "stdenv.lib.licenses.asl20"
34+fromCabalLicense (Apache Nothing) = Known "stdenv.lib.licenses.asl20"
33−fromCabalLicense (Apache (Just (Version [2,0] []))) = Known "stdenv.lib.licenses.asl20"
35+fromCabalLicense (Apache (Just (versionNumbers -> [2,0]))) = Known "stdenv.lib.licenses.asl20"
34−fromCabalLicense ISC = Known "stdenv.lib.licenses.isc"
36+fromCabalLicense ISC = Known "stdenv.lib.licenses.isc"
35−fromCabalLicense OtherLicense = Unknown Nothing
37+fromCabalLicense OtherLicense = Unknown Nothing
36−fromCabalLicense l = error $ "Distribution.Nixpkgs.Haskell.FromCabal.License.fromCabalLicense: unknown license"
38+fromCabalLicense l = error $ "Distribution.Nixpkgs.Haskell.FromCabal.License.fromCabalLicense: unknown license"
37− ++ show l ++"\nChoose one of: " ++ intercalate ", " (map display knownLicenses)
39+ ++ show l ++"\nChoose one of: " ++ intercalate ", " (map display knownLicenses)
src/Distribution/Nixpkgs/Haskell/FromCabal/Name.hs+2−2
@@ -10,8 +10,8 @@ import Language.Nix
10
10
11-- | Map Cabal names to Nix attribute names.
11-- | Map Cabal names to Nix attribute names.
12toNixName :: PackageName -> Identifier
12toNixName :: PackageName -> Identifier
13−toNixName (PackageName "") = error "toNixName: invalid empty package name"
13+toNixName "" = error "toNixName: invalid empty package name"
14−toNixName (PackageName n) = fromString n
14+toNixName n = fromString (unPackageName n)
15
15
16-- | Map library names specified in Cabal files to Nix package identifiers.
16-- | Map library names specified in Cabal files to Nix package identifiers.
17--
17--
src/Distribution/Nixpkgs/Haskell/FromCabal/Normalize.hs+12−10
@@ -1,3 +1,5 @@
1+{-# LANGUAGE OverloadedStrings #-}
2+
1module Distribution.Nixpkgs.Haskell.FromCabal.Normalize ( normalize, normalizeCabalFlags ) where
3module Distribution.Nixpkgs.Haskell.FromCabal.Normalize ( normalize, normalizeCabalFlags ) where
2
4
3import Control.Lens
5import Control.Lens
@@ -8,7 +10,7 @@ import Data.String
8import Distribution.Nixpkgs.Haskell
10import Distribution.Nixpkgs.Haskell
9import Distribution.Nixpkgs.Meta
11import Distribution.Nixpkgs.Meta
10import Distribution.Package
12import Distribution.Package
11−import Distribution.PackageDescription ( FlagAssignment, FlagName(..) )
13+import Distribution.PackageDescription ( FlagAssignment, mkFlagName, unFlagName )
12import Distribution.Simple.Utils ( lowercase )
14import Distribution.Simple.Utils ( lowercase )
13import Language.Nix hiding ( quote )
15import Language.Nix hiding ( quote )
14
16
@@ -20,12 +22,12 @@ normalize drv = drv
20 & over benchmarkDepends (normalizeBuildInfo (packageName drv))
22 & over benchmarkDepends (normalizeBuildInfo (packageName drv))
21 & over metaSection normalizeMeta
23 & over metaSection normalizeMeta
22 & over cabalFlags normalizeCabalFlags
24 & over cabalFlags normalizeCabalFlags
23− & jailbreak %~ (&& (packageName drv /= PackageName "jailbreak-cabal"))
25+ & jailbreak %~ (&& (packageName drv /= "jailbreak-cabal"))
24
26
25normalizeBuildInfo :: PackageName -> BuildInfo -> BuildInfo
27normalizeBuildInfo :: PackageName -> BuildInfo -> BuildInfo
26−normalizeBuildInfo (PackageName pname) bi = bi
28+normalizeBuildInfo pname bi = bi
27− & haskell %~ Set.filter (\b -> view localName b /= fromString pname)
29+ & haskell %~ Set.filter (\b -> view localName b /= fromString (unPackageName pname))
28− & tool %~ Set.filter (\b -> view localName b /= fromString pname)
30+ & tool %~ Set.filter (\b -> view localName b /= fromString (unPackageName pname))
29
31
30normalizeMeta :: Meta -> Meta
32normalizeMeta :: Meta -> Meta
31normalizeMeta meta = meta
33normalizeMeta meta = meta
@@ -45,14 +47,14 @@ quote ('"':cs) = '\\' : '"' : quote cs
45quote (c:cs) = c : quote cs
47quote (c:cs) = c : quote cs
46quote [] = []
48quote [] = []
47
49
48−-- |When a flag is specified multiple times, the first occurrence
50+-- | When a flag is specified multiple times, the first occurrence counts. This
49−-- counts. This is counter-intuitive, IMHO, but it's how cabal does it.
51+-- is counter-intuitive, IMHO, but it's how cabal does it. Flag names are
50−-- Flag names are spelled in all lowercase.
52+-- spelled in all lowercase.
51--
53--
52−-- >>> normalizeCabalFlags [(FlagName "foo", True), (FlagName "FOO", True), (FlagName "Foo", False)]
54+-- >>> normalizeCabalFlags [(mkFlagName "foo", True), (mkFlagName "FOO", True), (mkFlagName "Foo", False)]
53-- [(FlagName "foo",True)]
55-- [(FlagName "foo",True)]
54
56
55normalizeCabalFlags :: FlagAssignment -> FlagAssignment
57normalizeCabalFlags :: FlagAssignment -> FlagAssignment
56normalizeCabalFlags flags' = nubBy ((==) `on` fst) (sortBy (compare `on` fst) flags)
58normalizeCabalFlags flags' = nubBy ((==) `on` fst) (sortBy (compare `on` fst) flags)
57 where
59 where
58− flags = [ (FlagName (lowercase n), b) | (FlagName n, b) <- flags' ]
60+ flags = [ (mkFlagName (lowercase (unFlagName n)), b) | (n, b) <- flags' ]
src/Distribution/Nixpkgs/Haskell/FromCabal/PostProcess.hs+1−1
@@ -27,7 +27,7 @@ fixGtkBuilds drv = drv & dependencies . pkgconfig %~ Set.filter (not . collidesW
27 collidesWithHaskellName b = view localName b `Set.member` buildDeps
27 collidesWithHaskellName b = view localName b `Set.member` buildDeps
28
28
29 myName :: Identifier
29 myName :: Identifier
30− myName = ident # n where PackageName n = packageName drv
30+ myName = ident # unPackageName (packageName drv)
31
31
32 buildDeps :: Set Identifier
32 buildDeps :: Set Identifier
33 buildDeps = Set.delete myName (setOf (dependencies . haskell . folded . localName) drv)
33 buildDeps = Set.delete myName (setOf (dependencies . haskell . folded . localName) drv)
src/Distribution/Nixpkgs/Haskell/OrphanInstances.hs+15−21
@@ -1,7 +1,3 @@
1−{-# LANGUAGE CPP #-}
2−{-# LANGUAGE OverloadedStrings #-}
3−{-# LANGUAGE DeriveGeneric #-}
4−{-# LANGUAGE StandaloneDeriving #-}
5{-# OPTIONS_GHC -fno-warn-orphans #-}
1{-# OPTIONS_GHC -fno-warn-orphans #-}
6
2
7module Distribution.Nixpkgs.Haskell.OrphanInstances ( ) where
3module Distribution.Nixpkgs.Haskell.OrphanInstances ( ) where
@@ -13,45 +9,47 @@ import qualified Data.Text as T
13import Data.Yaml
9import Data.Yaml
14import Distribution.Compiler
10import Distribution.Compiler
15import Distribution.License
11import Distribution.License
16−import Distribution.ModuleName hiding ( main, fromString )
17import Distribution.Package
12import Distribution.Package
18import Distribution.PackageDescription
13import Distribution.PackageDescription
19import Distribution.System
14import Distribution.System
20import Distribution.Text
15import Distribution.Text
16+import Distribution.Types.CondTree
17+import Distribution.Types.ExecutableScope
18+import Distribution.Types.ForeignLib
19+import Distribution.Types.ForeignLibOption
20+import Distribution.Types.ForeignLibType
21+import Distribution.Types.IncludeRenaming
22+import Distribution.Types.Mixin
21import Distribution.Version
23import Distribution.Version
22import Language.Haskell.Extension
24import Language.Haskell.Extension
23
25
24−#if !MIN_VERSION_Cabal(1,23,0)
25−import GHC.Generics ( Generic )
26−deriving instance Generic (CondTree v c a)
27−deriving instance Generic (Condition a)
28−deriving instance Generic ConfVar
29−deriving instance Generic Flag
30−deriving instance Generic GenericPackageDescription
31−#else
32instance NFData SetupBuildInfo
26instance NFData SetupBuildInfo
33−#endif
34−
35instance (NFData v, NFData c, NFData a) => NFData (CondTree v c a)
27instance (NFData v, NFData c, NFData a) => NFData (CondTree v c a)
28+instance (NFData v, NFData c, NFData a) => NFData (CondBranch v c a)
36instance NFData Arch
29instance NFData Arch
37instance NFData Benchmark
30instance NFData Benchmark
38instance NFData BenchmarkInterface
31instance NFData BenchmarkInterface
39instance NFData BenchmarkType
32instance NFData BenchmarkType
40instance NFData BuildInfo
33instance NFData BuildInfo
41instance NFData BuildType
34instance NFData BuildType
35+instance NFData LibVersionInfo
42instance NFData CompilerFlavor
36instance NFData CompilerFlavor
43instance NFData ConfVar
37instance NFData ConfVar
44−instance NFData Dependency
38+instance NFData ExecutableScope
39+instance NFData IncludeRenaming
40+instance NFData ForeignLibType
41+instance NFData ForeignLibOption
45instance NFData Executable
42instance NFData Executable
46instance NFData Extension
43instance NFData Extension
47instance NFData Flag
44instance NFData Flag
45+instance NFData Mixin
48instance NFData FlagName
46instance NFData FlagName
49instance NFData GenericPackageDescription
47instance NFData GenericPackageDescription
50instance NFData KnownExtension
48instance NFData KnownExtension
51instance NFData Language
49instance NFData Language
52instance NFData Library
50instance NFData Library
51+instance NFData ForeignLib
53instance NFData License
52instance NFData License
54−instance NFData ModuleName
55instance NFData ModuleReexport
53instance NFData ModuleReexport
56instance NFData ModuleRenaming
54instance NFData ModuleRenaming
57instance NFData OS
55instance NFData OS
@@ -62,16 +60,12 @@ instance NFData SourceRepo
62instance NFData TestSuite
60instance NFData TestSuite
63instance NFData TestSuiteInterface
61instance NFData TestSuiteInterface
64instance NFData TestType
62instance NFData TestType
65−instance NFData VersionRange
66instance NFData a => NFData (Condition a)
63instance NFData a => NFData (Condition a)
67instance NFData Platform
64instance NFData Platform
68instance NFData CompilerInfo
65instance NFData CompilerInfo
69instance NFData CompilerId
66instance NFData CompilerId
70instance NFData AbiTag
67instance NFData AbiTag
71
68
72−instance IsString PackageName where
73− fromString = text2isString "PackageName"
74−
75instance IsString Version where
69instance IsString Version where
76 fromString = text2isString "Version"
70 fromString = text2isString "Version"
77
71
src/Distribution/Nixpkgs/Haskell/PackageSourceSpec.hs+6−11
@@ -9,7 +9,6 @@ import Control.Monad.Trans.Maybe
9import qualified Data.ByteString.Lazy.Char8 as LBS8
9import qualified Data.ByteString.Lazy.Char8 as LBS8
10import Data.List ( isSuffixOf, isPrefixOf )
10import Data.List ( isSuffixOf, isPrefixOf )
11import Data.Maybe
11import Data.Maybe
12−import Data.Version
13import Distribution.Hackage.DB.Parsed
12import Distribution.Hackage.DB.Parsed
14import Distribution.Nixpkgs.Fetch
13import Distribution.Nixpkgs.Fetch
15import Distribution.Nixpkgs.Hashes
14import Distribution.Nixpkgs.Hashes
@@ -17,7 +16,7 @@ import qualified Distribution.Nixpkgs.Haskell.Hackage as DB
17import qualified Distribution.Package as Cabal
16import qualified Distribution.Package as Cabal
18import Distribution.PackageDescription
17import Distribution.PackageDescription
19import qualified Distribution.PackageDescription as Cabal
18import qualified Distribution.PackageDescription as Cabal
20−import Distribution.Text ( simpleParse )
19+import Distribution.Text ( simpleParse, display )
21import OpenSSL.Digest ( digest, digestByName )
20import OpenSSL.Digest ( digest, digestByName )
22import System.Directory ( doesDirectoryExist, doesFileExist, createDirectoryIfMissing, getHomeDirectory, getDirectoryContents )
21import System.Directory ( doesDirectoryExist, doesFileExist, createDirectoryIfMissing, getHomeDirectory, getDirectoryContents )
23import System.Exit ( exitFailure )
22import System.Exit ( exitFailure )
@@ -35,7 +34,6 @@ getPackage optHackageDB source = do
35 (derivSource, pkgDesc) <- fetchOrFromDB optHackageDB source
34 (derivSource, pkgDesc) <- fetchOrFromDB optHackageDB source
36 flip Package pkgDesc <$> maybe (sourceFromHackage (sourceHash source) (showPackageIdentifier pkgDesc) $ sourceCabalDir source) return derivSource
35 flip Package pkgDesc <$> maybe (sourceFromHackage (sourceHash source) (showPackageIdentifier pkgDesc) $ sourceCabalDir source) return derivSource
37
36
38−
39fetchOrFromDB :: Maybe String -> Source -> IO (Maybe DerivationSource, Cabal.GenericPackageDescription)
37fetchOrFromDB :: Maybe String -> Source -> IO (Maybe DerivationSource, Cabal.GenericPackageDescription)
40fetchOrFromDB optHackageDB src
38fetchOrFromDB optHackageDB src
41 | "cabal://" `isPrefixOf` sourceUrl src = fmap ((,) Nothing) . fromDB optHackageDB . drop (length "cabal://") $ sourceUrl src
39 | "cabal://" `isPrefixOf` sourceUrl src = fmap ((,) Nothing) . fromDB optHackageDB . drop (length "cabal://") $ sourceUrl src
@@ -54,15 +52,12 @@ fromDB optHackageDB pkg = do
54 Just r -> return r
52 Just r -> return r
55 Nothing -> hPutStrLn stderr "*** no such package in the cabal database (did you run cabal update?). " >> exitFailure
53 Nothing -> hPutStrLn stderr "*** no such package in the cabal database (did you run cabal update?). " >> exitFailure
56 where
54 where
55+ pkgId :: Cabal.PackageIdentifier
57 pkgId = fromMaybe (error ("invalid Haskell package id " ++ show pkg)) (simpleParse pkg)
56 pkgId = fromMaybe (error ("invalid Haskell package id " ++ show pkg)) (simpleParse pkg)
58− Cabal.PackageName name = Cabal.pkgName pkgId
57+ name = Cabal.unPackageName (Cabal.packageName pkgId)
59− version = Cabal.pkgVersion pkgId
60
58
61 lookupVersion :: DB.Map DB.Version Cabal.GenericPackageDescription -> Maybe Cabal.GenericPackageDescription
59 lookupVersion :: DB.Map DB.Version Cabal.GenericPackageDescription -> Maybe Cabal.GenericPackageDescription
62− lookupVersion
63− | null (versionBranch version) = fmap snd . listToMaybe . reverse . DB.toAscList
60+ lookupVersion = fmap snd . listToMaybe . reverse . DB.toAscList
64− | otherwise = DB.lookup version
65−
66
61
67readFileMay :: String -> IO (Maybe String)
62readFileMay :: String -> IO (Maybe String)
68readFileMay file = do
63readFileMay file = do
@@ -117,9 +112,9 @@ sourceFromHackage optHash pkgId cabalDir = do
117 exitFailure
112 exitFailure
118
113
119showPackageIdentifier :: Cabal.GenericPackageDescription -> String
114showPackageIdentifier :: Cabal.GenericPackageDescription -> String
120−showPackageIdentifier pkgDesc = name ++ "-" ++ showVersion version where
115+showPackageIdentifier pkgDesc = name ++ "-" ++ display version where
121 pkgId = Cabal.package . Cabal.packageDescription $ pkgDesc
116 pkgId = Cabal.package . Cabal.packageDescription $ pkgDesc
122− Cabal.PackageName name = Cabal.packageName pkgId
117+ name = Cabal.unPackageName (Cabal.packageName pkgId)
123 version = Cabal.packageVersion pkgId
118 version = Cabal.packageVersion pkgId
124
119
125cabalFromPath :: FilePath -> MaybeT IO (Bool, Cabal.GenericPackageDescription)
120cabalFromPath :: FilePath -> MaybeT IO (Bool, Cabal.GenericPackageDescription)