将调用的参数传递给Makefile中的另一个函数

时间:2017-05-04 18:29:56

标签: makefile gnu-make

我想在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)时似乎会丢失。

2 个答案:

答案 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文章是一个有用的资源。