2014-09-03 94 views
1

有没有办法多次执行配方? 在它下面的SSCCE看来,配方只执行一次:使配方执行两次

$ cat Makefile 
.PHONY: a b 
a: b b 
b: 
    echo "beta" 
$ make 
echo "beta" 
beta 
+5

配方用于构建依赖关系。一个只需要建立一次依赖关系(因此不重视副本)。如果你想做两件事,在你的食谱里放一个循环*。 – 2014-09-03 22:37:45

+0

@OliCharlesworth这是一个SSCCE,有理由希望同一个配方被执行两次,不一定是连续执行。例如:'test:drop-db create-db load-data dump -data drop -db create-db restore-data' – 2014-09-03 22:49:23

+1

@MarcusJuniusBrutus:你的例子是无稽之谈 - 依赖关系是依赖关系,它们没有顺序。如果你想让食谱按顺序执行,你可以在你的动作中按顺序执行它们。 – 2014-09-03 22:56:21

回答

3

一旦你已经阅读并理解了意见;-),有两种方法我能想到的运行配方两次:

@OliCharlesworth提到的第一个 - 用一个循环你的食谱中:

.PHONY: a b 
a: b b 
b: 
    for i in 1 2; do \ 
     echo "beta" ;\ 
    done 

注意你需要在配方中嵌入多行shell表达式时相当谨慎。除非用反斜杠结束行,否则make会将每行视为单独的shell调用,这对于循环不起作用。

另一种方式是复制你的b目标,使两个副本具有相同的配方:

.PHONY: a b1 b2 
a: b1 b2 
b1 b2: 
    echo "beta" 

这个定义具有相同配方的b1b2目标。然后a取决于b1b2,所以配方被调用两次。请注意,无法保证调用b1b2的顺序 - 如果您的-j因子大于1,它们可能会同时调用。