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不是为此而设计的。阿门。