2012-07-01 91 views
0

我有一個庫的列表,其中每個庫有2個文件(.so.dll)。 我應該如何創建一個make規則,如果兩個文件都丟失或者其中一個文件丟失,只會執行一次配方。執行一個制定多個規則的目標

LIBS = alib blib 
LIBS_SO = $(patsubst %, %.so, $(LIBS)) 
LIBS_DLL = $(patsubst %, %.dll, $(LIBS)) 

如果我讓這個目標

$(LIBS_SO) $(LIBS_DSS): 
    cp ..... 

它只複製一次所有的準備。

如果我有這樣的:

all : $(LIBS_SO) $(LIBS_DSS): 
$(LIBS_SO) $(LIBS_DSS): 
    cp ..... 

我複製的任何丟失的文件的所有情況。 我想複製alib目錄,如果alib.dll/alib.so兩個或一個文件丟失; 與blib相同。

+0

這真的不清楚。你在拷貝什麼?問題是什麼? –

回答

0

你還沒有給我們太多的信息,但我認爲這會做你想要什麼:

all : $(LIBS_SO) $(LIBS_DLL): 
%.so %.dll: 
    cp $* directory ... 

如果同時alib.soalib.dll缺失,使將只執行一次的這個規則。

編輯:感謝喬納森·勒弗勒捕捉錯字。

0

您有一致的錯字LIBS_DSS,您(可能)的意思是LIBS_DLL

你的第一個「規則」是的縮寫:

alib.so: 
    cp ... 
blib.so: 
    cp ... 
alib.dll: 
    cp ... 
blib.dll: 
    cp ... 

所以,當記者問到建,make構建文件,該文件是在alib.so的第一個目標。這就是爲什麼它只做一次。

第二個版本,當固定刪除多餘的冒號和錯字,應該工作:

all: $(LIBS_SO) $(LIBS_DLL) 

$(LIBS_SO) $(LIBS_DLL): 
    cp ..... 

默認規則是all;使all,make確保存在並且是最新的每個文件alib.so,blib.so,alib.dllblib.dll。它應該爲每個丟失的目標執行一次命令。

如果您運行並行make,您可能會遇到麻煩; make -j4或類似的東西。它可能幾乎同時啓動四個複製命令來製作每個目標。但是在一個非平行的版本中,它將確保alib.so是最新的(如果不是,將會複製)。如果該副本也複製alib.dll,則在確保alib.dll爲最新時,它不會重新複製。