In theory, dmd is really easy to build: it's just a collection of D files in a single repository with no external dependencies. Why have there always been such complex makefiles/scripts to build it?
Well, after replacing most of dmd's backend's C-style extern function declarations with proper imports [1], there's a simple way to build the compiler. Instead of needing to list every source file, you can leverage the -i
flag which automatically compiles imports, and create a build script as short as this:
echo -n "/etc" >> SYSCONFDIR.imp
cd compiler/src
dmd -i dmd/mars.d -of=../../dmd dmd/eh.d dmd/backend/dtype.d -version=MARS -Jdmd/res -J../..
On my linux pc, these 3 lines take 2.0 seconds to complete and it uses max 680MB RAM.
The official way to build a non-release compiler is:
cd compiler/src
rdmd build.d BUILD=debug
build.d is 2400 lines, takes 2.3 seconds to complete a clean build, and uses max 613MB RAM.
The build script does separate compilation, multi-threading, includes debug info (-g
), and builds other things as well. Still, my takeaways are:
- The build script is overly complex
dmd -i
is awesome- Without too much templates/CTFE, dmd compiles pretty fast (150 KLOC/second in this case), reducing the need for incremental/parallel compilation
Eventually I hope to make just dmd -i dmd/mars.d
work, I'll see how close I can get to that.