2017-05-04 188 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文章是一个有用的资源在这里。

相关问题