Skip to content

Commit 87d97c5

Browse files
hamishmackangerman
authored andcommitted
Treat ghc-options in stack.yaml like flags (input-output-hk#65)
Include modules that add `ghcOptions` attribute to the package
1 parent 5d4649a commit 87d97c5

File tree

3 files changed

+34
-21
lines changed

3 files changed

+34
-21
lines changed

stack2nix/Stack2nix.hs

Lines changed: 23 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ import Cabal2Nix.Util
3636
import Stack2nix.Cache (appendCache, cacheHits)
3737
import Stack2nix.CLI (Args(..))
3838
import Stack2nix.Project
39-
import Stack2nix.Stack (Stack(..), Dependency(..), Location(..))
39+
import Stack2nix.Stack (Stack(..), Dependency(..), Location(..), PackageFlags, GhcOptions)
4040
import Stack2nix.External.Resolve
4141

4242
import qualified Data.HashMap.Strict as HM
@@ -60,16 +60,17 @@ stackexpr args =
6060
=<< resolveSnapshot value
6161

6262
stack2nix :: Args -> Stack -> IO NExpr
63-
stack2nix args stack@(Stack resolver compiler _ _) =
64-
do let extraDeps = extraDeps2nix stack
65-
flags = flags2nix stack
63+
stack2nix args stack@(Stack resolver compiler pkgs pkgFlags ghcOpts) =
64+
do let extraDeps = extraDeps2nix pkgs
65+
flags = flags2nix pkgFlags
66+
ghcOptions = ghcOptions2nix ghcOpts
6667
let _f_ = mkSym "f"
6768
_import_ = mkSym "import"
6869
_mkForce_ = mkSym "mkForce"
6970
_isFunction_ = mkSym "isFunction"
7071
_mapAttrs_ = mkSym "mapAttrs"
7172
_config_ = mkSym "config"
72-
packages <- packages2nix args stack
73+
packages <- packages2nix args pkgs
7374
return . mkNonRecSet $
7475
[ "extras" $= ("hackage" ==> mkNonRecSet
7576
([ "packages" $= mkNonRecSet (extraDeps <> packages) ]
@@ -78,7 +79,9 @@ stack2nix args stack@(Stack resolver compiler _ _) =
7879
++ [ "compiler.nix-name" $= fromString (quoted name)
7980
| (Just c) <- [compiler], let name = filter (`elem` ((['a'..'z']++['0'..'9']) :: [Char])) c]))
8081
, "resolver" $= fromString (quoted resolver)
81-
, "modules" $= mkList [ mkNonRecSet [ "packages" $= mkNonRecSet flags ] ]
82+
, "modules" $= mkList [
83+
mkNonRecSet [ "packages" $= mkNonRecSet flags ]
84+
, mkNonRecSet [ "packages" $= mkNonRecSet ghcOptions ] ]
8285
] ++ [
8386
"compiler" $= fromString (quoted c) | (Just c) <- [compiler]
8487
]
@@ -91,8 +94,8 @@ stack2nix args stack@(Stack resolver compiler _ _) =
9194
--
9295
-- { name.revision = hackage.name.version.revisions.default; }
9396
--
94-
extraDeps2nix :: Stack -> [Binding NExpr]
95-
extraDeps2nix (Stack _ _ pkgs _) =
97+
extraDeps2nix :: [Dependency] -> [Binding NExpr]
98+
extraDeps2nix pkgs =
9699
let extraDeps = [(pkgId, info) | PkgIndex pkgId info <- pkgs]
97100
in [ (quoted (toText pkg)) $= (mkSym "hackage" @. toText pkg @. quoted (toText ver) @. "revisions" @. "default")
98101
| (PackageIdentifier pkg ver, Nothing) <- extraDeps ]
@@ -105,20 +108,24 @@ extraDeps2nix (Stack _ _ pkgs _) =
105108
toText :: Text a => a -> T.Text
106109
toText = fromString . show . disp
107110

108-
-- | Converts 'PackageFlags' into @{ packageName = { flagA = BOOL; flagB = BOOL; }; }@
109-
flags2nix :: Stack -> [Binding NExpr]
110-
flags2nix (Stack _ _ _ pkgFlags) =
111+
-- | Converts 'PackageFlags' into @{ packageName = { flags = { flagA = BOOL; flagB = BOOL; }; }; }@
112+
flags2nix :: PackageFlags -> [Binding NExpr]
113+
flags2nix pkgFlags =
111114
[ quoted pkgName $= mkNonRecSet
112115
[ "flags" $= mkNonRecSet [ quoted flag $= mkBool val
113116
| (flag, val) <- HM.toList flags
114117
]
115118
]
116119
| (pkgName, flags) <- HM.toList pkgFlags
117120
]
118-
where
119-
toText :: Text a => a -> T.Text
120-
toText = fromString . show . disp
121121

122+
-- | Converts 'GhcOptions' into @{ packageName = { ghcOptions = "..."; }; }@
123+
ghcOptions2nix :: GhcOptions -> [Binding NExpr]
124+
ghcOptions2nix ghcOptions =
125+
[ quoted pkgName $= mkNonRecSet
126+
[ "package" $= mkNonRecSet [ "ghcOptions" $= mkStr opts ] ]
127+
| (pkgName, opts) <- HM.toList ghcOptions
128+
]
122129

123130
writeDoc :: FilePath -> Doc ann -> IO ()
124131
writeDoc file doc =
@@ -128,8 +135,8 @@ writeDoc file doc =
128135

129136

130137
-- makeRelativeToCurrentDirectory
131-
packages2nix :: Args -> Stack-> IO [Binding NExpr]
132-
packages2nix args (Stack _ _ pkgs _) =
138+
packages2nix :: Args -> [Dependency] -> IO [Binding NExpr]
139+
packages2nix args pkgs =
133140
do cwd <- getCurrentDirectory
134141
fmap concat . forM pkgs $ \case
135142
(LocalPath folder) ->

stack2nix/Stack2nix/External/Resolve.hs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,13 +35,14 @@ 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 flags)
38+
resolveSnapshot stack@(Stack resolver compiler pkgs flags ghcOptions)
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' flags') ->
45+
Right (Snapshot resolver' compiler' _name pkgs' flags' ghcOptions') ->
4646
pure $ Stack resolver' (compiler' <|> compiler) (pkgs <> pkgs') (flags <> flags')
47+
(ghcOptions <> ghcOptions')
4748
else pure stack

stack2nix/Stack2nix/Stack.hs

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,11 @@ module Stack2nix.Stack
1010
, URL
1111
, Rev
1212
, Stack(..)
13-
, Compiler(..)
1413
, Dependency(..)
1514
, Location(..)
1615
, StackSnapshot(..)
16+
, PackageFlags
17+
, GhcOptions
1718
) where
1819

1920
import Data.Char (isDigit)
@@ -119,8 +120,10 @@ data Dependency
119120
-- flags are { pkg -> { flag -> bool } }
120121
type PackageFlags = HM.HashMap T.Text (HM.HashMap T.Text Bool)
121122

123+
type GhcOptions = HM.HashMap T.Text T.Text
124+
122125
data Stack
123-
= Stack Resolver (Maybe Compiler) [Dependency] PackageFlags
126+
= Stack Resolver (Maybe Compiler) [Dependency] PackageFlags GhcOptions
124127
deriving (Show)
125128

126129
-- stack supports custom snapshots
@@ -134,7 +137,7 @@ data StackSnapshot
134137
PackageFlags -- flags
135138
-- [PackageName] -- drop-packages
136139
-- [PackageName -> Bool] -- hidden
137-
-- [package -> [Opt]] -- ghc-options
140+
GhcOptions -- ghc-options
138141
deriving (Show)
139142

140143
data Location
@@ -182,6 +185,7 @@ instance FromJSON Stack where
182185
<*> ((<>) <$> s .:? "packages" .!= [LocalPath "."]
183186
<*> s .:? "extra-deps" .!= [])
184187
<*> s .:? "flags" .!= mempty
188+
<*> s .:? "ghc-options" .!= mempty
185189

186190
instance FromJSON StackSnapshot where
187191
parseJSON = withObject "Snapshot" $ \s -> Snapshot
@@ -190,6 +194,7 @@ instance FromJSON StackSnapshot where
190194
<*> s .: "name"
191195
<*> s .:? "packages" .!= []
192196
<*> s .:? "flags" .!= mempty
197+
<*> s .:? "ghc-options" .!= mempty
193198

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

0 commit comments

Comments
 (0)