我使用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示例来获得相同的目标。在此先感谢您的帮助!
答案 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 $@