2015-02-10 154 views
3

具有如下指定的規則是什麼意思?Makefile規則「foo:bar:baz」

foo: bar : baz 

我明白foo爲目標,barbaz是先決條件,但爲什麼有barbaz之間的另一個冒號 - 那是什麼結腸癌的含義是什麼?

+0

它真的說':'那裏,而不是'|'?如果是這樣,哪些方言是這樣的? GNU使它拒絕它。 – hvd 2015-02-10 11:42:20

+0

@hvd GNU Make 3.82 專爲x86_64-redhat-linux-gnu專門設計 – name 2015-02-10 11:44:26

+0

呵呵。我試着用「GNU Make 4.0爲x86_64-pc-linux-gnu編譯」,並且我得到了「Makefile:1:*** target pattern does not'%'。Stop。」 – hvd 2015-02-10 11:48:12

回答

4

您正在考慮的功能是static pattern rule,您給出的語法:foo : bar : baz是非法的; bar部分必須模式(也就是說,它必須包含一個%字符)。

Tripleee給出一個合理的解釋,除了聲明當我們建立foobar取決於baz是有點混亂。靜態模式規則意味着對於目標中的每個單詞,創建一個新的明確規則,其中目標是將模式模式應用於具有先決條件先決條件的該單詞的結果。

1

一般語法

targets: pattern: prerequisites 

所以這 - 非常簡單化了 - 比如你的說,基本上,當我們建立foobar取決於baz。但是,第二個參數需要是模式規則,所以您的示例實際上是一個語法錯誤。

更有用的和正確的例子是沿

$(OBJS): %.o: ick.h 

它說,如果你正在構建的OBJS之一,其.o文件取決於ick.h線。

+1

_當我們建立'foo'時,'bar'取決於'baz'_是不正確的。要認識到的重要一點是,這個問題是完全錯誤的:正如hvd所說,使用'foo:bar:baz'是一個語法錯誤。 'bar'單詞_必須是_pattern_,並且模式_必須與'foo'部分中的每個單詞匹配。這意味着什麼,「對於'foo'部分中的每個單詞,創建一個新規則,其中目標是對每個單詞應用模式」bar「的結果,而前提條件是」baz「。 – MadScientist 2015-02-10 13:26:06

+0

@MadScientist請將您的評論移至新的答案。 – name 2015-02-10 14:41:08