Подтвердить что ты не робот

Что означает *.o/.Suffixes в Makefile?

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

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

и

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

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

Примечание. Две команды из разных частей script.

4b9b3361

Ответ 1

Первая строка в вашем вопросе - это просто стандартное правило Makefile.

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

Файл A .o является объектным файлом; это промежуточный продукт между исходными файлами и окончательным скомпилированным двоичным кодом. Он содержит скомпилированный код, но он еще не был объединен в полную библиотеку или двоичную. Это правило просто говорит, что vpath.o зависит от make.h, config.h и т.д., И каждый раз, когда они изменяются, их следует перекомпилировать. Команды, необходимые для сборки vpath.o, должны следовать на последующих строках с отступом с символом табуляции. (Извините, если я повторяю то, что вы уже знаете, я не был уверен, в какой части этой первой строки вас смутили).

.SUFFIXES не ссылается на фактический суффикс файла; это просто особый тип правила в make файле, который используется для настройки "правил суффикса".

Правила суффикса - это правила формы .a.b, которые вы видите с помощью правила .f.o. Это способ сообщить make, что каждый раз, когда вы видите, скажем, файл .f (исходный файл), вы можете сделать из него файл .o (целевой файл), следуя этому правилу, где $< указывает исходный файл, а [email protected] представляет целевой файл.

.SUFFIXES "target" - это способ определить, какие суффиксы вы можете использовать в своих правилах суффикса. При использовании без предварительных условий он очищает встроенный список суффиксов; при использовании с предварительными условиями он добавляет их в свой список известных суффиксов, которые могут использоваться в правилах суффикса.

В GNU make вы можете использовать более мощный и понятный % для формирования правил шаблона, например:

%.o: %.c
    gcc -c -o [email protected] $<

который является эквивалентом правила суффикса:

.c.o:
    gcc -c -o [email protected] $<

Смотрите GNU Сделайте документацию для получения дополнительной информации (но также упоминающей расширения GNU) или Single Unix Specification/POSIX для общего переносимого синтаксиса.

Ответ 2

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

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

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

Итак, вы должны переписать правило суффикса формы:

.f.o:
...

как шаблонное правило формы:

% о:..% F:
...

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

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

Ответ 3

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

Ответ 4

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

Я не могу видеть *.suffixes в экстрактах makefile, поэтому я не могу сказать вам, что это значит.

Ответ 5

вы также можете использовать цепочку правила суффикса, например, в следующем, чтобы сгенерировать 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 '[email protected]' \
" $<

%.pdf: %.tex
pdflatex $<

all: test.pdf