【发布时间】:2014-01-15 21:23:18
【问题描述】:
我有一个项目,我需要以相同的方式处理许多文件。我的 GNUMakefile 看起来像这样:
$(SOURCES) = file1.a file2.a file3.a ... fileN.a
$(TARGETS) = $(SOURCES:.a=.b)
%.b: %.a
build-tool $?
all: $(TARGETS)
这个makefile 为每个目标执行build-tool,这很慢。所以我希望它只执行一次 build-tool 并列出所有更新的先决条件。
我尝试添加以下规则:
$(TARGETS): $(SOURCES)
它在第一次这样构建时有所帮助:
$ make all
build-tool file1.a file2.a ... fileN.a
但在随后的构建中,build-tool 的执行次数与我拥有的目标一样多:
$ touch file1.a && make all
build-tool file1.a
build-tool file1.a
...
build-tool file1.a
另一方面,如果我将配方更改为build-tool $@,它将在所有情况下执行一次构建工具并满足所有先决条件,这也是不可取的。
是否有某种方法可以对所有目标仅执行一次配方,即在第一次构建时具有所有先决条件,并且仅在后续构建时进行修改?
【问题讨论】: