git.iko.soy/typeable/cabal2nix
on master help sign in
Stop doing automatic jailbreaks.

This greatly simplifies our code and the resulting expressions fail during the configure stage rather (giving a meaningful error message) than at compile-time (with some bizarre library-specific type error).

commit950a7f449afa4fe4d9ccac9be74019f3024caf30 authorPeter Simons <simons@cryp.to> dateFri 30 Sep 2016, 23:18 (10 years ago) parentc0b597f
1 file changed+30−36
src/Distribution/Nixpkgs/Haskell/FromCabal.hs+30−36
src/Distribution/Nixpkgs/Haskell/FromCabal.hs+30−36
@@ -34,41 +34,26 @@ type HaskellResolver = Dependency -> Bool
3434type NixpkgsResolver = Identifier -> Maybe Binding
3535
3636fromGenericPackageDescription :: HaskellResolver -> NixpkgsResolver -> Platform -> CompilerInfo -> FlagAssignment -> [Constraint] -> GenericPackageDescription -> Derivation
37−fromGenericPackageDescription haskellResolver nixpkgsResolver arch compiler flags constraints descr'' =
38− -- TODO: This logic needs simplification and cleanup. :-(
39− case finalize haskellResolver of
40− Left _ -> case finalize jailbrokenResolver of
41− Left missing -> case finalize (const True) of
42− Left missing' -> error $ "finalizePackageDescription complains about missing dependencies \
43− \even though we told it that everything exists: " ++ show missing'
44− Right (descr_,_) -> fromPackageDescription haskellResolver nixpkgsResolver True missing flags descr_
45− Right _ -> fromPackageDescription haskellResolver nixpkgsResolver True [] flags descr
46− Right _ -> fromPackageDescription haskellResolver nixpkgsResolver False [] flags descr
47− where
48− descr :: PackageDescription
49− Right (descr,_) = finalize jailbrokenResolver
50−
51− -- We have to call the Cabal finalizer several times with different resolver functions, and this
52− -- convenience function makes our code shorter.
53− finalize :: HaskellResolver -> Either [Dependency] (PackageDescription,FlagAssignment)
54− finalize resolver = finalizePackageDescription flags resolver arch compiler constraints descr'
55−
56− jailbrokenResolver :: HaskellResolver
57− jailbrokenResolver (Dependency pkg _) = haskellResolver (Dependency pkg anyVersion)
58−
59− -- A variant of the cabal file that has all test suites enabled to ensure
60− -- that their dependencies are recognized by finalizePackageDescription.
61− descr' :: GenericPackageDescription
62− descr' = descr'' { condTestSuites = flaggedTests }
63−
64− flaggedTests :: [(String, CondTree ConfVar [Dependency] TestSuite)]
65− flaggedTests = map (second (mapTreeData enableTest)) (condTestSuites descr'')
66−
67− enableTest :: TestSuite -> TestSuite
68− enableTest t = t { testEnabled = True }
69−
70−fromPackageDescription :: HaskellResolver -> NixpkgsResolver -> Bool -> [Dependency] -> FlagAssignment -> PackageDescription -> Derivation
71−fromPackageDescription haskellResolver nixpkgsResolver mismatchedDeps missingDeps flags (PackageDescription {..}) = normalize $ postProcess $ nullDerivation
37+fromGenericPackageDescription haskellResolver nixpkgsResolver arch compiler flags constraints genDesc =
38+ fromPackageDescription haskellResolver nixpkgsResolver missingDeps flags descr
39+ where
40+ -- We have to call the Cabal finalizer several times with different resolver
41+ -- functions, and this convenience function makes our code shorter.
42+ finalize :: HaskellResolver -> Either [Dependency] (PackageDescription,FlagAssignment)
43+ finalize resolver = finalizePackageDescription flags resolver arch compiler constraints (enableTests genDesc)
44+
45+ descr :: PackageDescription; missingDeps :: [Dependency]
46+ (descr,missingDeps) = case finalize jailbrokenResolver of
47+ Left m -> case finalize (const True) of
48+ Left _ -> error ("Cabal cannot finalize " ++ display (packageId genDesc))
49+ Right (d,_) -> (d,m)
50+ Right (d,_) -> (d,[])
51+
52+ jailbrokenResolver :: HaskellResolver
53+ jailbrokenResolver (Dependency pkg _) = haskellResolver (Dependency pkg anyVersion)
54+
55+fromPackageDescription :: HaskellResolver -> NixpkgsResolver -> [Dependency] -> FlagAssignment -> PackageDescription -> Derivation
56+fromPackageDescription haskellResolver nixpkgsResolver missingDeps flags (PackageDescription {..}) = normalize $ postProcess $ nullDerivation
7257 & isLibrary .~ isJust library
7358 & pkgid .~ package
7459 & revision .~ xrev
@@ -82,7 +67,7 @@ fromPackageDescription haskellResolver nixpkgsResolver mismatchedDeps missingDep
8267 & configureFlags .~ mempty
8368 & cabalFlags .~ flags
8469 & runHaddock .~ maybe True (not . null . exposedModules) library
85− & jailbreak .~ (mismatchedDeps || not (null missingDeps))
70+ & jailbreak .~ False
8671 & doCheck .~ True
8772 & testTarget .~ mempty
8873 & hyperlinkSource .~ True
@@ -137,3 +122,12 @@ fromPackageDescription haskellResolver nixpkgsResolver mismatchedDeps missingDep
137122
138123bindNull :: Identifier -> Binding
139124bindNull i = binding # (i, path # ["null"])
125+
126+enableTests :: GenericPackageDescription -> GenericPackageDescription
127+enableTests gd = gd { condTestSuites = flaggedTests }
128+ where
129+ flaggedTests :: [(String, CondTree ConfVar [Dependency] TestSuite)]
130+ flaggedTests = map (second (mapTreeData enableTest)) (condTestSuites gd)
131+
132+ enableTest :: TestSuite -> TestSuite
133+ enableTest t = t { testEnabled = True }