Что означает * .o / .Suffixes в Makefile? - PullRequest
20 голосов
/ 06 января 2010

Я видел такие команды во всех файлах Makefile, которые я не совсем понимаю:

vpath.o: make.h config.h getopt.h gettext.h dep.h

и

.SUFFIXES:
.SUFFIXES:  .f  .o
#
# %------------------%
# | Default command. |
# %------------------%
#
.DEFAULT:
    @$(ECHO) "Unknown target $@, try:  make help"
#
# %-------------------------------------------%
# |  Command to build .o files from .f files. |
# %-------------------------------------------%
#
.f.o:
    @$(ECHO) Making $@ from $<
    @$(FC) -c $(FFLAGS) $<

Что означают *.o и *.suffixes?

Примечание. Эти две команды относятся к разным частям скрипта.

Ответы [ 5 ]

27 голосов
/ 06 января 2010

Первая строка вашего вопроса - это просто стандартное правило 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 для общего переносимого синтаксиса.

4 голосов
/ 06 января 2010

Как уже упоминалось, строка
.SUFFIXES:
удалил бы все известные суффиксы. Это сделано для того, чтобы:

  • суффиксы по умолчанию не будут мешать вашим специальным суффиксам.
  • Различные программы make имеют несовместимые списки суффиксов и неявные правила, и это иногда создает путаницу или плохое поведение Общие соглашения для Makefile

Если вы используете GNU make, лучше использовать шаблонные правила, а не суффиксные. поскольку они (суффиксные правила) существуют для совместимости. Также суффиксные правила не могут иметь предпосылки свои.

Таким образом, вы переписали бы правило суффикса формы:

.f.o:
...

как шаблонное правило вида:

% о:..% Е:
...

Обратите внимание, что в суффиксных правилах префикс обязательного префикса идет первым, а целевой суффикс идет вторым, тогда как, как и в случае с шаблонными правилами, он наоборот (и менее запутан).

Если вы планируете больше работать с make-файлами, проверьте также книгу Управление проектами с помощью GNU Make который доступен онлайн.

3 голосов
/ 06 января 2010

Синтаксис Makefile является тонким и быстро раздражает. Я мог бы предложить взглянуть на документацию для make , особенно на часть о правилах суффикса .

2 голосов
/ 06 января 2010

Первая строка .SUFFIXES очищает все знания о «встроенных» суффиксах; вторая восстанавливает суффиксы .f (традиционно Fortran) и .o (объектные файлы). Правило .DEFAULT используется, когда больше ничего нельзя использовать. И последнее правило компилирует файл .f в файл .o с использованием компилятора $(FC). @ означает, что не повторяет команду - и раздражает меня (я предпочитаю видеть команды, используемые для компиляции).

Я не вижу *.suffixes в выдержках из make-файла, поэтому не могу сказать вам, что это значит.

0 голосов
/ 11 сентября 2013

вы также можете использовать цепочку суффиксного правила, например, в следующем, чтобы сгенерировать tex и pdf из файла gnuplot:

.SUFFIXES: .plt .tex .pdf

# (notice that there should be tabs prefixing the lines after the rule)
%.tex: %.plt
gnuplot -e " \
set format '$$%g$$' ; \
set terminal epslatex standalone color ; \
set output '$@' \
" $<

%.pdf: %.tex
pdflatex $<

all: test.pdf
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...