# A Makefile that explores pattern and grouped rules. This Makefile expects the # GNU version of Make. # Relevant docs: # https://www.gnu.org/software/make/manual/html_node/Automatic-Variables.html # https://www.gnu.org/software/make/manual/html_node/Pattern-Match.html # https://www.gnu.org/software/make/manual/html_node/Pattern-Intro.html # https://www.gnu.org/software/make/manual/html_node/Multiple-Targets.html NAMES=zip zap .PHONY: all clean all: $(NAMES:%=%.x) $(NAMES:%=%.y) # Here's a simple pattern rule that generates a .txt file from a name. In this # rule % represents the name (the 'stem' in Makefile lingo) in the targets and # prerequisites, and $* represents the stem in the recipe. %.txt: @echo "=> Making $*.txt" python -c 'print("$*!".title())' > "$@" # Here are a couple explicit rules that generate a single file given some input # files. Note the input files (prerequisites) will be generated with the pattern # rule above. zip.a : florp.txt @echo "=> Making $@ with $<" cat "$<" > "$@" zap.a : bloop.txt @echo "=> Making $@ with $<" cat "$<" > "$@" # This is a Grouped rule, marked with &:. It indicates that the two target files # are produced together in one invocation of the rule, rather than two separate # files produced by the same rule. zip.x zip.y &: zip.a @echo "=> Making XY files from $< with explicit rule" echo "[X]" > zip.x cat "$<" >> zip.x echo "[Y]" > zip.y cat "$<" >> zip.y # Pattern rules with multiple targets are always Grouped, so you don't need the # &: separator. %.x %.y : %.a @echo "=> Making XY files from $< with pattern rule" echo "[X]" > $*.x cat "$<" >> $*.x echo "[Y]" > $*.y cat "$<" >> $*.y clean: rm -f bloop.txt florp.txt rm -f $(NAMES:%=%.a) rm -f $(NAMES:%=%.x) rm -f $(NAMES:%=%.y)