См. Руководство по GNU Make 4.13 Правила двоеточия ,
особенно:
В каждом правиле двойного двоеточия должен быть указан рецепт; если это не так, неявное правило будет использоваться, если оно применяется. См. Использование неявных правил.
Правило двойного двоеточия:
targ.bin :: dep
не имеет рецепта. Поэтому он выражает только зависимость targ.bin
-> dep
и неявное правило:
%.bin : some-reqs
some rules
указывает, что targ.bin
должно быть обновлено путем выполнения:
some rules
а также подразумевает зависимость targ.bin
-> some-reqs
.
Марка объединяет все предпосылки цели targ.bin
. Итак, ваш Makefile подразумевает, что:
dep: some-req
some rules
targ.bin : some-reqs dep
some rules
- полный рецепт для targ.bin
. Как утверждают:
Makefile
targ.bin :: dep
dep: a
echo '$@ -> $^'
%.bin : b
echo '$@ -> $^'
, который работает как:
$ touch a b
$ make
echo 'dep -> a'
dep -> a
echo 'targ.bin -> b dep'
targ.bin -> b dep
Позже
Предположим, что в приведенном вами примере с правилом двойного двоеточия есть рецепт, означает ли это, что неявное правило не будет применяться?
См. 10.1 Использование неявных правил , особенно:
Как правило, производите поиск неявного правила для каждой цели и для каждого правила с двойным двоеточием, которое не имеет рецепта.
Так что да, если бы у правила двойного двоеточия был рецепт, то неявное правило не было бы применено. Я оставлю тебе эксперимент.