2014-09-03 93 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,它們可能會同時調用。