@@ -50,20 +50,33 @@ run = do
5050 hPutStrLn h ("# Generated by stackage2nix " ++ Text.display version ++ " from " ++ stackYaml ^. syFilePath)
5151 hPrint h out
5252 let
53− reachable = fmap mkPackageName
54− $ F.toList . F.foldr1 Set.union
53+ reachable = Set.map mkPackageName
54+ $ F.foldr1 Set.union
5555 $ nodeDepends . mkNode <$> packages
5656 s2nLoader mHash pkgId =
57− if pkgName pkgId `elem` reachable
57+ if pkgName pkgId `Set.member` reachable
5858 then packageLoader packageSetConfig Nothing pkgId
5959 else packageLoader packageSetConfig mHash pkgId
6060 s2nPackageSetConfig = packageSetConfig { packageLoader = s2nLoader }
6161 s2nPackageConfig = PackageConfig
6262 { enableCheck = opts ^. optDoCheckStackage
6363 , enableHaddock = opts ^. optDoHaddockStackage }
64− -- generate stackage packages
65− nodes <- traverse (uncurry (buildNodeM s2nPackageSetConfig s2nPackageConfig))
64+ allNodes <- traverse (uncurry (buildNodeM s2nPackageSetConfig s2nPackageConfig))
6665 $ Map.toList (bpPackages buildPlan)
66+
67+ -- Find all reachable dependencies in stackage set to stick into
68+ -- stackage packages file. This is performed on the full stackage
69+ -- set rather than pruning stackage packages beforehand because
70+ -- stackage does not concern itself with build tools while cabal2nix
71+ -- does: pruning only after generating full set of packages allows
72+ -- us to make sure all those extra dependencies are explicitly
73+ -- listed as well.
74+ let nodes = case opts ^. optOutPackagesClosure of
75+ True -> flip reachableDependencies allNodes
76+ -- Originally reachable nodes are root nodes
77+ $ filter (\n -> mkPackageName (nodeName n) `Set.member` reachable) allNodes
78+ False -> allNodes
79+
6780 withFile (opts ^. optOutStackagePackages) WriteMode $ \h -> do
6881 hPutStrLn h ("# Generated by stackage2nix " ++ Text.display version ++ " from " ++ buildPlanFile)
6982 hPutStrLn h $ render $ pPrintOutPackages (view nodeDerivation <$> nodes)