Что Делает *.o/.Suffixes в Среднем Make-файле?

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

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 средний?

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

20
задан Graviton 7 January 2010 в 03:15
поделиться

4 ответа

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

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

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

The . SUFFIXES не относится к собственно файловым суффиксам; это просто специальный вид правила в makefile, который используется для настройки "суффиксных правил".

Суффиксные правила - это правила вида .a.b, такие как вы видите с вашим правилом .f.o. Они позволяют сказать сделать , что каждый раз, когда вы видите, скажем, файл .f (файл-источник), вы можете сделать . o файл (целевой файл) из него, следуя этому правилу, где $< указывает на исходный файл, а $@ представляет целевой файл.

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

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

%.o: %.c
    gcc -c -o $@ $<

, что эквивалентно суффиксному правилу:

.c.o:
    gcc -c -o $@ $<

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

.
27
ответ дан 30 November 2019 в 00:09
поделиться

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

.
3
ответ дан 30 November 2019 в 00:09
поделиться
[

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

] [

]Я не вижу []*.суффиксов[] в экстрактах makefile, поэтому не могу сказать, что это значит.[

].
2
ответ дан 30 November 2019 в 00:09
поделиться

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

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

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

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

.f.o:
...

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

%. O:%. F:
...

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

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

4
ответ дан 30 November 2019 в 00:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: