Makefile 使配方执行两次

Makefile 使配方执行两次,makefile,Makefile,是否有一种方法可以多次执行配方? 在下面的SSCCE中,配方似乎只执行一次: $ cat Makefile .PHONY: a b a: b b b: echo "beta" $ make echo "beta" beta 阅读并理解评论后;-),有两种方法可以让配方运行两次: @OliCharlesworth提到了第一个-在食谱中使用循环: .PHONY: a b a: b b b: for i in 1 2; do \ echo "beta" ;\

是否有一种方法可以多次执行配方? 在下面的SSCCE中,配方似乎只执行一次:

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

阅读并理解评论后;-),有两种方法可以让配方运行两次:

@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"

这定义了具有相同配方的
b1
b2
目标。然后
a
同时依赖于
b1
b2
,因此该配方会被调用两次。请注意,不能保证调用
b1
b2
的顺序,如果-j因子大于1,则它们很可能会同时被调用。

配方用于构建依赖关系。只需要构建一次依赖项(因此Make不关注重复项)。如果您想做两次某件事,请在您的配方中加入一个循环。@OliCharlesworth这是一个SSCCE,有充分的理由希望同一配方执行两次,而不一定是连续执行。例如:
test:drop db create db load data dump data drop db create db restore data
@MarcusJuniusBrutus:你的例子是胡说八道——依赖关系就是依赖关系,它们之间没有顺序。如果你想让配方按顺序执行,你可以在动作中按顺序执行。配方不是函数,它们只是对应于依赖关系图中的节点。它们不能用于程序行为。接受这一事实是有效使用Make(和类似构建系统)的第一步;)先决条件有一个顺序(但它不是明确的,不应该依赖)。也有理由希望在prereq列表中多次列出相同的先决条件(但多次运行该prereq不在其中)。