Posts

Showing posts with the label makefile

GNU Make - Unconditionally run a target before any other targets

When writing a (GNU) Makefile, there are times when you need a particular target(s) to be run before anything else.  That can be for example to check the environment, ensure variables are set or prepare a particular directory layout.  TLDR; Define a non-phony target for a non-existing file and then include the target as if you were including a real makefile. For example: always-run-before-all : ... include always-run-before-all Usecase Ever since I've started using bmakelib to enhance my makefiles, I've always found myself writing a target ensure-variables , which I then would declare as the prerequisite of almost all other targets. include bmakelib/bmakelib.mk ####################################### .PHONY : ensure-variables ensure-variables : bmakelib.error-if-blank( REQUIRED_VAR1 REQUIRED_VAR2 ) ensure-variables : bmakelib.default-if-blank( OPTIONAL_VAR,some-value ) ######################################## my-target : ensure-va...

Variables in GNU Make: Simple and Recursive

There are two major flavours of variables in GNU Make:  "simple" and "recursive".  While simple variables are quite simple and easy to understand, they can be limiting at times.  On the other hand, recursive variables are powerful yet tricky. Basics Let's review the definition of the two flavours. Simple variable The value of a simple variable is computed exactly once no matter how many times it is expanded.  More importantly, the value is computed when the variable is defined and not when it is used.   For example in the snippet below, the value of a-simple-var is computed only on line #1 and is simply reused on lines #4 and #5.  a-simple-var := ... target1 : echo $(a-simple-var) echo $(a-simple-var) Recursive variable The value of a recursive variable is computed every time it is expanded .  Unlike a simple variable, the value is not computed when the variable is defined. ...