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

Makefile 使目标依赖其子目录中的多个文件,makefile,eval,wildcard,Makefile,Eval,Wildcard,我想编译几个模块,比如foo和bar $MODULES = foo bar 它们各自位于具有相同名称的单独子目录中(例如source/foo/foo.o),因此我的对象文件是: $MODULE_OBJ := $(foreach module, $(MODULES), source/$(module)/$(module).o) 现在,我想为这两个模块编写一个通用规则,以便它们依赖于其子目录中的所有源文件(例如source/foo/*.f90),但编译它只需要一个与模块名相同的文件(例如$(FC

我想编译几个模块,比如
foo
bar

$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
)。我读过,这通常是通过
eval
call
解决的。这对我不起作用;我试图输出调试的先决条件,但没有成功。以下是我尝试过的:

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

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

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

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

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

为什么不通过在每个模块目录中递归调用make的顶级makefile来简化事情呢?然后在模块目录中可以有一个特定于该模块的makefile。@TimothyBrown Recursive Make是一个非常糟糕的主意,它不起作用,Make不是为此而设计的。阿门。