I am not aware of any way to define programatically targets in GNU Make. How is this possible?
Sometimes one can go away with alternate methods. The ability to define programatically targets in Makefiles is however a very important to write and organise complex production rules with make
. Examples of complex production rules are found in the build system of FreeBSD or in Makefile libraries such as BSD Owl
The main differences between shell scripts and Makefiles are:
In a Makefile, the state of the program is given by the command line and the filesystem, so it is possible to resume a job after it has been interrupted. Of course, this requires to properly write the Makefiles, but even if this is rather hard, it is considerably easier than to achieve a similar effect with a shell script.
In a Makefile, it is ridiculously easy to decorate a procedure with advises or decorate it with hooks, while this is essentially impossible in shell scripts.
For instance, a very simple and useful pattern is the following:
build: pre-build
build: do-build
build: post-build
This presents the build
target as a composite of three targets, one containing the actual instructions do-build
and two other that are hooks, executed before and after do-build
. This pattern is used by many build systems written for BSD Make, which incidentally allows programmatic definition of targets, so that one can write in a batch:
.for _target in configure build test install
.if !target(${_target})
${_target}: pre-${_target}
${_target}: do-${_target}
${_target}: post-${_target}
.endif
.endfor
The condition introduced by the .if/.endif
block enables the user to use its own definition of any ${_target}
.
What would be the translation of that snippet for GNU Make?
-j
I believe it is generally safe to assume you do) so your "hooks" don't necessarily do what you want. – Brogdon.ORDER: pre-build do-build post-build
to enforce serial processing of the mentioned targets. – Nth-j
, make will always walk the prerequisites list in the same order. It's just that with-j
, make won't wait for previous (non-dependent) prerequisites to finish before starting new ones (of course this can cause some jobs to run in a different order due to prerequisites not completing). Without-j
make does guarantee the in-order build. – Inscribe