Первая строка вашего вопроса - это просто стандартное правило Makefile.
vpath.o: make.h config.h getopt.h gettext.h dep.h
Файл .o
является объектным файлом; это промежуточный продукт между вашими исходными файлами и финальным скомпилированным двоичным файлом. Он содержит скомпилированный код, но еще не был связан в полную библиотеку или двоичный файл. Это правило гласит, что vpath.o
зависит от make.h
, config.h
и т. Д., И каждый раз, когда они меняются, его следует перекомпилировать. Команды, необходимые для сборки vpath.o
, должны следовать в последующих строках с отступом в виде символа табуляции. (Извиняюсь, если я повторяю то, что вы уже знаете; я не был уверен, с какой частью этой первой строки вы были озадачены).
.SUFFIXES
не относится к фактическому суффиксу файла; это просто особый вид правил в make-файле, который используется для настройки «суффиксных правил».
Суффиксные правила - это правила вида .a.b
, которые вы видите в своем .f.o
правиле. Это способ сообщить make
, что каждый раз, когда вы видите, скажем, файл .f
(исходный файл), вы можете создать из него файл .o
(целевой файл), следуя этому правилу, где $<
обозначает исходный файл, а $@
обозначает целевой файл.
«цель» .SUFFIXES
- это способ определить, какие суффиксы вы можете использовать в своих суффиксных правилах. При использовании без предварительных условий он очищает встроенный список суффиксов; при использовании с предварительными требованиями он добавляет их в свой список известных суффиксов, которые могут использоваться в суффиксных правилах.
В GNU make
вы можете использовать более мощный и понятный %
для формирования шаблонных правил, например:
%.o: %.c
gcc -c -o $@ $<
, что эквивалентно суффиксному правилу:
.c.o:
gcc -c -o $@ $<
См. Документацию GNU Make для получения дополнительной информации (но также упоминаются расширения GNU) или Single Unix Specification / POSIX для общего переносимого синтаксиса.