Notes on Make build automation tool.

[ Check out all posts in “makefile” series here. ]

I mentioned some problematic aspects of working with make in my previous post. I will conclude this topic with the ugly parts.

Make has functions, but they are really just raw text transformations.

Make seemingly allows you to setup recursive builds. But for most projects you apply it to, the DAG it generates will be incorrect, because the dependency relationships of the inner graph will be opaque to the outer. You can check out a paper, and the corresponding HN discussion about this problem here.

Choosing a flat build setup instead is often recommended, but that means you need to be more specific and verbose with the variable names.

The semantics of many features turn out to be different than what most users would have expected.

It is difficult to avoid coupling between parts of the makefile, unless you choose to have very repetitive and verbose makefiles.

A higher level build tool is no silver bullet. Dependency issues are common regardless. However, by design, they provide consistent - and sometimes opinionated - frameworks of how the most common problems should be solved. And if the framework fits your needs, the bugs tend to be more contained, and they stand out.

So yeah. That’s the end of this topic. Thanks!