2014-11-21 87 views
3

我得到了一些文件之間的依賴關係,其中一個是從另一個文件生成的。例如需要bar.txt來生成foo-temp.xml是需要生成最終的文件。在我的Makefile中,這表示如下:如果文件不存在,我該如何避免生成文件失敗?

foo-temp.xml: bar.txt 
    do-magic -o foo-temp.xml bar.txt 

foo.xml: foo-temp.xml 
    do-more-magic -o foo.xml foo-temp.xml 

只要所有文件都存在,一切正常。但有些情況下我手動提供foo-temp.xml而不是從bar.txt生成它;實際上,在這種情況下,甚至不存在bar.txt

如何在我的Makefile中表達這種「不存在」而不會失敗,因爲bar.txt不存在?

+0

是'do-more-magic -o foo-temp.xml foo.xml'在這裏還是原來的錯字?不應該是'do-more-magic -o foo.xml foo-temp.xml'嗎?不是它影響這個問題。 – 2014-11-21 16:38:32

+0

@EtanReisner:哎呀,你是對的,修好了。 – Jens 2014-11-21 16:58:49

回答

0

我不確定這是最好的方法,但它應該工作(假設bar.txt本身永遠不需要通過另一個目標創建)。

foo-temp.xml: $(wildcard bar.txt) 

wildcard函數返回模式匹配的文件列表,並刪除那些不這樣做。這也適用於沒有通配符/通配符的文件名。

或者(和多一點冗長)

foo-temp.xml: $(and $(realpath bar.txt),bar.txt) 

基本相同的想法,但realpath返回「規範絕對名稱」,所以你不能直接使用其結果(除非你想有一個絕對路徑),這樣相反,我們使用and函數短路僅在realpath返回非空值時才生成輸出的事實。

如果bar.txt需要生成自己比這兩種解決方案都不會起作用,因爲它會阻止bar.txt成爲先決條件,除非它已經存在(儘管一旦正常make過程將會正常工作)。

如果是這種情況,那麼你可以嘗試使用make -o foo-temp.xml foo.xml告訴做出foo-temp.xml是無限的老應短路使試圖改造它(並處理它的先決條件),並應讓foo.xml: foo-temp.xml規則工作(假設沒有按不存在或比您手動創建的foo-temp.xml舊)。

+0

兩者的結合起作用。實際上,我使用'$(和..)'函數,因爲它允許我在全局變量上添加依賴項:'$(和$(ROOTFILE),bla.txt)',如果主'$存在ROOTFILE和bla.txt。 – Jens 2014-11-21 17:31:19

+0

@Jens Yup,''和'這樣的條件事情是有用的。一個建議,但是。避免在上下文中出現無關的空格。他們並不總是被剝奪/忽略你期望他們可能。所以我建議'$(和$(ROOTFILE),bla.txt)'而不是'$(和$(ROOTFILE),bla.txt)',儘管我認爲這不重要。 – 2014-11-21 17:36:50

+0

呃,我不知道!謝謝 :) – Jens 2014-11-21 17:39:21

相關問題