2011-02-17 116 views
23

差異我看了這個問題,我很驚訝,它不工作:GNU使多變量聲明

Why GNU Make canned recipe doesn't work?

所以我沒有嘗試過自己,得到了相同的結果。下面是一個例子生成文件:

define foo 
bar 
baz 
endef 

define bar = 
foo 
baz 
endef 

$(info foo: $(foo)) 
$(info bar: $(bar)) 

all: 

下面是從運行它的輸出:

$ make 
foo: bar 
baz 
bar: 
make: Nothing to be done for `all'. 

這裏發生了什麼? GNU make manual似乎表明這兩個變量聲明應該是相同的 - 我在這裏錯過了什麼?

編輯:

從手動,我指的是一些語錄:

3.7 How make Reads a Makefile

define immediate 
    deferred 
endef 

define immediate = 
    deferred 
endef 

5.8 Defining Canned Recipes

^h ERE是定義一個罐裝配方的例子:

define run-yacc = 
yacc $(firstword $^) 
mv y.tab.c [email protected] 
endef 

6.8 Defining Multi-Line Variables

...如果你願意的話,可以省略變量賦值運算符。如果省略,使假定它是「=」,並創建一個遞歸擴展變量...

正如你所看到的,罐裝配方部分明確使用=情況。我正在使用GNU Make 3.81。

+1

恰好碰到了這個確切同樣的問題,容易` - 升級; apt-get install make`告訴我,v3.81是最新的,所以我變得越來越富裕起來,非常感謝...非常感謝! – 2011-08-12 11:08:43

回答

18

這可能是你的make版本。我測試使用make 3.81 Cygwin中我的機器上生成文件,並得到:

$ make 
foo: bar 
baz 
bar: 
make: Nothing to be done for `all'. 

我測試使用使3.82(原生Windows版本)相同的生成文件,並得到:

C:\>C:\make\make.exe 
foo: bar 
baz 
bar: foo 
baz 
make: Nothing to be done for `all'. 

相信網上make手冊適用於v3.82。

+0

那麼,這是一個簡單的解決方案 - 感謝指出我的錯誤! – 2011-02-18 06:56:14

+0

接受這個答案,因爲它在這裏第一 - 抱歉蒂姆! – 2011-02-18 06:57:16

27

從更新日誌中的3.82:

* read.c (do_define): Modify to allow assignment tokens (=, :=, etc.) 
after a define, to create variables with those flavors. 

好像使用「=」是不是在此之前,在支持定義聲明