Цели, которые имеют одинаковые предпосылки и рецепт, могут быть просто объединены, например, так:
$(TGTDIR32)/logdir/set_user.c $(TGTDIR64)/logdir/set_user.c: $(CURDIR)/slv/set_user.c
$(file_transfer)
или, в более общем случае:
THESE_TARGETS := $(TGTDIR32)/logdir/set_user.c $(TGTDIR64)/logdir/set_user.c # More...?
...
$(THESE_TARGETS): $(CURDIR)/slv/set_user.c
$(file_transfer)
Если Make решит, что любой член $(THESE_TARGETS)
устарел относительно предварительных условий, тогда он запустит рецепт для этой цели .
Этот make-файл:
.PHONY: all clean
all: a b c
a: d e
touch $@
b: d e
touch $@
c: d e
touch $@
d:
touch $@
e:
touch $@
clean:
$(RM) a b c d e
эквивалентенвот это:
.PHONY: all clean
all: a b c
a b c: d e
touch $@
d e:
touch $@
clean:
$(RM) a b c d e
Позже
Существуют некоторые статические правила шаблонов ...
То же самое относится.Этот make-файл со статическими шаблонными правилами:
.PHONY: default clean
default: a.k b.k
a.k: %.k: %.j
cp -f $< $@
b.k: %.k: %.j
cp -f $< $@
a.j:
touch $@
b.j:
touch $@
clean:
$(RM) a.k b.k a.j b.j
эквивалентен этому:
.PHONY: default clean
JS := a.j b.j
KS := $(JS:.j=.k)
default: $(KS)
$(KS): %.k: %.j
cp -f $< $@
$(JS):
touch $@
clean:
$(RM) $(JS) $(KS)