Я видел команды как это на всем протяжении 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
средний?
Примечание: Две команды от различных частей сценария.
Первая строка в вашем вопросе - стандартное правило 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 для общего, переносимого синтаксиса.
. Синтаксис Makefile
тонкий и быстрый к гневу. Я могу предложить взглянуть на документацию для make, в частности на часть о суффиксных правилах .
] Первая строка [].SUFFIXES[
] очищает все знания о "встроенных" суффиксах; вторая восстанавливает суффиксы [].f[
] (традиционно Fortran) и [].o[
] (объектные файлы). Правило [].DEFAULT[
] используется, когда больше ничего нельзя использовать. И последнее правило компилирует файл [].f[
] в файл [].o[
], используя компилятор []$(FC)[
]. Значение []@[
] означает не повторять команду - и раздражает меня (я предпочитаю видеть команды, используемые для компиляции).[
]Я не вижу []*.суффиксов[
] в экстрактах makefile, поэтому не могу сказать, что это значит.[
Как уже упоминалось, строка
. СУФФИКСЫ:
удалит все известные суффиксы. Это сделано для того, чтобы суффиксы:
Если вы используете GNU make, лучше использовать правила шаблона вместо правил суффикса поскольку они (суффиксные правила) существуют по причинам совместимости. Также суффиксные правила не могут иметь собственные предпосылки.
Итак, вы должны переписать суффиксное правило формы:
.f.o:
...
как шаблонное правило формы:
%. O:%. F:
...
Обратите внимание, что в правилах суффиксов пререквизитный префикс идет первым, а целевой суффикс - вторым, тогда как, как и в случае с шаблонными правилами, все наоборот (и менее запутанно).
Если вы планируете больше работать с make-файлами, также загляните в книгу. Управление проектами с помощью GNU Make который доступен в Интернете.