On 10 Mar 2018, at 20:10, jason wrote:

Any interest in trying out the Bazel build system? It's really fast (like
ninja), and does not allow undeclared dependencies in C-language build
rules by design.

The ninja build system itself is a bit like make in that it’s just a low-level DSL to describe the dependency graph.

There is a script that generates the graph, which is heavily customized to the needs of TextMate (and myself). I have looked at other build systems, and I also took a quick look at Bazel, but I do not see an advantage in switching, as I would have to write a ton of custom code to bring it up to what the current system does, and for this, it’s actually best with a low-level build system rather than one that tries to handle everything, since there are no standards for how to manage multiple targets that can depend on each other, use each other’s header files, resources, etc., which means all the free stuff you get out of the box with these higher level build systems are often stuff that is just in the way when you have a complex project…

For the dependency cycle that ninja “did not detect”, I do actually have some (non-committed) code that improves on dependency detection which would have caught this, but it’s not just a simple “source depends on header” issue, but about link dependencies, which can be a little tricky, as you can’t assume that including a header file means you necessarily wants to link with the library to which the header belongs, for example some sources may include oak/debug.h but do not want to automatically link with my oak debug library, unless in debug mode, and iirc that was the primary reason I didn’t yet push the code that automatically figures out link dependencies.