2013-04-26 102 views
0

我使用make来执行一系列的处理步骤。每一步都取决于前一个的成功。一旦完成了一个步骤,我就会将具有该步骤名称的文件触摸到一个单独的目录中。Makefile执行一系列步骤

下面是一个例子来解释这个概念:

VPATH=steps 

step1: 
     @echo "do some actions with [email protected]" 
     @touch $(VAPTH)/[email protected] 

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

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

它基本的工作原理,但有一个弱点:它检查无论是在目标“”并在VPATH中。如果在工作目录“。”中错误地触摸./step1。让人感到困惑。我想知道如果我能避免在检查目标/先决条件任何含糊之处,但我想用

make step3 

,而不是

make steps/step3 

任何其他的Makefile例子得到保持欢迎同样的目标。先谢谢您的帮助!

回答

2

makefile的一个基本规则是你不能创建与认为它们应该是不同的目标。将名称放在想要在[email protected]变量中构建的目标名称中。您的规则必须用该名称创建目标,否则将无法正常工作。在你的例子中,你正在创建一个名称为$(VPATH)/[email protected]的目标,它与[email protected]不一样,所以这是不对的。

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 [email protected] 

$(STEPDIR)/step2: $(STEPDIR)/step1 
     @... 
     @touch [email protected] 

$(STEPDIR)/step1: $(STEPDIR)/step2 
     @... 
     @touch [email protected] 
+0

谢谢,这正是我一直在寻找的。 – user1222217 2013-04-26 12:05:15