2011-05-19 43 views
0

我有一個基於生成文件的構建系統,它構建一些庫和依賴關係,並將它們放入壓縮歸檔中。 我有一個問題,在依賴鏈中刪除中間依賴只會導致make構建整個部分。刪除製造中的中間依賴關係

我的鏈看起來是這樣的:

.PHONY: all 
all: targets 

objs/myprog: src/myprog.c 
    gcc -c $< -o [email protected] 

bin/myprog: objs/myprog 
    cp $< [email protected] 

archive.tar.gz: bin/myprog 
    cd bin && tar -czf ../archive.tar.gz * 

.PHONY: targets 
targets: archive.tar.gz bin/myprog objs/myprog 

如果我刪除斌/ MYPROG然後運行make然後objs/myprog被編譯,但它是複製到bin/myprog,歸檔重建。如果我再次運行make,則執行兩個缺失的步驟。

任何想法,我可能做錯了,或者這是打算的行爲或缺點?

+1

'targets:archive.tar.gz bin/myprog objs/myprog'有點多餘。它也可以是'targets:archive.tar.gz' – 2011-05-19 15:12:20

回答

0

你希望你的最終輸出的規則是Makefile中的第一(即默認)規則 - 這個工程:

archive.tar.gz: bin/myprog.o 
    cd bin && tar -czf ../archive.tar.gz * 

objs/myprog.o: src/myprog.c 
    gcc -c $< -o [email protected] 

bin/myprog.o: objs/myprog.o 
    cp $< [email protected] 
+0

對不起,我寫了我的例子時有點太快了。我確實有一個「全部」的規則,這確實是第一個。我已更新我的問題以反映這一點。 – 2011-05-19 14:48:16

+0

@kigurai您更新的makefile對我來說工作正常。 – 2011-05-19 14:53:39

+0

這既是好消息,也是壞消息。好,因爲它表明make實際上是理智的(在這種情況下),但是不好,因爲那麼問題就在我的makefile中。 :/ – 2011-05-19 14:56:04

-1

爲我工作。

只要確保你的第一行是:

# don't forget an empty line at the beginning of the Makefile. 

all: archive.tar.gz 
+0

我有一個初始的「全部」規則,請參閱更新的問題。爲什麼我需要首先有一個空行? – 2011-05-19 14:51:35

+0

IIRC,Makefile的結構說第一行是用於變量賦值的,並且在第一個規則之前需要一個空行作爲分隔符。 – 2011-05-19 15:10:18

+1

*什麼?*你有這方面的參考?什麼版本的Make?我只是在第一行中嘗試了一些實驗(GNUMake 3.81),規則和變量似乎正常工作。 – Beta 2011-05-19 16:08:43

0

如果我刪除斌/ MYPROG然後運行make然後OBJ文件/ MYPROG被編譯,但不會複製到斌/ MYPROG和存檔不會重建。如果我再運行make,那麼執行兩個缺失的步驟。

我似乎記得看到類似這樣的行爲時,一些在鏈中的目標是目錄。目錄的修改時間會隨着更改中的任何內容而更新,因此目錄通常比您預期的更新(具有合理性)。

它通常是最好的改寫這樣的規則,使目標和先決條件是代表相同的東西,適當的文件,即使你必須引入stampfile剛剛得到touched信號,它代表的目錄已經長大-至今。

你說你問題中的makefile是你真實的makefile。真正的人是否有任何目錄作爲這個鏈中的目標?