重新编译未更新的文件

时间:2013-04-27 20:01:13

标签: makefile

我正在尝试使用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。即使没有文件被修改过。

怎么了?

1 个答案:

答案 0 :(得分:2)

make只是查看all是否存在。因为它没有,它会尝试创建它(但是甚至没有注意到你的命令没有创建文件!)

假设pdflatex确实在某处创建了文件,请使用文件名作为目标名称。然后,只有当它比依赖项更旧时才会重新创建它。

总结一下,Makefile声明目标文件的映射,它们的依赖关系,以及如何从依赖项创建目标文件。当目标相对于其依赖项缺失或过时时,Make会运行重新创建它的命令。

(我首次尝试阐明这个答案时提到了.PHONY:目标,但是在这种情况下这并不是很有用;如果你宣布.PHONY: all它会运行配方,即使名为{的文件也是如此{1}}存在,所以这与你正在寻找的相反。)