我正在尝试使用GNU make。假设我有3个具有以下结构的C文件:
hellomake.c
|
|---------------------
| |
V V
hellofunc.c hellomake.h
生成文件:
hellomake: hellomake.c hellofunc.c
gcc -o hellomake hellomake.c hellofunc.c -I.
当我输入第一次制作时,它会创建一个程序hellomake
。当我第二次运行时,会打印出来:
make: `hellomake' is up to date.
一切正常。
我尝试使用make来编译LaTeX文件。假设我有2个TeX文件:
1.tex
|
V
1_data.tex
1_data内部包含在1.tex中。
生成文件:
COMMAND = pdflatex
all: 1.tex 1_data.tex
$(COMMAND) 1.tex
但是每次输入make
时它都会重新编译1.tex。即使没有文件被修改过。
怎么了?
答案 0 :(得分:2)
make
只是查看all
是否存在。因为它没有,它会尝试创建它(但是甚至没有注意到你的命令没有创建文件!)
假设pdflatex
确实在某处创建了文件,请使用文件名作为目标名称。然后,只有当它比依赖项更旧时才会重新创建它。
总结一下,Makefile声明目标文件的映射,它们的依赖关系,以及如何从依赖项创建目标文件。当目标相对于其依赖项缺失或过时时,Make会运行重新创建它的命令。
(我首次尝试阐明这个答案时提到了.PHONY:
目标,但是在这种情况下这并不是很有用;如果你宣布.PHONY: all
它会运行配方,即使名为{的文件也是如此{1}}存在,所以这与你正在寻找的相反。)