@@ -51,6 +51,7 @@ module Distribution.Client.ProjectConfig
51
51
, resolveSolverSettings
52
52
, BuildTimeSettings (.. )
53
53
, resolveBuildTimeSettings
54
+ , resolveNumJobsSetting
54
55
55
56
-- * Checking configuration
56
57
, checkBadPerPackageCompilerPaths
@@ -64,6 +65,7 @@ import Prelude ()
64
65
import Distribution.Client.Glob
65
66
( isTrivialRootedGlob
66
67
)
68
+ import Distribution.Client.JobControl
67
69
import Distribution.Client.ProjectConfig.Legacy
68
70
import Distribution.Client.ProjectConfig.Types
69
71
import Distribution.Client.RebuildMonad
@@ -424,12 +426,7 @@ resolveBuildTimeSettings
424
426
-- buildSettingLogVerbosity -- defined below, more complicated
425
427
buildSettingBuildReports = fromFlag projectConfigBuildReports
426
428
buildSettingSymlinkBinDir = flagToList projectConfigSymlinkBinDir
427
- buildSettingNumJobs =
428
- if fromFlag projectConfigUseSemaphore
429
- then UseSem (determineNumJobs projectConfigNumJobs)
430
- else case (determineNumJobs projectConfigNumJobs) of
431
- 1 -> Serial
432
- n -> NumJobs (Just n)
429
+ buildSettingNumJobs = resolveNumJobsSetting projectConfigUseSemaphore projectConfigNumJobs
433
430
buildSettingKeepGoing = fromFlag projectConfigKeepGoing
434
431
buildSettingOfflineMode = fromFlag projectConfigOfflineMode
435
432
buildSettingKeepTempFiles = fromFlag projectConfigKeepTempFiles
@@ -525,6 +522,15 @@ resolveBuildTimeSettings
525
522
| isParallelBuild buildSettingNumJobs = False
526
523
| otherwise = False
527
524
525
+ -- | Determine the number of jobs (ParStrat) from the project config
526
+ resolveNumJobsSetting :: Flag Bool -> Flag (Maybe Int ) -> ParStratX Int
527
+ resolveNumJobsSetting projectConfigUseSemaphore projectConfigNumJobs =
528
+ if fromFlag projectConfigUseSemaphore
529
+ then UseSem (determineNumJobs projectConfigNumJobs)
530
+ else case (determineNumJobs projectConfigNumJobs) of
531
+ 1 -> Serial
532
+ n -> NumJobs (Just n)
533
+
528
534
---------------------------------------------
529
535
-- Reading and writing project config files
530
536
--
@@ -1156,13 +1162,15 @@ mplusMaybeT ma mb = do
1156
1162
fetchAndReadSourcePackages
1157
1163
:: Verbosity
1158
1164
-> DistDirLayout
1165
+ -> Compiler
1159
1166
-> ProjectConfigShared
1160
1167
-> ProjectConfigBuildOnly
1161
1168
-> [ProjectPackageLocation ]
1162
1169
-> Rebuild [PackageSpecifier (SourcePackage UnresolvedPkgLoc )]
1163
1170
fetchAndReadSourcePackages
1164
1171
verbosity
1165
1172
distDirLayout
1173
+ compiler
1166
1174
projectConfigShared
1167
1175
projectConfigBuildOnly
1168
1176
pkgLocations = do
@@ -1199,7 +1207,9 @@ fetchAndReadSourcePackages
1199
1207
syncAndReadSourcePackagesRemoteRepos
1200
1208
verbosity
1201
1209
distDirLayout
1210
+ compiler
1202
1211
projectConfigShared
1212
+ projectConfigBuildOnly
1203
1213
(fromFlag (projectConfigOfflineMode projectConfigBuildOnly))
1204
1214
[repo | ProjectPackageRemoteRepo repo <- pkgLocations]
1205
1215
@@ -1316,16 +1326,23 @@ fetchAndReadSourcePackageRemoteTarball
1316
1326
syncAndReadSourcePackagesRemoteRepos
1317
1327
:: Verbosity
1318
1328
-> DistDirLayout
1329
+ -> Compiler
1319
1330
-> ProjectConfigShared
1331
+ -> ProjectConfigBuildOnly
1320
1332
-> Bool
1321
1333
-> [SourceRepoList ]
1322
1334
-> Rebuild [PackageSpecifier (SourcePackage UnresolvedPkgLoc )]
1323
1335
syncAndReadSourcePackagesRemoteRepos
1324
1336
verbosity
1325
1337
DistDirLayout {distDownloadSrcDirectory}
1338
+ compiler
1326
1339
ProjectConfigShared
1327
1340
{ projectConfigProgPathExtra
1328
1341
}
1342
+ ProjectConfigBuildOnly
1343
+ { projectConfigUseSemaphore
1344
+ , projectConfigNumJobs
1345
+ }
1329
1346
offlineMode
1330
1347
repos = do
1331
1348
repos' <-
@@ -1351,10 +1368,15 @@ syncAndReadSourcePackagesRemoteRepos
1351
1368
in configureVCS verbosity progPathExtra vcs
1352
1369
1353
1370
concat
1354
- <$> sequenceA
1355
- [ rerunIfChanged verbosity monitor repoGroup' $ do
1356
- vcs' <- getConfiguredVCS repoType
1357
- syncRepoGroupAndReadSourcePackages vcs' pathStem repoGroup'
1371
+ <$> rerunConcurrentlyIfChanged
1372
+ verbosity
1373
+ (newJobControlFromParStrat verbosity compiler parStrat maxNumFetchJobs)
1374
+ [ ( monitor
1375
+ , repoGroup'
1376
+ , do
1377
+ vcs' <- getConfiguredVCS repoType
1378
+ syncRepoGroupAndReadSourcePackages vcs' pathStem repoGroup'
1379
+ )
1358
1380
| repoGroup@ ((primaryRepo, repoType) : _) <- Map. elems reposByLocation
1359
1381
, let repoGroup' = map fst repoGroup
1360
1382
pathStem =
@@ -1367,6 +1389,8 @@ syncAndReadSourcePackagesRemoteRepos
1367
1389
monitor = newFileMonitor (pathStem <.> " cache" )
1368
1390
]
1369
1391
where
1392
+ maxNumFetchJobs = Just 2 -- try to keep this in sync with Distribution.Client.Install's numFetchJobs.
1393
+ parStrat = resolveNumJobsSetting projectConfigUseSemaphore projectConfigNumJobs
1370
1394
syncRepoGroupAndReadSourcePackages
1371
1395
:: VCS ConfiguredProgram
1372
1396
-> FilePath
0 commit comments