God knows I wrote one or the other Makefile in my life. But I always found it kind of a struggle. For really small projects I therefore preferred shell scripts. For really large projects Automake seemed like the way to do it. But Automake creates a bunch of files, with practically unmanageable (and unreadable) makefiles. Lastly it creates yet another dependency and needs the original make to run.
In one of my academic projects I therefore decided to switch to another build system. I had quite some systems in my mind. Initially I wanted to go for FAKE, which is a F# based DSL build system. The major problem is that we purely use Linux and in reality no machine has Mono / the F# compiler (or even FAKE) installed. There are similar choices as well:
- Rake (Ruby based Make)
- CMake (C based Make)
- Maven (Java based)
The choices seem to be endless, as there are a lot more tools, however, looking different to Make. I was especially attracted to consider Gulp, which has a superior streaming model. However, since most C(++) compilers (or tools) do not work with node / streams (directly), one would be forced to use the file system anyway. Additionally while there is much tooling available for web tasks, such as minifying JavaScript files, there are nearly no plugins for C++ / native development.
In the end I decided to go with Jake. Jake is a JavaScript build tool - and it is a much better alternative to make. It is similar to Rake, however, based on JavaScript and node. One might argue that similar restrictions exist as with FAKE, however, there are reasons why the situation is much better:
- node runs quite well on Linux and can be easily installed via any package manager
- npm installs tools such as Jake easily and via CLI
- The specific project requires JavaScript / node anyway (there are some additional tools that are delivered as node scripts)
Therefore changing from Make to Jake is not only possible, but actually smart. Some dependencies have to be installed anyway and the expressiveness of JavaScript, combined with the original ideas of Make create a build process that is elegant, easy to understand and extensible.
I will publish a short article on this matter on my homepage soon. There I will describe what changed and why I guess it is an improvement. Additionally this should be better (and much more practical) than the documentation of Jake, which is not very good. I learned more about the software by looking at the source-code (thank god for the whole open-source movement).