it usually doesn't need --force, so you don't end up with broken packages. I think cabal/ghc correctly decide when to recompile: this includes cases when a module from another package has changed. I am not sure why you're seeing something with m4, but https://github.com/aavogt/IHaskell/blob/master/build.sh uses CPP.