@@ -11,19 +11,20 @@ module Stack.Build.Source
1111 ( loadSourceMap
1212 , SourceMap
1313 , PackageSource (.. )
14- , localFlags
14+ , getLocalFlags
15+ , getGhcOptions
1516 , getLocalPackageViews
16- , loadLocalPackage
1717 , parseTargetsFromBuildOpts
1818 , addUnlistedToBuildCache
19+ , getDefaultPackageConfig
1920 , getPackageConfig
2021 ) where
2122
2223import Control.Applicative
2324import Control.Arrow ((&&&) )
2425import Control.Exception (assert , catch )
2526import Control.Monad
26- import Control.Monad.Catch (MonadMask )
27+ import Control.Monad.Catch (MonadMask , MonadCatch )
2728import Control.Monad.IO.Class
2829import Control.Monad.Logger
2930import Control.Monad.Reader (MonadReader , asks )
@@ -91,6 +92,7 @@ loadSourceMap needTargets boptsCli = do
9192 locals <- mapM (loadLocalPackage boptsCli targets) $ Map. toList rawLocals
9293 checkFlagsUsed boptsCli locals extraDeps0 (mbpPackages mbp0)
9394 checkComponentsBuildable locals
95+ warnAllowNewer mbp0
9496
9597 let
9698 -- loadLocals returns PackageName (foo) and PackageIdentifier (bar-1.2.3) targets separately;
@@ -111,31 +113,34 @@ loadSourceMap needTargets boptsCli = do
111113 -- Add the extra deps from the stack.yaml file to the deps grabbed from
112114 -- the snapshot
113115 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)
116118
117- -- Overwrite any flag settings with those from the config file
119+ -- Add flag and ghc-option settings from the config file / cli
118120 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
136141 -- currently have no ability for extra-deps to specify their
137142 -- cabal file hashes
138- Nothing )
143+ in PSUpstream v Local flags ghcOptions Nothing )
139144 extraDeps2
140145
141146 let sourceMap = Map. unions
@@ -144,11 +149,45 @@ loadSourceMap needTargets boptsCli = do
144149 in (packageName p, PSLocal lp)
145150 , extraDeps3
146151 , 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)
148153 ] `Map.difference` Map. fromList (map (, () ) (HashSet. toList wiredInPackages))
149154
150155 return (targets, mbp, locals, nonLocalTargets, sourceMap)
151156
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+
152191-- | Use the build options and environment to parse targets.
153192parseTargetsFromBuildOpts
154193 :: (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
170209 return MiniBuildPlan
171210 { mbpCompilerVersion = version
172211 , mbpPackages = Map. empty
212+ , mbpAllowNewer = False
173213 }
174214 ResolverCustom _ url -> do
175215 stackYamlFP <- asks $ bcStackYaml . getBuildConfig
@@ -285,11 +325,11 @@ loadLocalPackage
285325 -> (PackageName , (LocalPackageView , GenericPackageDescription ))
286326 -> m LocalPackage
287327loadLocalPackage 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
289330 bopts <- asks (configBuild . getConfig)
290331 let pkg = resolvePackage config gpkg
291332
292- mtarget = Map. lookup name targets
293333 (exes, tests, benches) =
294334 case mtarget of
295335 Just (STLocalComps comps) -> splitComponents $ Set. toList comps
@@ -384,7 +424,7 @@ checkFlagsUsed boptsCli lps extraDeps snapshot = do
384424 -- Check if flags specified in stack.yaml and the command line are
385425 -- used, see https://github.com/commercialhaskell/stack/issues/617
386426 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)
388428
389429 localNameMap = Map. fromList $ map (packageName . lpPackage &&& lpPackage) lps
390430 checkFlagUsed ((name, userFlags), source) =
@@ -415,17 +455,6 @@ checkFlagsUsed boptsCli lps extraDeps snapshot = do
415455 $ InvalidFlagSpecification
416456 $ Set. fromList unusedFlags
417457
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-
429458-- | Add in necessary packages to extra dependencies
430459--
431460-- Originally part of https://github.com/commercialhaskell/stack/issues/272,
@@ -568,18 +597,50 @@ checkComponentsBuildable lps =
568597 , c <- Set. toList (lpUnbuildable lp)
569598 ]
570599
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+
571629-- | Get 'PackageConfig' for package given its name.
572630getPackageConfig :: (MonadIO m , MonadThrow m , MonadMask m , MonadLogger m , MonadReader env m , HasEnvConfig env )
573631 => BuildOptsCLI
574632 -> PackageName
633+ -> Bool
634+ -> Bool
575635 -> m PackageConfig
576- getPackageConfig boptsCli name = do
636+ getPackageConfig boptsCli name isTarget isLocal = do
577637 econfig <- asks getEnvConfig
578638 bconfig <- asks getBuildConfig
579639 return PackageConfig
580640 { packageConfigEnableTests = False
581641 , packageConfigEnableBenchmarks = False
582- , packageConfigFlags = localFlags (boptsCLIFlags boptsCli) bconfig name
642+ , packageConfigFlags = getLocalFlags bconfig boptsCli name
643+ , packageConfigGhcOptions = getGhcOptions bconfig boptsCli name isTarget isLocal
583644 , packageConfigCompilerVersion = envConfigCompilerVersion econfig
584645 , packageConfigPlatform = configPlatform $ getConfig bconfig
585646 }
0 commit comments