1

我使用 make 来执行一系列流程步骤。每一步都取决于前一步的成功。完成一个步骤后,我将带有该步骤名称的文件触摸到一个单独的目录中。

这是一个解释这个概念的例子:

VPATH=steps

step1:
        @echo "do some actions with $@"
        @touch $(VAPTH)/$@

step2: step1
        @echo "do some actions with $@"
        @touch $(VPATH)/$@

step3: step2
        @echo "do some actions with $@"
        @touch $(VPATH)/$@

它基本上可以工作,但是有一个弱点:它检查“。”中的目标。并在 VPATH 中。如果您错误地触摸了工作目录“.”中的 ./step1 make 感到困惑。我想知道是否可以避免在检查目标/先决条件时出现任何歧义,但我想继续使用

make step3

并不是

make steps/step3

欢迎任何其他获得相同目标的 Makefile 示例。在此先感谢您的帮助!

4

1 回答 1

2

makefile 的一个基本规则是,您不能创建与 make 认为的目标不同的目标。Make 将它希望您构建的目标的名称放入$@变量中。您的规则必须创建一个具有该名称的目标,否则 make 将无法正常工作。在您的示例中,您正在创建一个名称与$(VPATH)/$@不同的目标,所以这是$@不对的。

makefile 的另一个规则是不能(正确地)使用 VPATH 来查找派生目标。它只能用于查找源文件。

我建议您将变量名称从 更改VPATH为类似的名称STEPDIR,以避免混淆。然后你可以像这样编写一个makefile(注意这是未经测试的,可能需要调整)。在 GNU make 手册中查找静态模式规则以了解我在注释部分中所做的事情:

STEPDIR := steps
STEPS := step1 step2 step3

# Translate from local to subdirectory
.PHONY: $(STEPS)
$(STEPS): %: $(STEPDIR)/%

$(STEPDIR)/step1:
        @...
        @touch $@

$(STEPDIR)/step2: $(STEPDIR)/step1
        @...
        @touch $@

$(STEPDIR)/step1: $(STEPDIR)/step2
        @...
        @touch $@
于 2013-04-26T11:49:30.143 回答