Hacker News new | ask | show | jobs
by Julio-Guerra 3859 days ago
Over the last few years, I wrote a GNU Make library to make people able to write Makefiles in a very declarative way to help everyone in my company, me included, with this serious problem. I tried to make it as simple as possible using simple widespread concepts like UML components where you simply say a component has interfaces you can require and implementations you can link against. It is used to build our Operating System, our applications and even our reactjs web application.

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

1 comments

Honest question: Why not use cmake?
cmake does not really offer the declarative interface I want (i.e. descriptions of components). It is still "low-level" and I would have to write cmake macros too. So I preferred native gnu make. Adding another tool on top of Make adds another layer of complexity, no matter how simple it is.

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.