Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Recursive Make - friend or foe? [closed]

Tags:

I'm using (GNU) Make in my project. I'm currently putting one makefile per directory and specify the subdirectories using SUBDIRS. It's been suggested to me that this is not the ideal way of using make, that using a one toplevel make file (or several, split up using include). I've tried migrating/using this layout in the past, but it appears to me that it's unnecessary complicated.

Which are the benefits/drawbacks of using recursive makefiles?

like image 648
Johan Dahlin Avatar asked Nov 26 '08 04:11

Johan Dahlin


People also ask

Why recursive make considered harmful?

Recursive Make is considered harmful for very good reasons (Miller 1998); it is not possible to accurately track dependencies when the build system is con- structed of separate components that invoke each other.

What is recursive make?

Recursive use of make means using make as a command in a makefile. This technique is useful when you want separate makefiles for various subsystems that compose a larger system.


1 Answers

The first thing you should keep in mind (just to eliminate any misunderstanding) is that we're not talking about a single vs. multiple makefiles. Splitting your makefile in one per subdirectory is probably a good idea in any case.

Recursive makefiles are bad primarily because you partition your dependency tree into several trees. This prevents dependencies between make instances from being expressed correctly. This also causes (parts of) the dependency tree to be recalculated multiple times, which is a performance issue in the end (although usually not a big one.)

There are a couple of tricks you need to use in order to properly use the single-make approach, especially when you have a large code base:

First, use GNU make (you already do, I see). GNU make has a number of features which simplifies things, and you won't have to worry about compatibilities.

Second, use target-specific variable values. This will allow you to have, for example, different values of CFLAGS for different targets, instead of forcing you to have a single CFLAGS in your entire make:

 main: CFLAGS=-O2  lib: CFLAGS=-O2 -g 

Third, make sure you use VPATH/vpath to the full extent supported by GNU make.

You also want to make sure that you do not have multiple source files with the same name. One limitation of VPATH is that it does not allow you to have target-specific VPATH definitions, so the names of your source files will have to co-exist in a single "VPATH namespace".

like image 50
JesperE Avatar answered Oct 12 '22 22:10

JesperE