
I've been looking around and trying to develop a plan for parallelizing builds in cabal-install. Here's my idea so far: - Parallelize executeInstallPlan. When given a target load average as a flag it will determine whether it should spawn a worker (if below the target load average) or wait. If waiting, it will listen to all worker status channels and print out their current build status and the load average. Once a worker exits, it will again check the load average and spawn a new thread if necessary. - Rewrite install.*Package and their callees to use the CHP (Communicating Haskell Process) monad where possible. Use channels to communicate build status back to the main thread. - It might be necessary to parse the output of external builds in some way so that meaningful status can be communicated back to the user. - Add a default parallel build log path template. Allow the user to specify one on the command line to override the default. All output of parallel package builds will be logged in the background silently instead of displayed to the user. - On single-threaded (sequential) builds, revert to the old output style. On multi-threaded builds, display the current status of all running builds, load averages and nothing else. Possible output: Resolving dependencies... Building derive-2.3.0.2... [17 of 58] Building regex-base-0.93.1... [1 of 4] Building dyre-0.8.6... [5 of 7] Configuring xdg-basedir-0.2... [in progress] Dependencies Built: [0 of 9] Load Average: [3.4/4.0] Running 4 Jobs. A possible error message might look like: derive-2.3.0.2 failed during the building phase. Log stored in /home/frank/cabal/logs/build/derive-2.3.0.2.log What does everyone think? Thanks, Frank