Most build systems start small and simple, but over time grow into hairy monsters
that few dare to touch. As we demonstrate in this paper, there are a few issues
that cause build systems major scalability challenges, and many pervasively
used build systems (e.g. Make) do not scale well.
This paper presents a solution to the challenges we identify. We use functional
programming to design abstractions for build systems, and implement
them on top of the Shake library, which allows us to describe build rules and
dependencies. To substantiate our claims, we engineer a new build system
for the Glasgow Haskell Compiler. The result is more scalable, faster, and
spectacularly more maintainable than its Make-based predecessor.