【问题标题】:Make target depend on multiple files in its subdirectory使目标依赖于其子目录中的多个文件
【发布时间】:2014-11-05 14:24:23
【问题描述】:

我有几个模块要编译,比如说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))))

【问题讨论】:

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

标签: makefile eval wildcard


【解决方案1】:

扩展你所拥有的,定义通用规则的一种方法是

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-25
    • 2012-12-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多