我想在Makefile规则中将参数转换为Tuple2(Row1, String)
调用并将其传递给内置函数,在本例中为null
。
这似乎不起作用:
call
在这种情况下,我希望wildcard
打印与foo /下找到的.cc文件对应的.o文件列表,但不打印任何内容。该参数即将到达,因为如果我将MODULE_OBJS = $(patsubst %.cc, %.o, $(wildcard $(1)/*.cc))
lib%.a: $(call MODULE_OBJS, %)
@echo $@ : $^
附加到MODULE_OBJS的末尾,则make libfoo.a
的值会被打印,但在传递到$(1)
时似乎会丢失。
答案 0 :(得分:3)
你需要明白make会在开始构建依赖树之前执行$(call MODULE_OBJS, %)
,你无法用模式规则来实现。你可以使用eval
hackery但是有一个案例可以反对尝试使用make太聪明。
以下内容很容易维护
MODULE_OBJS = $(patsubst %.cc, %.o, $(wildcard $(1)/*.cc))
libfoo.a: $(call MODULE_OBJS, foo)
lib%.a:
@echo $@: $^
但是在尝试生成库和二进制依赖项的巧妙方法之后,我更喜欢简单地列出它们。
答案 1 :(得分:0)
我得到了我想要的一些黑客评估规则:
EXCLUDE_MODULES = obj
MODULES = $(filter-out $(EXCLUDE_MODULES), $(patsubst %/, %, $(wildcard */)))
define MODULE_RULE
lib$(MODULE).a: $(patsubst %.cc, obj/%.o, $(wildcard $(MODULE)/*.cc))
@echo $@ : $^
endef
$(foreach MODULE, $(MODULES), $(eval $(MODULE_RULE)))
这允许您调用make libfoo.a
并获取与该子目录中的.cc相对应的所有.o的列表。
对于那些好奇的人,我上传了一个完整的例子here。
这里的Metaprogramming Make文章是一个有用的资源。