2012-08-09 48 views
0

我有一部分GNU make makefile(gcc v4.1.2)不能按我的預期工作。我有次diretiories四個庫,我想如果make在基地跑/遞歸地建立建目錄模式規則沒有按預期工作

/prj 
|--/build 
| |--makefile 
| |--/Tables.lib 
| | |--makefile 
| |--/General.lib 
| | |--makefile (etc..) 
|--/lib 
|--/src 

用於/ PRJ /編譯/ Makefile中簡要代碼:

LIB_DIR = /prj/lib 

LIBRARY := libcomposition_adjustment.a libtables.a libgeneral.a libbiblio.a 
DIRS := Tables.lib Composition_adjustment.lib General.lib Biblio.lib 

all: $(LIBRARY) 
#all: $(LIB_DIR)/libcomposition_adjustment.a # this line works 

%.a : $(LIB_DIR)/%.a 

$(LIB_DIR)/libtables.a: 
    cd Tables.lib; $(MAKE) 

$(LIB_DIR)/libcomposition_adjustment.a: 
    cd Composition_adjustment.lib; $(MAKE) 

$(LIB_DIR)/libgeneral.a: 
    cd General.lib; $(MAKE) 

$(LIB_DIR)/libbiblio.a: libgeneral.a 
    cd Biblio.lib; $(MAKE) 

它說「沒有規則來制定目標'libcomposition_adjustment.a',這是'all'所需要的。stop」。但我認爲線%.a : $(LIB_DIR)/%.a會處理。我正在使這個模式規則不正確?

如果我嘗試第二個all:行被註釋掉,它按預期工作。

回答

2

的問題是在這裏:

%.a : $(LIB_DIR)/%.a 

這是一個沒有命令,使不解釋作爲一個獨立的規則在所有的模式規則。有多種方法可以解決這個問題。最簡單的可能是給它一個什麼都不做的命令:

%.a : $(LIB_DIR)/%.a 
    @: 

,但更好的方法是沒有疑問的規則,總共要做到:

LIB_DIR = /prj/lib 

LIBRARY := libcomposition_adjustment.a libtables.a libgeneral.a libbiblio.a 
LIBRARY := $(addprefix $(LIB_DIR)/,$(LIBRARY)) 

all: $(LIBRARY) 

$(LIB_DIR)/libtables.a: 
    cd Tables.lib; $(MAKE) 

$(LIB_DIR)/libcomposition_adjustment.a: 
    cd Composition_adjustment.lib; $(MAKE) 

$(LIB_DIR)/libgeneral.a: 
    cd General.lib; $(MAKE) 

$(LIB_DIR)/libbiblio.a: $(LIB_DIR)/libgeneral.a 
    cd Biblio.lib; $(MAKE) 
+0

謝謝,這是有道理的,它必須做的「一些東西「,即使它沒有做任何事情。 – Moop 2012-08-09 21:33:24