【发布时间】:2014-11-05 14:24:23
【问题描述】:
我有几个模块要编译,比如说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))))
【问题讨论】:
-
为什么不通过一个顶层makefile来简化事情,然后在每个模块目录中递归调用make?然后在模块目录中你可以有一个特定于该模块的makefile。
-
@TimothyBrown Recursive Make 是一个非常糟糕的主意,它不起作用,Make 不是为此而设计的。阿门。