【发布时间】:2013-10-22 21:46:08
【问题描述】:
我有这个Makefile(只是一个例子,没有实际意义)
all: foobar.intermediate foobar.a
define RECIPE_THROUGH_INTERMEDIATE
cp $< $@.intermediate
mv $@.intermediate $@
endef
define RECIPE_DIRECT
cp $< $@
endef
%.a: %.c
$(RECIPE_THROUGH_INTERMEDIATE)
%.a: %.intermediate
$(RECIPE_DIRECT)
%.intermediate: %.c
$(RECIPE_DIRECT)
我希望 Make 尽可能“快”并像这样更新:
>make foobar.a
从foobar.c 到foobar.a 执行配方到中间层
但是
>make
直接从foobar.c 执行配方到foobar.intermediate
直接从foobar.intermediate 执行配方到foobar.a
换句话说,这是一种常见的情况,从源 (foobar.c) 生成目标 (foobar.a) 需要在内部通过中间体,这比从源到中间体需要更多时间,或者从中间到目标,单独,但是当您明确(不是内部)通过中间时,它花费的时间比这两者加起来要少。
当然,Make 不知道配方需要多长时间。
所以我想提示 Make what the correct path to take:
- 当我只想要目标时,将直接配方从源带到目标
- 当我想要目标和中间体时,先制作中间体,然后再从中获得目标。
我有 GNU Make 至少 3.82,但我无法控制模式词干的长度 - 这必须适用于任何长度的词干,包括,就像在这个例子中一样,所有词干的长度都相同。
有没有办法改变上面的 Makefile 来实现所需的行为?
【问题讨论】:
-
我可以看到人们不理解这个问题。所以我说得更清楚了,希望如此。
-
听起来/看起来您的 makefile 正在执行您所描述的操作——如果您执行
make foobar.a,它会执行一步操作,如果您执行make all(默认目标)它同时产生foobar.intermediate和foobar.a(由此而来)。如果您希望make all不构建foobar.intermediate,请将其从all的先决条件中删除... -
@ChrisDodd 不,它没有,这就是重点,如上所述,
make all效率低下。我之所以具备all的先决条件,就是为了准确的说明问题。 -
有趣的问题。如果在调用
make之前存在foobar.intermediate(并且是最新的),您希望make的行为如何?