Array is the only one that I have found lacking, in my experience.
Array is the only one that I have found lacking, in my experience.
Look at how a modern build system (like qbs) organizes the build. It builds a declarative object graph describing the project and maps that to a dependency graph where each node can be a relatively complex object ("compile C++ file X using flags Y" or "link LargeSetOfFiles") annotated with modification data (like input file hashes). (Then it compares the dependency graph to what is found on the system and creates a list of commands to execute in order to bring whatever is on the system to the desired state, i.e. create an up to date build).
You can find a nice explanation in the "tup" build tool, although there are of course many others: http://gittup.org/tup/
And yes, you can express DAGs with text and/or filesystem operations (plus symlinks), but not efficiently and writing code that operates on that level is cumbersome.
Is there any similar build system? I know of https://github.com/droundy/fac, but it's not cross-platform
1) reasonably easy to use 2) very fast 3) very correct
Most build systems fail 3), usually 2) and often also 1).
$ cat > f
a c
a d
b c
^D
$ tsort f
a
b
d
chttps://news.ycombinator.com/item?id=15043633
debug/release, internationalized builds, coverage builds, profile-directed feedback, running parameterized test suites, etc.