@@ -11,19 +11,20 @@ module Stack.Build.Source
11
11
( loadSourceMap
12
12
, SourceMap
13
13
, PackageSource (.. )
14
- , localFlags
14
+ , getLocalFlags
15
+ , getGhcOptions
15
16
, getLocalPackageViews
16
- , loadLocalPackage
17
17
, parseTargetsFromBuildOpts
18
18
, addUnlistedToBuildCache
19
+ , getDefaultPackageConfig
19
20
, getPackageConfig
20
21
) where
21
22
22
23
import Control.Applicative
23
24
import Control.Arrow ((&&&) )
24
25
import Control.Exception (assert , catch )
25
26
import Control.Monad
26
- import Control.Monad.Catch (MonadMask )
27
+ import Control.Monad.Catch (MonadMask , MonadCatch )
27
28
import Control.Monad.IO.Class
28
29
import Control.Monad.Logger
29
30
import Control.Monad.Reader (MonadReader , asks )
@@ -91,6 +92,7 @@ loadSourceMap needTargets boptsCli = do
91
92
locals <- mapM (loadLocalPackage boptsCli targets) $ Map. toList rawLocals
92
93
checkFlagsUsed boptsCli locals extraDeps0 (mbpPackages mbp0)
93
94
checkComponentsBuildable locals
95
+ warnAllowNewer mbp0
94
96
95
97
let
96
98
-- loadLocals returns PackageName (foo) and PackageIdentifier (bar-1.2.3) targets separately;
@@ -111,31 +113,34 @@ loadSourceMap needTargets boptsCli = do
111
113
-- Add the extra deps from the stack.yaml file to the deps grabbed from
112
114
-- the snapshot
113
115
extraDeps2 = Map. union
114
- (Map. map (\ v -> (v, Map. empty)) extraDeps0)
115
- (Map. map (mpiVersion &&& mpiFlags) extraDeps1)
116
+ (Map. map (\ v -> (v, Map. empty, [] )) extraDeps0)
117
+ (Map. map (\ mpi -> ( mpiVersion mpi, mpiFlags mpi, mpiGhcOptions mpi) ) extraDeps1)
116
118
117
- -- Overwrite any flag settings with those from the config file
119
+ -- Add flag and ghc-option settings from the config file / cli
118
120
extraDeps3 = Map. mapWithKey
119
- (\ n (v, f) -> PSUpstream v Local
120
- (case ( Map. lookup (Just n) $ boptsCLIFlags boptsCli
121
- , Map. lookup Nothing $ boptsCLIFlags boptsCli
122
- , Map. lookup n $ bcFlags bconfig
123
- ) of
124
- -- Didn't have any flag overrides, fall back to the flags
125
- -- defined in the snapshot.
126
- (Nothing , Nothing , Nothing ) -> f
127
- -- Either command line flag for this package, general
128
- -- command line flag, or flag in stack.yaml is defined.
129
- -- Take all of those and ignore the snapshot flags.
130
- (x, y, z) -> Map. unions
131
- [ fromMaybe Map. empty x
132
- , fromMaybe Map. empty y
133
- , fromMaybe Map. empty z
134
- ])
135
-
121
+ (\ n (v, flags0, ghcOptions0) ->
122
+ let flags =
123
+ case ( Map. lookup (Just n) $ boptsCLIFlags boptsCli
124
+ , Map. lookup Nothing $ boptsCLIFlags boptsCli
125
+ , Map. lookup n $ unPackageFlags $ bcFlags bconfig
126
+ ) of
127
+ -- Didn't have any flag overrides, fall back to the flags
128
+ -- defined in the snapshot.
129
+ (Nothing , Nothing , Nothing ) -> flags0
130
+ -- Either command line flag for this package, general
131
+ -- command line flag, or flag in stack.yaml is defined.
132
+ -- Take all of those and ignore the snapshot flags.
133
+ (x, y, z) -> Map. unions
134
+ [ fromMaybe Map. empty x
135
+ , fromMaybe Map. empty y
136
+ , fromMaybe Map. empty z
137
+ ]
138
+ ghcOptions =
139
+ ghcOptions0 ++
140
+ getGhcOptions bconfig boptsCli n False False
136
141
-- currently have no ability for extra-deps to specify their
137
142
-- cabal file hashes
138
- Nothing )
143
+ in PSUpstream v Local flags ghcOptions Nothing )
139
144
extraDeps2
140
145
141
146
let sourceMap = Map. unions
@@ -144,11 +149,45 @@ loadSourceMap needTargets boptsCli = do
144
149
in (packageName p, PSLocal lp)
145
150
, extraDeps3
146
151
, flip fmap (mbpPackages mbp) $ \ mpi ->
147
- PSUpstream (mpiVersion mpi) Snap (mpiFlags mpi) (mpiGitSHA1 mpi)
152
+ PSUpstream (mpiVersion mpi) Snap (mpiFlags mpi) (mpiGhcOptions mpi) ( mpiGitSHA1 mpi)
148
153
] `Map.difference` Map. fromList (map (, () ) (HashSet. toList wiredInPackages))
149
154
150
155
return (targets, mbp, locals, nonLocalTargets, sourceMap)
151
156
157
+ -- | All flags for a local package
158
+ getLocalFlags
159
+ :: BuildConfig
160
+ -> BuildOptsCLI
161
+ -> PackageName
162
+ -> Map FlagName Bool
163
+ getLocalFlags bconfig boptsCli name = Map. unions
164
+ [ Map. findWithDefault Map. empty (Just name) cliFlags
165
+ , Map. findWithDefault Map. empty Nothing cliFlags
166
+ , Map. findWithDefault Map. empty name (unPackageFlags (bcFlags bconfig))
167
+ ]
168
+ where
169
+ cliFlags = boptsCLIFlags boptsCli
170
+
171
+ getGhcOptions :: BuildConfig -> BuildOptsCLI -> PackageName -> Bool -> Bool -> [Text ]
172
+ getGhcOptions bconfig boptsCli name isTarget isLocal = concat
173
+ [ ghcOptionsFor name (configGhcOptions config)
174
+ , concat [[" -fhpc" ] | isLocal && toCoverage (boptsTestOpts bopts)]
175
+ , if (boptsLibProfile bopts || boptsExeProfile bopts)
176
+ then [" -auto-all" ," -caf-all" ]
177
+ else []
178
+ , if includeExtraOptions
179
+ then boptsCLIGhcOptions boptsCli
180
+ else []
181
+ ]
182
+ where
183
+ bopts = configBuild config
184
+ config = bcConfig bconfig
185
+ includeExtraOptions =
186
+ case configApplyGhcOptions config of
187
+ AGOTargets -> isTarget
188
+ AGOLocals -> isLocal
189
+ AGOEverything -> True
190
+
152
191
-- | Use the build options and environment to parse targets.
153
192
parseTargetsFromBuildOpts
154
193
:: (MonadIO m , MonadMask m , MonadReader env m , HasBuildConfig env , MonadBaseControl IO m , HasHttpManager env , MonadLogger m , HasEnvConfig env )
@@ -170,6 +209,7 @@ parseTargetsFromBuildOpts needTargets boptscli = do
170
209
return MiniBuildPlan
171
210
{ mbpCompilerVersion = version
172
211
, mbpPackages = Map. empty
212
+ , mbpAllowNewer = False
173
213
}
174
214
ResolverCustom _ url -> do
175
215
stackYamlFP <- asks $ bcStackYaml . getBuildConfig
@@ -285,11 +325,11 @@ loadLocalPackage
285
325
-> (PackageName , (LocalPackageView , GenericPackageDescription ))
286
326
-> m LocalPackage
287
327
loadLocalPackage boptsCli targets (name, (lpv, gpkg)) = do
288
- config <- getPackageConfig boptsCli name
328
+ let mtarget = Map. lookup name targets
329
+ config <- getPackageConfig boptsCli name (isJust mtarget) True
289
330
bopts <- asks (configBuild . getConfig)
290
331
let pkg = resolvePackage config gpkg
291
332
292
- mtarget = Map. lookup name targets
293
333
(exes, tests, benches) =
294
334
case mtarget of
295
335
Just (STLocalComps comps) -> splitComponents $ Set. toList comps
@@ -384,7 +424,7 @@ checkFlagsUsed boptsCli lps extraDeps snapshot = do
384
424
-- Check if flags specified in stack.yaml and the command line are
385
425
-- used, see https://github.com/commercialhaskell/stack/issues/617
386
426
let flags = map (, FSCommandLine ) [(k, v) | (Just k, v) <- Map. toList $ boptsCLIFlags boptsCli]
387
- ++ map (, FSStackYaml ) (Map. toList $ bcFlags bconfig)
427
+ ++ map (, FSStackYaml ) (Map. toList $ unPackageFlags $ bcFlags bconfig)
388
428
389
429
localNameMap = Map. fromList $ map (packageName . lpPackage &&& lpPackage) lps
390
430
checkFlagUsed ((name, userFlags), source) =
@@ -415,17 +455,6 @@ checkFlagsUsed boptsCli lps extraDeps snapshot = do
415
455
$ InvalidFlagSpecification
416
456
$ Set. fromList unusedFlags
417
457
418
- -- | All flags for a local package
419
- localFlags :: Map (Maybe PackageName ) (Map FlagName Bool )
420
- -> BuildConfig
421
- -> PackageName
422
- -> Map FlagName Bool
423
- localFlags boptsflags bconfig name = Map. unions
424
- [ Map. findWithDefault Map. empty (Just name) boptsflags
425
- , Map. findWithDefault Map. empty Nothing boptsflags
426
- , Map. findWithDefault Map. empty name (bcFlags bconfig)
427
- ]
428
-
429
458
-- | Add in necessary packages to extra dependencies
430
459
--
431
460
-- Originally part of https://github.com/commercialhaskell/stack/issues/272,
@@ -568,18 +597,50 @@ checkComponentsBuildable lps =
568
597
, c <- Set. toList (lpUnbuildable lp)
569
598
]
570
599
600
+ warnAllowNewer :: (MonadThrow m , MonadLogger m , MonadReader env m , HasConfig env )
601
+ => MiniBuildPlan -> m ()
602
+ warnAllowNewer mpb = do
603
+ -- TODO: Perhaps we should just have the snapshot setting imply
604
+ -- allow-newer? I just didn't want to make 'configAllowNewer'
605
+ -- non-authoritative about whether allow-newer is enabled.
606
+ allowNewer <- asks (configAllowNewer . getConfig)
607
+ when (mbpAllowNewer mpb && not allowNewer) $ do
608
+ $ logWarn $ T. unlines
609
+ [ " "
610
+ , " WARNING: The snapshot specifies that allow-newer needs to be used."
611
+ , " You should probably add 'allow-newer: true' to suppress this warning."
612
+ , " "
613
+ ]
614
+
615
+ getDefaultPackageConfig :: (MonadIO m , MonadThrow m , MonadCatch m , MonadLogger m , MonadReader env m , HasEnvConfig env )
616
+ => m PackageConfig
617
+ getDefaultPackageConfig = do
618
+ econfig <- asks getEnvConfig
619
+ bconfig <- asks getBuildConfig
620
+ return PackageConfig
621
+ { packageConfigEnableTests = False
622
+ , packageConfigEnableBenchmarks = False
623
+ , packageConfigFlags = M. empty
624
+ , packageConfigGhcOptions = []
625
+ , packageConfigCompilerVersion = envConfigCompilerVersion econfig
626
+ , packageConfigPlatform = configPlatform $ getConfig bconfig
627
+ }
628
+
571
629
-- | Get 'PackageConfig' for package given its name.
572
630
getPackageConfig :: (MonadIO m , MonadThrow m , MonadMask m , MonadLogger m , MonadReader env m , HasEnvConfig env )
573
631
=> BuildOptsCLI
574
632
-> PackageName
633
+ -> Bool
634
+ -> Bool
575
635
-> m PackageConfig
576
- getPackageConfig boptsCli name = do
636
+ getPackageConfig boptsCli name isTarget isLocal = do
577
637
econfig <- asks getEnvConfig
578
638
bconfig <- asks getBuildConfig
579
639
return PackageConfig
580
640
{ packageConfigEnableTests = False
581
641
, packageConfigEnableBenchmarks = False
582
- , packageConfigFlags = localFlags (boptsCLIFlags boptsCli) bconfig name
642
+ , packageConfigFlags = getLocalFlags bconfig boptsCli name
643
+ , packageConfigGhcOptions = getGhcOptions bconfig boptsCli name isTarget isLocal
583
644
, packageConfigCompilerVersion = envConfigCompilerVersion econfig
584
645
, packageConfigPlatform = configPlatform $ getConfig bconfig
585
646
}
0 commit comments