Skip to content

Commit 98ca24d

Browse files
angermanrvl
andauthored
Add support for stack.yaml flags. (input-output-hk#56)
* Add support for stack.yaml flags. Fixes input-output-hk#54 * Update stack2nix/Stack2nix.hs Co-Authored-By: Rodney Lorrimar <dev@rodney.id.au>
1 parent 29b1881 commit 98ca24d

File tree

4 files changed

+34
-9
lines changed

4 files changed

+34
-9
lines changed

nix-tools/nix-tools.cabal

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,7 @@ executable stack-to-nix
166166
, http-client-tls
167167
, http-client
168168
, http-types
169+
, unordered-containers
169170
hs-source-dirs: stack2nix
170171
default-language: Haskell2010
171172

nix-tools/stack2nix/Stack2nix.hs

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,9 @@ import Stack2nix.Project
3939
import Stack2nix.Stack (Stack(..), Dependency(..), Location(..))
4040
import Stack2nix.External.Resolve
4141

42+
import qualified Data.HashMap.Strict as HM
43+
44+
4245
doStack2nix :: Args -> IO ()
4346
doStack2nix args = do
4447
let pkgsNix = argOutputDir args </> "pkgs.nix"
@@ -57,8 +60,9 @@ stackexpr args =
5760
=<< resolveSnapshot value
5861

5962
stack2nix :: Args -> Stack -> IO NExpr
60-
stack2nix args stack@(Stack resolver compiler _) =
63+
stack2nix args stack@(Stack resolver compiler _ _) =
6164
do let extraDeps = extraDeps2nix stack
65+
flags = flags2nix stack
6266
let _f_ = mkSym "f"
6367
_import_ = mkSym "import"
6468
_mkForce_ = mkSym "mkForce"
@@ -68,7 +72,7 @@ stack2nix args stack@(Stack resolver compiler _) =
6872
packages <- packages2nix args stack
6973
return . mkNonRecSet $
7074
[ "extras" $= ("hackage" ==> mkNonRecSet
71-
([ "packages" $= (extraDeps $// packages) ]
75+
([ "packages" $= (extraDeps $// packages $// flags) ]
7276
++ [ "compiler.version" $= fromString (quoted ver)
7377
| (Just c) <- [compiler], let ver = filter (`elem` (".0123456789" :: [Char])) c]
7478
++ [ "compiler.nix-name" $= fromString (quoted name)
@@ -87,7 +91,7 @@ stack2nix args stack@(Stack resolver compiler _) =
8791
-- { name.revision = hackage.name.version.revisions.default; }
8892
--
8993
extraDeps2nix :: Stack -> NExpr
90-
extraDeps2nix (Stack _ _ pkgs) =
94+
extraDeps2nix (Stack _ _ pkgs _) =
9195
let extraDeps = [(pkgId, info) | PkgIndex pkgId info <- pkgs]
9296
in mkNonRecSet $ [ (quoted (toText pkg)) $= (mkSym "hackage" @. toText pkg @. quoted (toText ver) @. "revisions" @. "default")
9397
| (PackageIdentifier pkg ver, Nothing) <- extraDeps ]
@@ -100,6 +104,18 @@ extraDeps2nix (Stack _ _ pkgs) =
100104
toText :: Text a => a -> T.Text
101105
toText = fromString . show . disp
102106

107+
-- | Converts 'PackageFlags' into @{ packageName = { flagA = BOOL; flagB = BOOL; }; }@
108+
flags2nix :: Stack -> NExpr
109+
flags2nix (Stack _ _ _ pkgFlags) =
110+
mkNonRecSet [ quoted pkgName $= mkNonRecSet [ quoted flag $= mkBool val
111+
| (flag, val) <- HM.toList flags
112+
]
113+
| (pkgName, flags) <- HM.toList pkgFlags
114+
]
115+
where
116+
toText :: Text a => a -> T.Text
117+
toText = fromString . show . disp
118+
103119

104120
writeDoc :: FilePath -> Doc ann -> IO ()
105121
writeDoc file doc =
@@ -110,7 +126,7 @@ writeDoc file doc =
110126

111127
-- makeRelativeToCurrentDirectory
112128
packages2nix :: Args -> Stack-> IO NExpr
113-
packages2nix args (Stack _ _ pkgs) =
129+
packages2nix args (Stack _ _ pkgs _) =
114130
do cwd <- getCurrentDirectory
115131
fmap (mkNonRecSet . concat) . forM pkgs $ \case
116132
(LocalPath folder) ->

nix-tools/stack2nix/Stack2nix/External/Resolve.hs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,13 +35,13 @@ decodeURLEither url
3535
-- a file, resolve that file and merge the snapshot into the
3636
-- @Stack@ record.
3737
resolveSnapshot :: Stack -> IO Stack
38-
resolveSnapshot stack@(Stack resolver compiler pkgs)
38+
resolveSnapshot stack@(Stack resolver compiler pkgs flags)
3939
= if ".yaml" `isSuffixOf` resolver
4040
then do evalue <- if ("http://" `isPrefixOf` resolver) || ("https://" `isPrefixOf` resolver)
4141
then decodeURLEither resolver
4242
else decodeFileEither resolver
4343
case evalue of
4444
Left e -> error (show e)
45-
Right (Snapshot resolver' compiler' _name pkgs') ->
46-
pure $ Stack resolver' (compiler' <|> compiler) (pkgs <> pkgs')
45+
Right (Snapshot resolver' compiler' _name pkgs' flags') ->
46+
pure $ Stack resolver' (compiler' <|> compiler) (pkgs <> pkgs') (flags <> flags')
4747
else pure stack

nix-tools/stack2nix/Stack2nix/Stack.hs

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
{-# LANGUAGE OverloadedStrings #-}
2+
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
23

34
module Stack2nix.Stack
45
( Resolver
@@ -20,13 +21,15 @@ import Data.List (isSuffixOf)
2021
import qualified Data.Text as T
2122
import Data.Aeson
2223
import Control.Applicative ((<|>))
24+
import Data.Monoid (mempty)
2325

2426
import Distribution.Types.PackageName
2527
import Distribution.Types.PackageId
2628
import Distribution.Compat.ReadP hiding (Parser)
2729
import Distribution.Text
2830
import Distribution.Types.Version (nullVersion)
2931

32+
import qualified Data.HashMap.Strict as HM
3033

3134
--------------------------------------------------------------------------------
3235
-- The stack.yaml file
@@ -113,8 +116,11 @@ data Dependency
113116
-- | Archive ...
114117
deriving (Show)
115118

119+
-- flags are { pkg -> { flag -> bool } }
120+
type PackageFlags = HM.HashMap T.Text (HM.HashMap T.Text Bool)
121+
116122
data Stack
117-
= Stack Resolver (Maybe Compiler) [Dependency]
123+
= Stack Resolver (Maybe Compiler) [Dependency] PackageFlags
118124
deriving (Show)
119125

120126
-- stack supports custom snapshots
@@ -125,7 +131,7 @@ data StackSnapshot
125131
(Maybe Compiler) -- possible compiler override for the snapshot
126132
Name -- name
127133
[Dependency] -- packages
128-
-- [Package -> [Flag]] -- flags
134+
PackageFlags -- flags
129135
-- [PackageName] -- drop-packages
130136
-- [PackageName -> Bool] -- hidden
131137
-- [package -> [Opt]] -- ghc-options
@@ -167,13 +173,15 @@ instance FromJSON Stack where
167173
<*> s .:? "compiler" .!= Nothing
168174
<*> ((<>) <$> s .:? "packages" .!= [LocalPath "."]
169175
<*> s .:? "extra-deps" .!= [])
176+
<*> s .:? "flags" .!= mempty
170177

171178
instance FromJSON StackSnapshot where
172179
parseJSON = withObject "Snapshot" $ \s -> Snapshot
173180
<$> s .: "resolver"
174181
<*> s .:? "compiler" .!= Nothing
175182
<*> s .: "name"
176183
<*> s .:? "packages" .!= []
184+
<*> s .:? "flags" .!= mempty
177185

178186
instance FromJSON Dependency where
179187
-- Note: we will parse foo-X.Y.Z as a package.

0 commit comments

Comments
 (0)