2011-02-17 59 views
17

我期待看到由下面的makefile創建的文件foo1foo3。但是隻創建了一個文件foo3。對我來說,似乎罐頭食譜make-foo簡單地被make忽略。目標foo1foo2(空配方)的調試結果是相同的。爲什麼GNU Make罐裝食譜不起作用?

# why canned recipe doesn't work ? 
# http://www.gnu.org/software/make/manual/make.html#Canned-Recipes 
define make-foo = 
echo making [email protected] 
touch [email protected] 
endef 

.PHONY: all 
all: foo1 foo2 foo3 

# foo1 is not created, but why ? 
.PHONY: foo1 
foo1: 
    $(make-foo) 

# debug output similar to foo1 
.PHONY: foo2 
foo2: 

# this works 
.PHONY: foo3 
foo3: 
    echo making [email protected] 
    touch [email protected] 

運行make:

[email protected]:/dev/shm$ make -dRr 
GNU Make 3.81 
Copyright (C) 2006 Free Software Foundation, Inc. 
This is free software; see the source for copying conditions. 
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A 
PARTICULAR PURPOSE. 

This program built for i686-pc-linux-gnu 
Reading makefiles... 
Reading makefile `makefile'... 
Updating makefiles.... 
Considering target file `makefile'. 
    Looking for an implicit rule for `makefile'. 
    No implicit rule found for `makefile'. 
    Finished prerequisites of target file `makefile'. 
No need to remake target `makefile'. 
Updating goal targets.... 
Considering target file `all'. 
File `all' does not exist. 
    Considering target file `foo1'. 
    File `foo1' does not exist. 
    Finished prerequisites of target file `foo1'. 
    Must remake target `foo1'. 
    Successfully remade target file `foo1'. 
    Considering target file `foo2'. 
    File `foo2' does not exist. 
    Finished prerequisites of target file `foo2'. 
    Must remake target `foo2'. 
    Successfully remade target file `foo2'. 
    Considering target file `foo3'. 
    File `foo3' does not exist. 
    Finished prerequisites of target file `foo3'. 
    Must remake target `foo3'. 
echo making foo3 
Putting child 0x0914c5f0 (foo3) PID 3132 on the chain. 
Live child 0x0914c5f0 (foo3) PID 3132 
making foo3 
Reaping winning child 0x0914c5f0 PID 3132 
touch foo3 
Live child 0x0914c5f0 (foo3) PID 3133 
Reaping winning child 0x0914c5f0 PID 3133 
Removing child 0x0914c5f0 PID 3133 from chain. 
    Successfully remade target file `foo3'. 
Finished prerequisites of target file `all'. 
Must remake target `all'. 
Successfully remade target file `all'. 

缺少foo1

[email protected]:/dev/shm$ ll foo* 
-rw-r--r-- 1 xxxx xxxx 0 2011-02-17 20:04 foo3 

回答

28

我想你不希望=define行的末尾。這個Makefile在這裏工作對我來說:

define make-foo 
echo making [email protected] 
touch [email protected] 
endef 

.PHONY: foo1 
foo1: 
    $(make-foo) 

例子:

$ make 
echo making foo1 
making foo1 
touch foo1 
$ ls 
Makefile foo1 

GNU make manual似乎表明=應該只是罰款,但像你這樣,我得到不同的行爲,如果我有它。

編輯:我剛纔問:

GNU make differences in multiline variable declarations

爲了得到這裏發生了什麼澄清...

+2

我可以證實,下降'='解決了這個問題對我來說也是。這是我自己可能從未發現的問題。謝謝 !我也非常感興趣地跟蹤延續問題。 – user272735 2011-02-17 19:26:09