@@ -57,6 +57,7 @@ import Stack.Types.EnvConfig
57
57
import Stack.Types.EnvSettings ( EnvSettings (.. ), minimalEnvSettings )
58
58
import Stack.Types.GHCVariant ( HasGHCVariant (.. ) )
59
59
import Stack.Types.GhcPkgId ( GhcPkgId )
60
+ import Stack.Types.GlobalOpts ( GlobalOpts (.. ) )
60
61
import Stack.Types.IsMutable ( IsMutable (.. ) )
61
62
import Stack.Types.NamedComponent ( exeComponents , renderComponent )
62
63
import Stack.Types.Package
@@ -67,15 +68,14 @@ import Stack.Types.Package
67
68
)
68
69
import Stack.Types.ParentMap ( ParentMap )
69
70
import Stack.Types.Platform ( HasPlatform (.. ) )
70
- import Stack.Types.Runner ( HasRunner (.. ) )
71
+ import Stack.Types.Runner ( HasRunner (.. ), globalOptsL )
71
72
import Stack.Types.SourceMap
72
73
( CommonPackage (.. ), DepPackage (.. ), FromSnapshot (.. )
73
74
, GlobalPackage (.. ), SMTargets (.. ), SourceMap (.. )
74
75
)
75
76
import Stack.Types.Version
76
77
( latestApplicableVersion , versionRangeText , withinRange )
77
78
import System.Environment ( lookupEnv )
78
- import System.IO ( putStrLn )
79
79
80
80
data PackageInfo
81
81
= PIOnlyInstalled InstallLocation Installed
@@ -260,7 +260,7 @@ constructPlan baseConfigOpts0 localDumpPkgs loadPackage0 sourceMap installedMap
260
260
sources <- getSources globalCabalVersion
261
261
mcur <- view $ buildConfigL. to bcCurator
262
262
263
- let onTarget = void . addDep
263
+ let onTarget = void . getCachedDepOrAddDep
264
264
let inner = mapM_ onTarget $ Map. keys (smtTargets $ smTargets sourceMap)
265
265
pathEnvVar' <- liftIO $ maybe mempty T. pack <$> lookupEnv " PATH"
266
266
let ctx = mkCtx econfig globalCabalVersion sources mcur pathEnvVar'
@@ -296,7 +296,6 @@ constructPlan baseConfigOpts0 localDumpPkgs loadPackage0 sourceMap installedMap
296
296
else Map. empty
297
297
}
298
298
else do
299
- planDebug $ show errs
300
299
stackYaml <- view stackYamlL
301
300
stackRoot <- view stackRootL
302
301
prettyThrowM $ ConstructPlanFailed
@@ -539,56 +538,64 @@ addFinal lp package isAllInOne buildHaddocks = do
539
538
-- marked as a dependency, even if it is directly wanted. This makes sense - if
540
539
-- we left out packages that are deps, it would break the --only-dependencies
541
540
-- build plan.
542
- addDep :: PackageName -> M (Either ConstructPlanException AddDepRes )
543
- addDep name = do
541
+ getCachedDepOrAddDep ::
542
+ PackageName
543
+ -> M (Either ConstructPlanException AddDepRes )
544
+ getCachedDepOrAddDep name = do
544
545
libMap <- get
545
546
case Map. lookup name libMap of
546
547
Just res -> do
547
- planDebug $
548
- " addDep: Using cached result for " ++ show name ++ " : " ++ show res
548
+ logDebugPlanS " getCachedDepOrAddDep" $
549
+ " Using cached result for "
550
+ <> fromString (packageNameString name)
551
+ <> " : "
552
+ <> fromString (show res)
549
553
pure res
550
- Nothing -> addDep' name
554
+ Nothing -> checkCallStackAndAddDep name
551
555
552
556
-- | Given a 'PackageName', adds all of the build tasks to build the package.
553
557
-- First checks that the package name is not already in the call stack.
554
- addDep' :: PackageName -> M (Either ConstructPlanException AddDepRes )
555
- addDep' name = do
558
+ checkCallStackAndAddDep ::
559
+ PackageName
560
+ -> M (Either ConstructPlanException AddDepRes )
561
+ checkCallStackAndAddDep name = do
556
562
ctx <- ask
557
563
let mpackageInfo = Map. lookup name $ combinedMap ctx
558
564
res <- if name `elem` callStack ctx
559
565
then do
560
- planDebug $
561
- " addDep': Detected cycle "
562
- <> show name
566
+ logDebugPlanS " checkCallStackAndAddDep " $
567
+ " Detected cycle "
568
+ <> fromString (packageNameString name)
563
569
<> " : "
564
- <> show (callStack ctx)
570
+ <> fromString ( show $ map packageNameString (callStack ctx) )
565
571
pure $ Left $ DependencyCycleDetected $ name : callStack ctx
566
572
else local (\ ctx' -> ctx' { callStack = name : callStack ctx' }) $ do
567
573
case mpackageInfo of
568
574
-- TODO look up in the package index and see if there's a
569
575
-- recommendation available
570
576
Nothing -> do
571
- planDebug $
572
- " addDep': No package info for "
573
- <> show name
577
+ logDebugPlanS " checkCallStackAndAddDep" $
578
+ " No package info for "
579
+ <> fromString (packageNameString name)
580
+ <> " ."
574
581
pure $ Left $ UnknownPackage name
575
- Just packageInfo -> addDep'' name packageInfo
582
+ Just packageInfo -> addDep name packageInfo
576
583
updateLibMap name res
577
584
pure res
578
585
579
586
-- | Given a 'PackageName' and its 'PackageInfo' from the combined map, adds all
580
587
-- of the build tasks to build the package. Assumes that the head of the call
581
588
-- stack is the current package name.
582
- addDep'' ::
589
+ addDep ::
583
590
PackageName
584
591
-> PackageInfo
585
592
-> M (Either ConstructPlanException AddDepRes )
586
- addDep'' name packageInfo = do
587
- planDebug $
588
- " addDep'': Package info for "
589
- <> show name
593
+ addDep name packageInfo = do
594
+ logDebugPlanS " addDep " $
595
+ " Package info for "
596
+ <> fromString (packageNameString name)
590
597
<> " : "
591
- <> show packageInfo
598
+ <> fromString ( show packageInfo)
592
599
case packageInfo of
593
600
PIOnlyInstalled loc installed -> do
594
601
-- FIXME Slightly hacky, no flags since they likely won't affect
@@ -678,18 +685,19 @@ installPackage name ps minstalled = do
678
685
ctx <- ask
679
686
case ps of
680
687
PSRemote pkgLoc _version _fromSnapshot cp -> do
681
- planDebug $
682
- " installPackage: Doing all-in-one build for upstream package "
683
- <> show name
688
+ logDebugPlanS " installPackage" $
689
+ " Doing all-in-one build for upstream package "
690
+ <> fromString (packageNameString name)
691
+ <> " ."
684
692
package <- loadPackage
685
693
ctx pkgLoc (cpFlags cp) (cpGhcOptions cp) (cpCabalConfigOpts cp)
686
694
resolveDepsAndInstall True (cpHaddocks cp) ps package minstalled
687
695
PSFilePath lp -> do
688
696
case lpTestBench lp of
689
697
Nothing -> do
690
- planDebug $
691
- " installPackage: No test / bench component for "
692
- <> show name
698
+ logDebugPlanS " installPackage " $
699
+ " No test or bench component for "
700
+ <> fromString (packageNameString name)
693
701
<> " so doing an all-in-one build."
694
702
resolveDepsAndInstall
695
703
True (lpBuildHaddocks lp) ps (lpPackage lp) minstalled
@@ -705,10 +713,10 @@ installPackage name ps minstalled = do
705
713
pure (res, writerFunc)
706
714
case res of
707
715
Right deps -> do
708
- planDebug $
709
- " installPackage: For "
710
- <> show name
711
- <> " , successfully added package deps"
716
+ logDebugPlanS " installPackage " $
717
+ " For "
718
+ <> fromString (packageNameString name)
719
+ <> " , successfully added package deps. "
712
720
-- in curator builds we can't do all-in-one build as
713
721
-- test/benchmark failure could prevent library from being
714
722
-- available to its dependencies but when it's already available
@@ -727,10 +735,9 @@ installPackage name ps minstalled = do
727
735
Left _ -> do
728
736
-- Reset the state to how it was before attempting to find an
729
737
-- all-in-one build plan.
730
- planDebug $
731
- " installPackage: Before trying cyclic plan, resetting lib \
732
- \result map to "
733
- <> show libMap
738
+ logDebugPlanS " installPackage" $
739
+ " Before trying cyclic plan, resetting lib result map to: "
740
+ <> fromString (show libMap)
734
741
put libMap
735
742
-- Otherwise, fall back on building the tests / benchmarks in a
736
743
-- separate step.
@@ -863,7 +870,7 @@ addPackageDeps package = do
863
870
checkAndWarnForUnknownTools package
864
871
let deps' = packageDeps package
865
872
deps <- forM (Map. toList deps') $ \ (depname, DepValue range depType) -> do
866
- eres <- addDep depname
873
+ eres <- getCachedDepOrAddDep depname
867
874
let getLatestApplicableVersionAndRev :: M (Maybe (Version , BlobKey ))
868
875
getLatestApplicableVersionAndRev = do
869
876
vsAndRevs <-
@@ -1276,6 +1283,11 @@ inSnapshot name version = do
1276
1283
-- TODO: Consider intersecting version ranges for multiple deps on a
1277
1284
-- package. This is why VersionRange is in the parent map.
1278
1285
1279
- -- Switch this to 'True' to enable some debugging putStrLn in this module
1280
- planDebug :: MonadIO m => String -> m ()
1281
- planDebug = if False then liftIO . putStrLn else \ _ -> pure ()
1286
+ logDebugPlanS ::
1287
+ (HasCallStack , HasRunner env , MonadIO m , MonadReader env m )
1288
+ => LogSource
1289
+ -> Utf8Builder
1290
+ -> m ()
1291
+ logDebugPlanS s msg = do
1292
+ debugPlan <- view $ globalOptsL. to globalPlanInLog
1293
+ when debugPlan $ logDebugS s msg
0 commit comments