2017-05-04 150 views
1

我想要一種方法將參數調用到Makefile規則中的call調用中,並將其傳遞給內置函數,在本例中爲wildcard將調用參數傳遞給Makefile中的另一個函數

這似乎並不工作:

MODULE_OBJS = $(patsubst %.cc, %.o, $(wildcard $(1)/*.cc)) 

lib%.a: $(call MODULE_OBJS, %) 
    @echo [email protected] : $^ 

在這種情況下,我希望make libfoo.a打印對應於下富/發現的.cc文件.o文件的列表,但印什麼。該參數到達那裏,因爲如果我將$(1)附加到MODULE_OBJS的末尾,則將打印%的值,但在傳入wildcard時似乎丟失了該值。

回答

3

你需要明白,make會在之前執行$(call MODULE_OBJS, %)它甚至已經開始構建依賴樹,你不能用模式規則來實現這個。你可以使用eval hackery,但是有一種情況可能會使得在製作過程中變得太聰明。

像下面是很容易的維護

MODULE_OBJS = $(patsubst %.cc, %.o, $(wildcard $(1)/*.cc)) 

libfoo.a: $(call MODULE_OBJS, foo) 

lib%.a: 
    @echo [email protected]: $^ 

但產生庫的聰明的方式和二進制依賴摔跤後,我更喜歡簡單地把它們列出明確。

+0

是的。非常好。生成依賴關係幾乎不是一個好主意,Make是少數情況下使用整個語言的不好的建議之一。 Make是一種自動化無聊/令人困惑的事物的語言;它不是聰明的語言。 –

0

我得到了我想要與EVAL規則的一些黑客:

EXCLUDE_MODULES = obj 
MODULES = $(filter-out $(EXCLUDE_MODULES), $(patsubst %/, %, $(wildcard */))) 

define MODULE_RULE 
lib$(MODULE).a: $(patsubst %.cc, obj/%.o, $(wildcard $(MODULE)/*.cc)) 
    @echo [email protected] : $^ 
endef 

$(foreach MODULE, $(MODULES), $(eval $(MODULE_RULE))) 

這使您可以撥打make libfoo.a,並得到了所有的.o的對應與.CC在該子目錄的列表。

對於那些好奇的人,我上傳了一個完整的例子here

Metaprogramming Make文章是一個有用的資源在這裏。

相關問題