2013-04-27 51 views
0

我正在试验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. 

当我键入做出了1日的时候,它会创建一个程序hellomake。当我运行它的第二次,它打印:

make: `hellomake' is up to date. 

一切工作正常。

我试着用make来编译LaTeX文件。假设我有2个TeX文件:

1.tex 
    | 
    V 
1_data.tex 

1_data内部包含在1.tex中。

的Makefile:

COMMAND = pdflatex 

all: 1.tex 1_data.tex 
    $(COMMAND) 1.tex 

但我每次键入make时间重新编译1.tex。即使没有任何文件被修改。

怎么了?

回答

2

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

假设pdflatex真正创建一个文件的地方,使用文件名作为目标名称。然后只有在比依赖关系更旧时才会重新创建。

为了简要说明,Makefile声明了目标文件及其依赖关系的映射,以及如何从依赖关系创建目标文件。当目标缺失或与其依赖关系过期时,Make运行命令重新创建它。

(我在阐明这个答案的第一次尝试中提到.PHONY:目标顺便说一句,但这不是在这种情况下非常有用,如果你宣布.PHONY: all它会运行,即使一个名为all文件存在的配方,所以这是相反的行为你正在寻找什么。)

+1

我明白了。我用这个:'1.pdf:1.tex 1_data.tex'代替。现在它起作用了。 – user4035 2013-04-27 20:15:34