使目标依赖于其子目录中的多个文件

时间:2014-11-05 14:24:23

标签: makefile eval wildcard

我想编译几个模块,比方说foobar

$MODULES = foo bar

它们各自位于具有相同名称的单独子目录中(例如source/foo/foo.o),因此我的目标文件是:

$MODULE_OBJ := $(foreach module, $(MODULES), source/$(module)/$(module).o)

现在,我想为两个模块编写一个通用规则,以便它们依赖于其子目录的所有源文件(例如source/foo/*.f90),但只需要像模块一样命名的模块编译它(例如$(FC) -c source/foo/foo.f90是食谱)。我已经读过这通常是使用evalcall来解决的。这对我不起作用;我试图输出调试的先决条件,但没有运气。这是我尝试过的:

define modulerule
$(1): $$(dir $(1))*.f90
    $$(info prereq = $$^)
    $$(FC) -c $$(basename $$@).f90
endef

$(foreach obj, %(MODULE_OBJ), $(eval $(call modulerule, $(obj))))

1 个答案:

答案 0 :(得分:2)

扩展您拥有的内容,定义通用规则的一种方法是

MODULES = foo bar
MODULE_OBJS := $(foreach module, $(MODULES), source/$(module)/$(module).o)

.SECONDEXPANSION:
$(MODULE_OBJS): $$(wildcard $$(dir $$@)*.f90)
    $(FC) -c $(basename $@).f90  -o $@