Makefile执行一系列步骤

时间:2013-04-26 09:33:53

标签: makefile

我使用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 step3

而不是

make steps/step3

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

1 个答案:

答案 0 :(得分:2)

makefile的一个基本规则是你不能创建与思考它们的目标不同的目标。 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 $@