我在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
是什么意思?
注意:这两个命令来自脚本的不同部分。
答案 0 :(得分:27)
您问题的第一行只是标准的Makefile规则。
vpath.o: make.h config.h getopt.h gettext.h dep.h
.o
文件是目标文件;它是源文件和最终编译二进制文件之间的中间产品。它包含已编译的代码,但尚未链接到一个完整的库或二进制文件中。此规则只是说vpath.o
取决于make.h
,config.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:
会删除所有已知的后缀。这样做是为了:
如果您使用的是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