2016-03-12 43 views
1

我想知道怎樣的前提條件添加到規則與GNU創建一個空的配方。這是我爲解釋問題所做的一個簡短例子。我有一個Test.c文件,它依賴於某個文件header1.h,它包含另一個文件header2.h。這是make文件:先決條件,使規則與空方

Test : Test.c header1.h 
    gcc -o Test Test.c 

header1.h : header2.h 

最後一行不爲空它包含一個製表符。現在假設我運行make並創建了Test。之後我改變了header2.h。如果我再次運行make,則表示Test已經更新。因爲header2.h比header1.h新,所以我期望make重做Test。

如果我添加一個簡單的食譜到最​​後一條規則是這樣

Test : Test.c header1.h 
    gcc -o Test Test.c 

header1.h : header2.h 
    echo foo 

化妝行爲如我所料。我還嘗試在先決條件列表中的header2.h後添加分號,但這沒有幫助。

回答

1

你告訴做出Test取決於Test.cheader1.h,所以它不會運行配方除非是時間戳這兩個文件是不是一個新的Test

您可以添加touch [email protected]header1.h配方,但邏輯上它並沒有真正依賴於header2.h內容,Test呢,所以你應該添加header2.hTest依賴。但是,理想情況下,您應避免手動指定所有這些並使用GCC的依賴關係生成標誌,您還可以利用make的內置規則,這樣一個源文件的絕對最小示例應該是

CFLAGS := -MMD 
Test: 
-include *.d 
+0

謝謝,但問題更多的是關於爲什麼如果一個虛擬的規則添加類似觸摸$ @化妝的行爲不同。看起來沒有規則,在處理規則後,header1的時間戳不會被改變。 – Max1

+0

@最大值1'觸摸$ @'會的工作,因爲它更新header1.h'的'時間戳,您的示例用'回聲foo',另一方面應該不會像你上面寫的,然後再次嘗試運行你的makefile確保只有'header2.h'比'Test'更新,你會發現'Test'實際上沒有被重新編譯。 – user657267

+0

感謝'touch $ @'實際上正是我所期待的。 – Max1

0

其他已提供相應的解決方案:編譯器生成依賴文件。

爲什麼增加一個「平凡的食譜」這不回答這個問題,部分(echo foo)改變任何東西。這可能與以下make bug有關。

如OP已經發現,該錯誤可以通過增加一個微不足道的配方(例如@true)規避。這會導致make重新評估目標的「時間戳」,這就是爲什麼預期會遵守依賴關係的原因。