cross-posted from: https://lemmy.ml/post/6856563
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.
… take advantage of GNU Make’s mechanism of
include
ing andmake
ing makefiles which is described in details in the manual:
To solve your DRY problem, you may not realize that you can generate target rules from built-in functions
eval
andforeach
and a user-defined new-line macro. Think of it like a preprocessor step.For example:
# This defines a new-line macro. It must have two blank lines. define nl endef # Generate two rules for ansible playbooks: $(eval $(foreach v,1 2,\ .PHONY : ansible.run-playbook$v $(nl)\ \ ansible.run-playbook$v : ensure-variables cleanup-residue | $$(ansible.venv)$(nl)\ ansible.run-playbook$v :;\ ... $(nl)\ ))
I winged it a bit for you, but hopefully I got it right, or at least right enough you get what I’m doing with this technique.