我想编译几个模块,比方说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))))
答案 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 $@