gpt4 book ai didi

makefile - 一次为多个目标执行配方

转载 作者:行者123 更新时间:2023-12-01 01:03:12 25 4
gpt4 key购买 nike

我有一个项目,我需要以相同的方式处理许多文件。我的 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 $@在所有情况下,它都会在所有先决条件下执行一次 build-tool,这也是不可取的。
是否有某种方法可以为所有目标只执行一次配方,即在第一次构建时使用所有先决条件,并且只在后续构建中进行修改?

最佳答案

您不能为此使用模式规则。这就是为什么您会看到所有内容都多次构建。您必须使用 make 可以用来确定自上次构建以来哪些文件发生了更改的“哨兵”文件。

例如,这样的事情会起作用:

$(SOURCES) = file1.a file2.a file3.a ... fileN.a
$(TARGETS) = $(SOURCES:.a=.b)

.PHONY: all
all: .ran-build-tool

.ran-build-tool: $(SOURCES)
build-tool $?
@touch $@

ETA:如果您需要另一个级别,您可以执行以下操作:
$(SOURCES) = file1.a file2.a file3.a ... fileN.a
$(TARGETS) = $(SOURCES:.a=.b)

.PHONY: all
all: .ran-build-tool2

.ran-build-tool2: $(TARGETS) | .ran-build-tool
build-tool2 $?
@touch $@

.ran-build-tool: $(SOURCES)
build-tool $?
@touch $@

关于makefile - 一次为多个目标执行配方,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21148514/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com