Notes on Writing Makefiles
eigenstate.org
eigenstate.org
I decided to make it open source a few months ago but it lacks examples and documentation, sorry... You can check out this test to see how it looks like in the test-suite: https://github.com/farjump/Makefile.in/blob/dev/test/externa...
It solved every problem I noticed about writing bare Makefiles: dependency tracking and generation is automated; the Makefile can be split into multiple sub-makefiles in your source-tree so that it matches your UML (these one http://agilemodeling.com/images/models/componentDiagramUML1.... you can perform out-of-source builds; generating complex software with deep dependency trees made simple (you inherit from other components' dependencies), etc.
Bonus: it also includes some hacks with GNU Make metaprogramming https://github.com/farjump/Makefile.in/blob/dev/src/mk/core/... :D
To me, the big benefit of cmake is its portability because it is able to generate visual studio files, eclipse files, etc.
Another one is that you end up with a static Makefile while my solution is dynamic: the makefile is evaluated at every execution (unless gnu make caches its parsed files but I don't think it does so far). It could be a problem for big projects like linux which would require a certain amount of parsing time of the Makefiles before evaluating them - while cmake or autotools, you go through this only once.
Amen. Been writing small makefiles for many years, and only recently learned how to use pattern rules properly. They finally relieved my temptation to use eval.
Speaking of eval, I have one makefile tip I've learned the hard way: the example in the gnu make manual for eval doesn't run! It has an incorrect "=" (equals sign) in the define. I've racked my brain against that one for hours, twice, because a couple years later I'd forgotten about the first time I figured it out.
But once you have a Makefile that works, it's easy to extend. Overall I'm glad I bothered to learn it (at least a little bit), and I'm rewarded with a .deb file that can set up it's own environment rather than me having to set it up separately. FPM can include all the boilerplate scripting to do this, but you end up with so many flags (or wrapper scripts) that you may as well just go with debuild/Make in the first place.