@@ -50,20 +50,33 @@ run = do
50 hPutStrLn h ("# Generated by stackage2nix " ++ Text.display version ++ " from " ++ stackYaml ^. syFilePath)
50 hPutStrLn h ("# Generated by stackage2nix " ++ Text.display version ++ " from " ++ stackYaml ^. syFilePath)
51 hPrint h out
51 hPrint h out
53− reachable = fmap mkPackageName
53+ reachable = Set.map mkPackageName
54− $ F.toList . F.foldr1 Set.union
54+ $ F.foldr1 Set.union
55 $ nodeDepends . mkNode <$> packages
55 $ nodeDepends . mkNode <$> packages
56 s2nLoader mHash pkgId =
56 s2nLoader mHash pkgId =
57− if pkgName pkgId `elem` reachable
57+ if pkgName pkgId `Set.member` reachable
58 then packageLoader packageSetConfig Nothing pkgId
58 then packageLoader packageSetConfig Nothing pkgId
59 else packageLoader packageSetConfig mHash pkgId
59 else packageLoader packageSetConfig mHash pkgId
60 s2nPackageSetConfig = packageSetConfig { packageLoader = s2nLoader }
60 s2nPackageSetConfig = packageSetConfig { packageLoader = s2nLoader }
61 s2nPackageConfig = PackageConfig
61 s2nPackageConfig = PackageConfig
62 { enableCheck = opts ^. optDoCheckStackage
62 { enableCheck = opts ^. optDoCheckStackage
63 , enableHaddock = opts ^. optDoHaddockStackage }
63 , enableHaddock = opts ^. optDoHaddockStackage }
64− -- generate stackage packages
65− nodes <- traverse (uncurry (buildNodeM s2nPackageSetConfig s2nPackageConfig))
64+ allNodes <- traverse (uncurry (buildNodeM s2nPackageSetConfig s2nPackageConfig))
66 $ Map.toList (bpPackages buildPlan)
65 $ Map.toList (bpPackages buildPlan)
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
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
67 withFile (opts ^. optOutStackagePackages) WriteMode $ \h -> do
80 withFile (opts ^. optOutStackagePackages) WriteMode $ \h -> do
68 hPutStrLn h ("# Generated by stackage2nix " ++ Text.display version ++ " from " ++ buildPlanFile)
81 hPutStrLn h ("# Generated by stackage2nix " ++ Text.display version ++ " from " ++ buildPlanFile)
69 hPutStrLn h $ render $ pPrintOutPackages (view nodeDerivation <$> nodes)
82 hPutStrLn h $ render $ pPrintOutPackages (view nodeDerivation <$> nodes)