Учитывая ваше makefile
...
a/% b/%:
@echo $@
Подумайте, что происходит, когда вы вызываете make a/a b/b
.make
замечает, что правило a/% b/%:
совпадает с основанием a
(т. Е. Встроенная переменная $*
будет a
) и запускает команду.Поскольку у вашего правила есть несколько целей, make
теперь считает, что и a/a
, и b/a
были обновлены.
Make затем считает следующую цель, указанную в командной строке b/b
,Это еще не было обновлено, поэтому make
снова запускает то же правило, но со стеблем b
.Таким образом, правило запускается дважды - по одному разу для каждого ствола шаблона a
и b
.
Теперь рассмотрим, что происходит при вызове make a/a b/a
.На этот раз обе цели будут соответствовать одному и тому же правилу, но с одинаковым стволом a
.Следовательно, make
, запустив правило со стволом a
, считает, что и a/a
, и b/a
были обновлены, и не видит необходимости перезапускать правило для второй цели командной строки b/a
.
* 1033.* Не совсем понятно, какое поведение вам требуется, но если вы хотите, чтобы одно и то же правило вызывалось несколько раз для разных целей, даже если основа шаблона одинакова, вам может понадобиться что-то вроде ...
# Possible targets (for illustration purposes).
#
TARGETS := a/a a/b b/a b/b
$(TARGETS): %:
@echo $@
Вышеприведенное дает ...
GM> make -f multi-wildcard-target-in-makefile.mk a / ab / b
a / a
b / b
GM> make -f multi-wildcard-target-in-makefile.mk a / ab / a
a / a
b / a