I like make, a lot, for building things. I don’t like doing smart things in make other than that.
Half the time when I have to deal with a new build system I really just wish that they were little more than a language specific way to generate a Makefile. Rebar is a great example of this. Rebar, for building Erlang, is absolute trash. It’s pretty much terrible in every way. Even though it’s in Erlang, parallel builds don’t even work! But rebar is really nice for generating releases, and all you have to do is toss your .erl file in there and it knows to build it. I really wish Rebar just compiled a Makefile for me. Make Just Works.
Add one more to the list.
I recently discovered Tup http://gittup.org/tup
Does anybody have any experience using Tup over Make? Is it yet another DSL or does it offering something more compelling?
I futzed with it a while ago. I found it to be interesting, but ultimately not very flexible – in particular doing any sort of compilation across nested subdirectories was pretty gnarly (I would’ve had to write some script to create a Tupfile that generated the right dependency lines, because tup doesn’t see past the first layer of subdirs. The neat thing is the use of fsevents to track dependencies, that was a stroke of genius, I just wish it was a bit more amenable to deeply nested source trees (like the one I’m stuck with) that have code at every level (like the one I’m stuck with).
I’m not the slightest bit fond of Gradle, but it’s pretty silly to lump it together as “just another Make clone”. Make does nothing to actually fetch the dependencies your project needs to compile, which as I understand it is about half the point of Gradle.
I don’t like this article much. Reinvention, cloning – whatever you want to call it, it’s a valuable tool in terms of expanding the mindset about the tool being reinvented. For instance, Rake has a whole bunch of tools related to managing lists of files, making it easier to slice and dice your codebase into chunks. It’s also got a right-and-proper programming language behind it, making tasks that would be hard to do in shell and (god forbid) m4 a lot easier.
Furthermore, in terms of learning the language, it gives newcomers a easy to understand tool to use as a gateway to understanding the rest of the language. “Here is rake, it’s a basic framework for doing dependency oriented programming, the blocks are all just regular ruby, the framework is the stuff on the lines with ‘task’ in it, go to town” – It allows a newcomer to say, “Well I know what make should do, so I can guess that rake will do similar.” That’s a lot of value.
I guess I don’t think it’s a bad thing to keep re-inventing make, it’s not unreasonable to say we didn’t necessarily get it right on the first try, or any of the subsequent ones yet, IMO.