GNU Make Alternatives
freecode.com
freecode.com
IMHO the most important edition since is djb "redo", which has since been implemented by apenwarr https://github.com/apenwarr/redo/ - It replaces make's dependency tracking with something significantly simpler and yet more reliable, and uses your familiar shell as a language to do that.
redo does NOT try to provide project management (especially not of the "cross platform" variety offered by cmake/tmake/qmake and friends). It leaves that for other tools (and rightly so, I believe).
Another important tool not listed: premake (v3 and v4, which are very different). If you're building a C++ centered project that needs to work on Windows, Xbox, Mac, Linux, PS3 and others - it will keep whatever is left of your sanity given the situation, and help you get the job done.
After make based builds caused too much problems for us, we first moved to WAF (http://code.google.com/p/waf/), but it was too complex for our needs and extending builds with our own steps became a chore.
Then we moved to redo, which was a breeze of fresh air with it's simplicity. We build a few convenience scripts on top of it to allow easier management of build targets (OS X, iOS, iOS Simulator, Linux) and been happy since.
For projects simple enough to be manageable with those build systems, I'm already happily using make and a reasonably GNU environment (if not GNU's compiler.) For the other projects, where recursive makes and complexity becomes a distraction, I've already exceeded the parameters where these build systems are comfortable.
The acid test for me is MOSREF. MOSREF has a fairly portable ANSI C virtual machine and linker, but the compiler is metacircular and obviously nobody is going to target MOSREF for their packaged in recipes. One build system after another drove me to distraction trying to simplify MOSREF's process -- despite the fact that each step was quite simple, the order of steps was very tricky, especially when hacking on the compiler.
Redo looks like a better evolution away from Make for me, since it means no new syntax and it doesn't try to protect me from bash. Thanks for the recommendation -- I don't work much on MOSREF anymore, but maybe this offers an escape route from "go build", which has been a bit of pest for configuration management.
Not having a configuration system is a big drawback, enough to make me consider using autoconf in conjunction with Shake. Also you have to know Haskell, which will turn a lot of people away.
For example another alterntive that was created later is waf: http://code.google.com/p/waf/
I've been using that way of writing makefiles, and significantly improved dependency analysis and speed by an order of magnitude.
If you are working with a project that uses CMake, Ninja is a perfect replacement for GNU Make, because it significantly speeds up rebuilds.
edit: ah, it's 2005.
Most of the current crop of tools fails miserably at this. Whenever something goes wrong in ant, or autoconf, or jam, it's always a nightmare to debug; and the more they try to be helpful, the worse it gets.
I (usually) don't have a problem with Make, I think it's a good tool for what it does (basically, a DAG solver)
For all means use make with hand-made files.
Now, autotools/automake are a different (bad) story
The alternatives posted here are very interesting
While autotools are a bit hairy for the developer, the autotools-based builds usually work quite nicely. I regularly build the GNU toolchain (gcc + binutils + glibc) for cross compilation and usually it works like a charm. I grab the sources from git repos so naturally they have their moments, but it usually works better than any other build system.
Some build systems are a lot more convenient for simple tasks (I like CMake) but when it comes to cross compiling or truly configuring for varying build sites, autotools-based systems deliver.
A few years ago there was some hassle with autoconf/automake version numbers but that seems to have been solved now.
I find the ability to generate real projects for the various IDEs I use on different platforms to be the key differentiating factor. SCons, by comparison, wants you to set up the IDE to replace its build step with a call to the scons script. It just feels wrong by comparison.
project:
https://github.com/deplinenoise/tundra
and slides:
http://deplinenoise.wordpress.com/2011/04/23/slides-tundra-f...
A header and footer are added to the makefile, and it's then compiled using ones C++ compiler. Afther that it's run, and that's the point where ones other sources are compiled.
It was inspired by Icmake (by my C++ prof). It never really caught on (I didn't really promote it), but I still think it wasn't a terrible idea (apart, maybe, from it being language specific).
Lake: http://www.logilogi.org/pub/lake/README.LAKE.txt, http://sourceforge.net/projects/logilogi/files/lake/ Icmake: http://icmake.sourceforge.net/
Really, if you say "build foo", it should just figure it out. The only interesting part is if you have extra flags needed for some libs and/or headers, and those can be specified without too much trouble. Using pkg-config as a starting point usually helps.
I'm speaking from experience here. I stopped using make for my own builds a couple of months ago. Life is great.
Maybe I'm just conservative, but that kind of design is not the sort of thing I would ever want to rely on.
#include <stdio.h>
#include <mysql/mysql.h>
#include "base/logging.h"
#include "http/cookie.h"
// ... and so on.
Right there, you can translate that into a system header you can ignore, a system header for which you should add cflags and ldflags where appropriate (compiling vs. linking), and a couple of local libraries which need to be further investigated.http/cookie.h and base/logging.h are then analyzed, along with http/cookie.cc and base/logging.cc, assuming they exist. Any #includes there are chased down in the same manner. This continues until everything has been resolved.
If you keep track of all of these things, then you will have a list of every object file which needs to be rolled up into the final binary. You also pick up all of the flags required to compile and/or link with those things by extension.
Obviously you have to handle the whole "rebuild if something changes" thing, but that's not particularly difficult, either. I wrote my own tool to do exactly this. I'm using it for my own (C++) projects, and it's been quite pleasant. It won't work for everyone, though.
I wrote about it here: http://rachelbythebay.com/w/2012/03/28/build/
In those cases I'm positively hopeful that Make won't try to do any magic except building its dependency graph, see which files are older than their deps, and do the actions as described.
Make is no silver bullet, but it does a hell of a job at building and binding together non-ideal stuff.
The only other build system I know of that comes close is Go's built in system, but that appears to be more because of their instance on no linking
When dealing with JNI, both Maven and SBT have to delegate the task to less pure build systems. For projects that cannot nest nicely above a very high and consistent layer of abstraction, these "archaic" systems are essential because of their lack of interfering abstractions. They observe a different definition of "simple", instead of being "simple to use in a specific problem domain" they go to "simple to adapt to a different problem domain."