diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,3 +1,8 @@
+## 0.7.4
+
+* `-j`/`--jobs` option for build flags
+* Only pass in required .haddock files (more memory efficiency)
+
 ## 0.7.3
 
 * Number of jobs == number of capabilities
diff --git a/Stackage/CompleteBuild.hs b/Stackage/CompleteBuild.hs
--- a/Stackage/CompleteBuild.hs
+++ b/Stackage/CompleteBuild.hs
@@ -45,6 +45,7 @@
     , bfBundleDest       :: !(Maybe FilePath)
     , bfGitPush          :: !Bool
     -- ^ push to Git (when doing an LTS build)
+    , bfJobs             :: !(Maybe Int)
     } deriving (Show)
 
 data BuildType = Nightly | LTS BumpType Text
@@ -251,7 +252,7 @@
 
 getPerformBuild :: BuildFlags -> Settings -> IO PerformBuild
 getPerformBuild buildFlags Settings {..} = do
-    jobs <- getNumCapabilities
+    jobs <- maybe getNumCapabilities return $ bfJobs buildFlags
     return PerformBuild
         { pbPlan = plan
         , pbInstallDest = buildDir
diff --git a/Stackage/PerformBuild.hs b/Stackage/PerformBuild.hs
--- a/Stackage/PerformBuild.hs
+++ b/Stackage/PerformBuild.hs
@@ -205,6 +205,7 @@
 
     pbLog "Collecting existing .haddock files\n"
     haddockFiles <- getHaddockFiles pb >>= newTVarIO
+    haddockDeps <- newTVarIO mempty
 
     forM_ packageMap $ \pi -> void $ async $ singleBuild pb registeredPackages
       SingleBuild
@@ -223,6 +224,7 @@
             (pbDatabase pb)
             (filter allowedEnv $ map fixEnv env)
         , sbHaddockFiles = haddockFiles
+        , sbHaddockDeps = haddockDeps
         }
 
     void $ tryAny $ atomically $ readTVar active >>= checkSTM . (== 0)
@@ -267,6 +269,8 @@
     , sbRegisterMutex :: MVar ()
     , sbModifiedEnv   :: [(String, String)]
     , sbHaddockFiles  :: TVar (Map Text FilePath) -- ^ package-version, .haddock file
+    , sbHaddockDeps   :: TVar (Map PackageName (Set PackageName))
+    -- ^ Deep deps of library and executables
     }
 
 singleBuild :: PerformBuild
@@ -432,7 +436,15 @@
         when needHaddock $ withConfiged $ do
             log' $ "Haddocks " ++ namever
             hfs <- readTVarIO sbHaddockFiles
-            let hfsOpts = flip map (mapToList hfs) $ \(pkgVer, hf) -> concat
+            haddockDeps <- atomically $ getHaddockDeps pbPlan sbHaddockDeps pname
+            let hfsOpts = map hfOpt
+                        $ filter ((`member` haddockDeps) . toPackageName . fst)
+                        $ mapToList hfs
+                toPackageName t =
+                    case simpleParse t of
+                        Just (PackageIdentifier x _) -> x
+                        Nothing -> error $ "Invalid package identifier: " ++ unpack t
+                hfOpt (pkgVer, hf) = concat
                     [ "--haddock-options=--read-interface="
                     , "../"
                     , pkgVer
@@ -502,7 +514,7 @@
         log' $ concat
             [ display (piName sbPackageInfo)
             , ": "
-            , tshow exc
+            , take 500 $ tshow exc
             ]
         atomically $ modifyTVar sbErrsVar $ insertMap (piName sbPackageInfo) exc'
       where
@@ -592,3 +604,42 @@
                     else mempty
       where
         nameVerText = fpToText $ filename dir
+
+getHaddockDeps :: BuildPlan
+               -> TVar (Map PackageName (Set PackageName))
+               -> PackageName
+               -> STM (Set PackageName)
+getHaddockDeps BuildPlan {..} var =
+    go
+  where
+    go :: PackageName -> STM (Set PackageName)
+    go name = do
+        m <- readTVar var
+        case lookup name m of
+            Just res -> return res
+            Nothing -> do
+                -- First thing we do is put in a dummy value in the var for
+                -- this package, to avoid the possibility of an infinite loop
+                -- due to packages depending on themselves (which is in fact
+                -- valid).
+                modifyTVar var $ insertMap name mempty
+
+                res' <- fmap fold $ mapM go $ setToList deps
+                let res = deps ++ res'
+                modifyTVar var $ insertMap name res
+                return res
+      where
+        deps =
+            case lookup name bpPackages of
+                Nothing -> mempty
+                Just PackagePlan {..} ->
+                    asSet
+                  $ setFromList
+                  $ map fst
+                  $ filter (isLibExe . snd)
+                  $ mapToList
+                  $ sdPackages ppDesc
+
+    isLibExe DepInfo {..} =
+        CompLibrary    `member` diComponents ||
+        CompExecutable `member` diComponents
diff --git a/app/stackage.hs b/app/stackage.hs
--- a/app/stackage.hs
+++ b/app/stackage.hs
@@ -135,7 +135,12 @@
             <|> pure Nothing) <*>
         (fmap not (switch
             (long "skip-git-push" <>
-             help "Do not perform a git push after completion (for LTS builds only)")))
+             help "Do not perform a git push after completion (for LTS builds only)"))) <*>
+        (fmap Just (option
+            auto
+            (long "jobs" <> short 'j' <>
+             metavar "NUMBER" <>
+             help "Number of threads")) <|> pure Nothing)
 
     installFlags =
         InstallFlags <$>
diff --git a/stackage-curator.cabal b/stackage-curator.cabal
--- a/stackage-curator.cabal
+++ b/stackage-curator.cabal
@@ -1,5 +1,5 @@
 name:                stackage-curator
-version:             0.7.3
+version:             0.7.4
 synopsis:            Tools for curating Stackage bundles
 description:         Please see <http://www.stackage.org/package/stackage-curator> for a description and documentation.
 homepage:            https://github.com/fpco/stackage
@@ -35,7 +35,7 @@
                        Stackage.CompleteBuild
   build-depends:       base >= 4 && < 5
                      , containers
-                     , Cabal >= 1.14
+                     , Cabal >= 1.14 && < 1.20
                      , tar >= 0.3
                      , zlib
                      , bytestring
