Note: most of this article is simply an incomplete natural language narration of what Crystal's Makefile specifies. If you, like me, feel a bit intimidated by Make, you may find this article more welcoming than venturing into the code by yourself and figuring things out from scratch.
At the root level of crystal-lang/crystal there's a Makefile that triggers the build process.
The default task in that Makefile is crystal.
That task checks whether there's a .build/crystal executable.
To build the executable, you first need its dependencies (DEPS) and the source code (SOURCES).
With the dependencies built and the list of source code files, we are ready to compile Crystal, by running a previous version of the compiler that sits at bin/crystal. The new compiler will be written to .build/crystal.