Using Foreach to Create Rules in GNU Make
Created on 2022-04-16T16:10:24-05:00
TOOLS:=foo bar
.PHONY: all
all : $(TOOLS)
.PHONY: install $(addprefix install_,$(TOOLS))
install : $(addprefix install_,$(TOOLS))
.PHONY: uninstall $(addprefix uninstall_,$(TOOLS))
uninstall : $(addprefix uninstall_,$(TOOLS))
define TOOL_template
$(1): $$($(1)_OBJS)
#commands to build it
install_$(1): $(1)
install -c $(1) $$(prefix)/bin/$(1)
uninstall_$(1):
rm $$(prefix)/bin/$(1)
endef
$(foreach tool,$(TOOLS),$(eval $(call TOOL_template,$(tool))))
The separate install and uninstall targets are a pattern needed so that parallel jobs function.
NOTE: the 'eval' can probably be removed as others on stack overflow suggest.