
Hi, I was about to extend Dist.Simple.Utils with a method called mkSharedLibName, which depends on Compiler information, hence Dist.Simple.Utils was about to import Dist.Compiler. I ran into this dependency loop: Module imports form a cycle for modules: Cabal-1.1.7:Distribution.Compiler imports: <..> Distribution.Program <...> Cabal-1.1.7:Distribution.Program imports: <..> Distribution.Simple.Utils <..> Cabal-1.1.7:Distribution.Simple.Utils imports: <..> Distribution.Compiler <..> make: *** [.depend] Error 1 After a short discussion on #ghc, Esa Ilari Vuokko explained that Dist.* is not supposed to depend on Dist.Simple.*, so it seems reasonable to break the dependency cycle at "Program -> Simple.Utils". Program imports 'die' and two program execution helpers 'rawSystemExit' and 'rawSystemStdout' from Simple.Utils. Two dependencies on 'die' could be removed easily, hunk ./Distribution/Program.hs 192 - Nothing -> die ("Cannot find " ++ prog ++ " on the path") $ + Nothing -> return EmptyLocation hunk ./Distribution/Program.hs 213 - _ -> die ("cannot determine version of " ++ name ++ " :\n" ++ show str) + _ -> return prog { programVersion = Nothing } but the other two uses seems rather ok to me (is it ok to _|_ when an API is used in an illegal way?), namely: rawSystemProgram _ prog@(Program { programLocation = EmptyLocation }) _ = die ("Error: Could not find location for program: " ++ programName prog) Esa suggested a wider refactoring, namely to remove rawSystemExit and rawSystemStdout from Program.hs. Esa, you could explain the details? Would it be ok to move 'die' and the rawSystem helpers into the Dist.* hierarchy if this takes longer to resolve? -- Fruhwirth Clemens - http://clemens.endorphin.org