2015-08-15 98 views
1

我有文件和目錄的這樣的結構:定義在Makefile中

. 
├── Makefile 
└── packages 
    ├── Makefile 
    └── subdir 
     └── Makefile 

和頂層Makefile看起來是這樣的:

define aa 
    make -C $1 $2 
endef 

packages=$(shell find ./packages -type d) 
p1=$(filter-out . .., $(packages)) 

all: 
    $(foreach f,$(p1),$(call aa,$(f),compile)) 

和Makefile文件都在./packages/和。/packages/subdir /具有「編譯」目標。

我試圖在「軟件包」子目錄中自動調用所有Makefiles,而無需將它們單獨添加到Makefile中。

當我運行make在頂級目錄我得到錯誤:

make -C ./packages compile make -C ./packages/subdir compile 
make[1]: *** packages/subdir: No such file or directory. Stop. 
Makefile:16: recipe for target 'all' failed 
make: *** [all] Error 2 

我想知道化妝的爲什麼都調用(這應該是獨立的調用)被放置在一條線?

當我在這樣的「AA」宏的末尾添加結束行:

define aa 
    make -C $1 $2 

endef 

一切正常。 我的問題是爲什麼沒有這個行結束這個宏不起作用?

回答

0

因爲變量定義在define之後的換行符之後開始,並且在endef之前的換行符之前結束。

引述gnumake的手冊:

The value in an ordinary assignment cannot contain a newline; but the newlines that separate the lines of the value in a define become part of the variable’s value (except for the final newline which precedes the endef and is not considered part of the value).

所以,你的定義是相當於aa = make -C $1 $2以來的foreach不會每個擴展之間添加任何東西,你得到了這個結果。