git.iko.soy/typeable/stackage2nix
on master help sign in
Generate stack-yaml-packages.nix file
commit683b3ff419318c74e95ee0db896b73faa8ff758a authorDmitry Bushev <bushevdv@gmail.com> dateWed 20 Jun 2018, 14:45 (8 years ago) parente1d3a67
5 files changed+92−58
src/Distribution/Nixpkgs/Haskell/Stack/PrettyPrinting.hs+7−8 src/Runner.hs+20−12 src/Runner/Cli.hs+23−13 src/Stack/Config.hs+20−7 test/Stack/ConfigSpec.hs+22−18
src/Distribution/Nixpkgs/Haskell/Stack/PrettyPrinting.hs+7−8
@@ -75,7 +75,6 @@ overrideHaskellPackages oc packages = vcat
7575 , nest 2 "inherit pkgs stdenv;"
7676 , nest 2 "inherit (self) callPackage;"
7777 , "};"
78− , attr "stackYamlPackages" (stackYamlPackages $ pkgName . packageId <$> packages)
7978 ]
8079 , "in callPackage (nixpkgs.path + \"/pkgs/development/haskell-modules\") {"
8180 , nest 2 $ vcat
@@ -86,9 +85,10 @@ overrideHaskellPackages oc packages = vcat
8685 , attr "configurationCommon" "args: self: super: {}"
8786 , "inherit haskellLib;"
8887 ]
89− , "} // { inherit stackYamlPackages; }"
90− ] where
91− nixGhc = toNixGhcVersion (oc ^. ocGhc)
88+ , "}"
89+ ]
90+ where
91+ nixGhc = toNixGhcVersion (oc ^. ocGhc)
9292
9393overrideStackage :: StackResolver -> FilePath -> NonEmpty Derivation -> Doc
9494overrideStackage stackResolver nixpkgsPath packages = vcat
@@ -100,12 +100,11 @@ overrideStackage stackResolver nixpkgsPath packages = vcat
100100 , nest 2 $ vcat
101101 [ "stackPackages ="
102102 , nest 2 $ overridePackages packages <> semi
103− , attr "stackYamlPackages" (stackYamlPackages $ pkgName . packageId <$> packages)
104103 ]
105104 , "in nixpkgs.haskell.packages.stackage." <> toNixStackResolver stackResolver <> ".override {"
106105 , nest 2
107106 $ attr "packageSetConfig" "self: super: stackPackages { inherit (nixpkgs) pkgs stdenv; inherit (self) callPackage; } super"
108− , "} // { inherit stackYamlPackages; }"
107+ , "}"
109108 ]
110109
111110pPrintHaskellPackages :: OverrideConfig -> Doc
@@ -148,14 +147,14 @@ pPrintHaskellPackages oc = vcat
148147 , "in extensible-self"
149148 ]
150149
151−stackYamlPackages :: NonEmpty PackageName -> Doc
150+stackYamlPackages :: NonEmpty Derivation -> Doc
152151stackYamlPackages packages = hcat
153152 [ "self: { "
154153 , "inherit (self) "
155154 , text . intercalate " " $ NE.toList packageNames
156155 , "; }" ]
157156 where
158− packageNames = unPackageName <$> packages
157+ packageNames = unPackageName . pkgName . packageId <$> packages
159158
160159toNixGhcVersion :: Version -> Doc
161160toNixGhcVersion = (<>) "ghc" . toNixVersion . show . disp
src/Runner.hs+20−12
@@ -25,8 +25,9 @@ import Stackage.Types
2525import System.IO (withFile, IOMode(..), hPutStrLn)
2626import Text.PrettyPrint.HughesPJClass (Doc, render)
2727
28−import qualified Data.Set as Set
28+import qualified Data.List.NonEmpty as NE
2929import qualified Data.Map as Map
30+import qualified Data.Set as Set
3031import qualified LtsHaskell as LH
3132
3233run :: IO ()
@@ -51,6 +52,11 @@ run = do
5152 stackPackagesConfig = mkStackPackagesConfig opts
5253 stackConfPackages <- traverse (fmap mkNode . packageDerivation stackPackagesConfig hackageDb)
5354 $ stackConf ^. scPackages
55+ stackConfExtraDeps <- traverse (fmap mkNode . packageDerivation stackPackagesConfig hackageDb)
56+ $ stackConf ^. scExtraDeps
57+ let
58+ stackConfAllPackages = maybe stackConfPackages ((<>) stackConfPackages)
59+ $ NE.nonEmpty stackConfExtraDeps
5460
5561 case buildTarget of
5662 TargetStackageClosure -> do
@@ -58,11 +64,11 @@ run = do
5864 let
5965 overrideConfig = mkOverrideConfig opts (siGhcVersion $ bpSystemInfo buildPlan)
6066 stackageSetConfig = if opts ^. optTweaks . tExtraDepsRevisionLatest
61− then extraDepsLatestConfig stackConfPackages packageSetConfig
67+ then extraDepsLatestConfig stackConfAllPackages packageSetConfig
6268 else packageSetConfig
6369 stackagePackages <- buildStackagePackages stackageSetConfig buildPlan
6470 let
65− reachable = reachableDeps stackConfPackages
71+ reachable = reachableDeps stackConfAllPackages
6672 -- Nixpkgs generic-builder puts hscolour on path for all libraries
6773 withHscolour pkgs =
6874 let hscolour = F.find ((== "hscolour") . nodeName) stackagePackages
@@ -84,14 +90,14 @@ run = do
8490 writeOutFile buildPlanFile (opts ^. optOutStackageConfig)
8591 $ pPrintOutConfig (bpSystemInfo buildPlan) nodes
8692 writeOutFile (stackYaml ^. syFilePath) (opts ^. optOutDerivation)
87− $ PP.overrideHaskellPackages overrideConfig (view nodeDerivation <$> stackConfPackages)
93+ $ PP.overrideHaskellPackages overrideConfig (view nodeDerivation <$> stackConfAllPackages)
8894
8995 TargetStackagePackages -> do
9096 (buildPlanFile, buildPlan, packageSetConfig) <- loadStackageBuildPlan hackageDb stackResolver opts sopts
9197 let
9298 overrideConfig = mkOverrideConfig opts (siGhcVersion $ bpSystemInfo buildPlan)
9399 stackageSetConfig = if opts ^. optTweaks . tExtraDepsRevisionLatest
94− then extraDepsLatestConfig stackConfPackages packageSetConfig
100+ then extraDepsLatestConfig stackConfAllPackages packageSetConfig
95101 else packageSetConfig
96102 -- stackageLoader mHash pkgId =
97103 -- if pkgName pkgId `Set.member` reachable
@@ -104,14 +110,16 @@ run = do
104110 writeOutFile buildPlanFile (opts ^. optOutStackageConfig)
105111 $ pPrintOutConfig (bpSystemInfo buildPlan) nodes
106112 writeOutFile (stackYaml ^. syFilePath) (opts ^. optOutDerivation)
107− $ PP.overrideHaskellPackages overrideConfig (view nodeDerivation <$> stackConfPackages)
113+ $ PP.overrideHaskellPackages overrideConfig (view nodeDerivation <$> stackConfAllPackages)
108114
109− TargetStackageOverride ->
110− writeOutFile (stackYaml ^. syFilePath) (opts ^. optOutDerivation) $
111− PP.overrideStackage
112− (stackConf ^. scResolver)
113− (opts ^. optNixpkgsRepository)
114− (view nodeDerivation <$> stackConfPackages)
115+ TargetStackageOverride -> do
116+ writeOutFile (stackYaml ^. syFilePath) (opts ^. optOutDerivation)
117+ $ PP.overrideStackage
118+ (stackConf ^. scResolver)
119+ (opts ^. optNixpkgsRepository)
120+ (view nodeDerivation <$> stackConfAllPackages)
121+ writeOutFile (stackYaml ^. syFilePath) (opts ^. optOutStackYamlPackages)
122+ $ PP.stackYamlPackages (view nodeDerivation <$> stackConfPackages)
115123
116124 -- Generate Stackage packages from resolver
117125 OriginResolver stackResolver -> do
src/Runner/Cli.hs+23−13
@@ -46,19 +46,20 @@ data StackageOptions = StackageOptions
4646makeLenses ''StackageOptions
4747
4848data Options = Options
49− { _optAllCabalHashesRepo :: Maybe FilePath
50− , _optLtsHaskellRepo :: Maybe FilePath
51− , _optOutStackagePackages :: FilePath
52− , _optOutStackageConfig :: FilePath
53− , _optOutDerivation :: FilePath
54− , _optDoCheckPackages :: Bool
55− , _optDoHaddockPackages :: Bool
56− , _optTweaks :: Tweaks
57− , _optHackageDb :: Maybe FilePath
58− , _optNixpkgsRepository :: FilePath
59− , _optCompilerId :: CompilerId
60− , _optPlatform :: Platform
61− , _optConfigOrigin :: ConfigOrigin
49+ { _optAllCabalHashesRepo :: Maybe FilePath
50+ , _optLtsHaskellRepo :: Maybe FilePath
51+ , _optOutStackagePackages :: FilePath
52+ , _optOutStackageConfig :: FilePath
53+ , _optOutDerivation :: FilePath
54+ , _optOutStackYamlPackages :: FilePath
55+ , _optDoCheckPackages :: Bool
56+ , _optDoHaddockPackages :: Bool
57+ , _optTweaks :: Tweaks
58+ , _optHackageDb :: Maybe FilePath
59+ , _optNixpkgsRepository :: FilePath
60+ , _optCompilerId :: CompilerId
61+ , _optPlatform :: Platform
62+ , _optConfigOrigin :: ConfigOrigin
6263 } deriving (Show)
6364
6465makeLenses ''Options
@@ -79,6 +80,7 @@ options = Options
7980 <*> outStackagePackages
8081 <*> outStackageConfig
8182 <*> outDerivation
83+ <*> outStackYamlPackages
8284 <*> doCheckPackages
8385 <*> doHaddockPackages
8486 <*> tweaks
@@ -140,6 +142,14 @@ outDerivation = option str
140142 <> value "default.nix"
141143 <> showDefaultWith id )
142144
145+outStackYamlPackages :: Parser FilePath
146+outStackYamlPackages = option str
147+ ( long "out-stack-yaml-packages"
148+ <> metavar "NIX_FILE"
149+ <> help "path to output stackage.yaml packages list"
150+ <> value "stack-yaml-packages.nix"
151+ <> showDefaultWith id )
152+
143153doCheckPackages :: Parser Bool
144154doCheckPackages = flag True False
145155 ( long "no-check"
src/Stack/Config.hs+20−7
@@ -6,7 +6,7 @@ import Control.Lens
66import Data.Bifunctor
77import Data.ByteString as BS
88import Data.Coerce
9−import Data.Foldable as F
9+import Data.List as L
1010import Data.List.NonEmpty as NE
1111import Data.Maybe
1212import Data.Semigroup
@@ -72,22 +72,35 @@ makeLenses ''StackPackage
7272data StackConfig = StackConfig
7373 { _scResolver :: StackResolver
7474 , _scPackages :: NonEmpty StackPackage
75+ , _scExtraDeps :: [StackPackage]
7576 } deriving (Eq, Ord, Show)
7677
7778makeLenses ''StackConfig
7879
80+scAllPackages :: Getter StackConfig (NonEmpty StackPackage)
81+scAllPackages = to allPs
82+ where
83+ allPs sc = maybe ps ((<>) ps) (NE.nonEmpty ed)
84+ where
85+ ps = sc ^. scPackages
86+ ed = sc ^. scExtraDeps
87+
7988fromYamlConfig :: Yaml.Config -> StackConfig
8089fromYamlConfig c = StackConfig{..}
8190 where
8291 _scResolver = coerce $ c ^. cResolver
83− -- 'NE.nub' replicates Stack behavior of having a Set of packages rather than list
84− _scPackages = NE.nub $ F.foldl' (<>) nePackages yamlExtraDeps
92+ -- 'nub' replicates Stack behavior of having a Set of packages rather than list
93+ _scPackages = NE.nub nePackages
94+ _scExtraDeps = L.nub $ extraDeps ++ yamlExtraDeps
8595 nePackages = fromMaybe (pure defaultPackage)
86− $ fmap sconcat
87− $ NE.nonEmpty yamlPackages
88− yamlPackages = fromYamlPackage packagesSimplePath False
96+ $ NE.nonEmpty packages
97+ -- yaml packages section can contain extra-deps
98+ (extraDeps, packages) = L.partition (view spExtraDep) yamlPackages
99+ yamlPackages = L.concatMap NE.toList
100+ $ fromYamlPackage packagesSimplePath False
89101 <$> fromMaybe mempty (c ^. cPackages)
90− yamlExtraDeps = fromYamlPackage extraDepsSimplePath True
102+ yamlExtraDeps = L.concatMap NE.toList
103+ $ fromYamlPackage extraDepsSimplePath True
91104 <$> fromMaybe mempty (c ^. cExtraDeps)
92105 defaultPackage = StackPackage (PlFilePath ".") False Nothing
93106
test/Stack/ConfigSpec.hs+22−18
@@ -51,6 +51,7 @@ minimalConf = StackConfig
5151 { _scResolver = StackResolver "lts-10.0"
5252 , _scPackages = NE.fromList
5353 [ StackPackage (PlFilePath ".") False Nothing]
54+ , _scExtraDeps = []
5455 }
5556
5657packageDefaultBs :: ByteString
@@ -73,10 +74,11 @@ packages:
7374
7475packageSimpleListConf :: StackConfig
7576packageSimpleListConf = StackConfig
76− { _scResolver = StackResolver "lts-10.0"
77− , _scPackages = NE.fromList
77+ { _scResolver = StackResolver "lts-10.0"
78+ , _scPackages = NE.fromList
7879 [ StackPackage (PlFilePath "client") False Nothing
7980 , StackPackage (PlFilePath "server") False Nothing ]
81+ , _scExtraDeps = []
8082 }
8183
8284packageLocationsBs :: ByteString
@@ -102,11 +104,12 @@ packages:
102104
103105packageLocationsConf :: StackConfig
104106packageLocationsConf = StackConfig
105− { _scResolver = StackResolver "lts-10.0"
106− , _scPackages = NE.fromList
107+ { _scResolver = StackResolver "lts-10.0"
108+ , _scPackages = NE.fromList
107109 [ StackPackage (PlFilePath "humble/package") False (Just "client")
108− , StackPackage (PlFilePath "humble/package") False (Just "server")
109− , StackPackage (PlUri $ stUri "https://example.com/foo/bar/baz-0.0.2.tar.gz") True (Just "extra")
110+ , StackPackage (PlFilePath "humble/package") False (Just "server") ]
111+ , _scExtraDeps =
112+ [ StackPackage (PlUri $ stUri "https://example.com/foo/bar/baz-0.0.2.tar.gz") True (Just "extra")
110113 , StackPackage (PlRepo $ Repo (Vcs "git") "git@github.com:example/mega-repo" "6a86ee32e5b869a877151f74064572225e1a0000") True (Just "subdir1")
111114 , StackPackage (PlRepo $ Repo (Vcs "git") "git@github.com:example/mega-repo" "6a86ee32e5b869a877151f74064572225e1a0000") True (Just "subdir2")
112115 ]
@@ -122,10 +125,10 @@ extra-deps:
122125
123126packageExtraDepsConf :: StackConfig
124127packageExtraDepsConf = StackConfig
125− { _scResolver = StackResolver "lts-10.0"
126− , _scPackages = NE.fromList
127− [ StackPackage (PlFilePath ".") False Nothing
128− , StackPackage (PlIndex $ PackageIndex "acme-missiles-0.3" Nothing) True Nothing
128+ { _scResolver = StackResolver "lts-10.0"
129+ , _scPackages = NE.fromList [ StackPackage (PlFilePath ".") False Nothing ]
130+ , _scExtraDeps =
131+ [ StackPackage (PlIndex $ PackageIndex "acme-missiles-0.3" Nothing) True Nothing
129132 , StackPackage (PlIndex $ PackageIndex "humble-package-1" Nothing) True Nothing ]
130133 }
131134
@@ -142,11 +145,12 @@ extra-deps:
142145
143146packageMixedConf :: StackConfig
144147packageMixedConf = StackConfig
145− { _scResolver = StackResolver "lts-10.0"
146− , _scPackages = NE.fromList
148+ { _scResolver = StackResolver "lts-10.0"
149+ , _scPackages = NE.fromList
147150 [ StackPackage (PlFilePath "client") False Nothing
148− , StackPackage (PlFilePath "server") False Nothing
149− , StackPackage (PlIndex $ PackageIndex "acme-missiles-0.3" Nothing) True Nothing
151+ , StackPackage (PlFilePath "server") False Nothing ]
152+ , _scExtraDeps =
153+ [ StackPackage (PlIndex $ PackageIndex "acme-missiles-0.3" Nothing) True Nothing
150154 , StackPackage (PlIndex $ PackageIndex "humble-package-1" Nothing) True Nothing ]
151155 }
152156
@@ -172,10 +176,10 @@ extra-deps:
172176
173177packageExtraDepsNewConf :: StackConfig
174178packageExtraDepsNewConf = StackConfig
175− { _scResolver = StackResolver "lts-10.0"
176− , _scPackages = NE.fromList
177− [ StackPackage (PlFilePath ".") False Nothing
178− , StackPackage (PlFilePath "vendor/lib") True Nothing
179+ { _scResolver = StackResolver "lts-10.0"
180+ , _scPackages = NE.fromList [ StackPackage (PlFilePath ".") False Nothing ]
181+ , _scExtraDeps =
182+ [ StackPackage (PlFilePath "vendor/lib") True Nothing
179183 , StackPackage (PlIndex $ PackageIndex "acme-missiles-0.3" Nothing) True Nothing
180184 , StackPackage (PlRepo $ Repo (Vcs "git") "git@github.com:yesodweb/wai" "2f8a8e1b771829f4a8a77c0111352ce45a14c30f") True (Just "auto-update")
181185 , StackPackage (PlRepo $ Repo (Vcs "git") "git@github.com:yesodweb/wai" "2f8a8e1b771829f4a8a77c0111352ce45a14c30f") True (Just "wai")