2013-04-27 99 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