почему мой make-файл работает со звездочкой как подстановочный знак, а не с процентами? - PullRequest
1 голос
/ 18 января 2020

В моем make-файле:

default: *.s
   echo $(basename $<)

Повторяет базовое имя, но

default: %.s
   echo $(basename $<)

выводит:

make: *** No rule to make target '%.s', needed by 'default'.  Stop.

У меня есть smf.s файл в каталоге где находится make-файл. Так почему бы не использовать его в качестве предварительного файла? (только оболочка * делает, но % нет), почему?

1 Ответ

0 голосов
/ 18 января 2020

Ваше первое правило:

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, является буквально символом %.

...