2011-09-13 168 views
40

我有一個makefile,看起來像這樣:百分比符號在makefile中做了什麼?

include $(patsubst %,$(src)/%/Make.tests, $(TEST_SUBDIRS)) 

%-test: 
     Something here 

我明白它是用於在目標規則線。在第一行中做什麼%符號?目標規則行中是否有百分比符號?

當我編寫make sometarget時,makefile中的行不是作爲任何規則的一部分(如該makefile中的第一行)寫入的行嗎?如果是,那麼執行的順序是什麼?

回答

33

正如你可以在the GNU make manual中看到的,百分比作爲通配符。 patsubstfunction的第一個參數形成該模式。將最後一個參數中的每個項目/單詞與此模式進行比較,如果匹配,則將其替換爲第二個參數。如果模式中有通配符(%),則它將匹配任意數量的字符,並且這些字符將被複制到第二個參數中%所在的替換字符串中。

在您的示例中,模式只是通配符符號,所以它會匹配函數的最後一個參數中的任何單詞,並且該單詞將被複制到替換字符串中(第二個參數) 。

一個例子可能會使事情更加清晰。我們假設TEST_SUBDIRS包含兩個名字。

TEST_SUBDIRS := test1 test2 
include $(patsubst %,$(src)/%/Make.tests, $(TEST_SUBDIRS)) 

這就相當於以下內容。

include $(src)/test1/Make.tests $(src)/test2/Make.tests 

甲生成文件由線順序處理線。變量賦值是「內化的」,並且包含語句會導致其他文件的內容逐字地插入該位置,之後該內容將作爲生成文件的一部分進行處理。
從規則中讀取依賴關係圖,並在處理整個文件之後,執行必要的配方以更新請求的目標。