Ваше первое правило:
default: *.s
echo $(basename $<)
работает так, как вы ожидаете, потому что *
является символом подстановки в GNU Make.
С другой стороны, ваш второе правило:
default: %.s
echo $(basename $<)
имеет %.s
в качестве предпосылки. Поскольку нет файла с именем %.s
Make требует дополнительного правила для создания этого отсутствующего файла %.s
. Вот что говорит об ошибке:
make: *** No rule to make target '%.s', needed by 'default'. Stop.
Вы можете подумать, что %
является подстановочным знаком. На самом деле, он ведет себя как таковой в шаблонных правилах . Однако ваше второе правило не является шаблонным правилом. Следующее является выдержкой из документации:
Правило шаблона выглядит как обычное правило, за исключением того, что его цель содержит символ "%" (ровно один из них).
Цель вашего второго правила - т.е. default
- не содержит символа %
. Поэтому его нельзя квалифицировать как правило шаблона, поэтому %
в предварительном условии, %.s
, является буквально символом %
.