A compiler should be a pure function that takes source files to interface/object files, making it easy for the build system to cache/memoize its results.
GHC violates this in various ways:
searches for .hi and .hi-boot files (even in -c mode), the search locations can be seen with -v
cares about module file names
forwards vs backwards build systems
Build Systems à la Carte