Makefile中的* .o / .Suffixes是什么意思?

时间:2010-01-06 04:18:10

标签: makefile

我在Makefiles上看过这样的命令,我不太明白:

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 个答案:

答案 0 :(得分:27)

您问题的第一行只是标准的Makefile规则。

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

.o文件是目标文件;它是源文件和最终编译二进制文件之间的中间产品。它包含已编译的代码,但尚未链接到一个完整的库或二进制文件中。此规则只是说vpath.o取决于make.hconfig.h等,每次更改时,都应重新编译。构建vpath.o所需的命令应遵循后续行,使用制表符缩进。 (抱歉,如果我重复你已经知道的东西;我不确定你对这第一行的哪一部分感到困惑)。

.SUFFIXES不是指实际的文件后缀;它只是makefile中的一种特殊规则,用于配置“后缀规则”。

后缀规则是.a.b形式的规则,例如您在.f.o规则中看到的规则。它们是告诉make的一种方式,只要你看到一个.f文件(源文件),就可以通过它创建一个.o文件(目标文件)。遵循该规则,其中$<表示源文件,$@表示目标文件。

.SUFFIXES“target”是一种定义后缀规则中可以使用的后缀的方法。在没有先决条件的情况下使用时,它会清除内置的后缀列表;当与先决条件一起使用时,它会将它们添加到可能在后缀规则中使用的已知后缀列表中。

在GNU make中,您可以使用功能更强大且更清晰的%来形成模式规则,例如:

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

相当于后缀规则:

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

有关更多信息,请参阅GNU Make documentation(但也提到了GNU扩展),或Single Unix Specification/POSIX了解常见的可移植语法。

答案 1 :(得分:4)

正如已经提到的那样 .SUFFIXES:
会删除所有已知的后缀。这样做是为了:

  • 默认后缀不会干扰您的特殊后缀。
  • 不同的make程序具有不兼容的后缀列表和隐式规则,      这有时会造成混乱或不当行为      General Conventions for Makefiles

如果您使用的是GNU make,最好使用模式规则而不是后缀规则 因为它们(后缀规则)存在兼容性原因。后缀规则也不能 他们自己的先决条件。

所以你要重写形式的后缀规则:

.f.o:
...

作为形式的模式规则:

%○:%F:。
...

请注意,在后缀规则中,先决条件前缀首先出现,目标后缀出现在第二位,与模式规则相反,它是相反的方式(并且不那么令人困惑)。

如果您打算使用makefile工作更多,请查看本书 Managing Projects with GNU Make 可在线获取。

答案 2 :(得分:3)

Makefile语法很微妙,很快就会生气。我可能会建议您查看documentation for make,特别是关于suffix rules的部分。

答案 3 :(得分:2)

第一条.SUFFIXES行清除了所有关于“内置”后缀的知识;第二个恢复后缀.f(传统的Fortran)和.o(目标文件)。当没有其他任何东西可以使用时,使用.DEFAULT规则。最后一条规则使用.f编译器将.o文件编译为$(FC)文件。 @表示不回显命令 - 并使我烦恼(我更喜欢看到用于编译的命令)。

我在makefile摘录中看不到*.suffixes,所以我不能告诉你它是什么意思。

答案 4 :(得分:0)

你也可以使用后缀规则的链,例如在下面的一个中从gnuplot文件生成tex然后pdf:

.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
相关问题