2013-01-04 57 views
0

我已經開始爲一個庫編寫幾個簡單的測試。我目前正試圖編寫一個名爲btests的make目標,它應該編譯所有目標。不做任何修改就重建

該測試駐留在tests/目錄中,其形式爲簡單的.cpp文件,其中#include庫。

makefile的任務很簡單:將每個tests/name.cpp編譯成與庫鏈接的可執行文件tests/name

它工作正常,除了一件事:每次我運行make btests,測試重新編譯。但是,只有在已更改或庫本身已更改時才應重新編譯。

這是相關代碼:

CC=g++ 
CFLAGS=-Wall 

SRCPATH=source 
OBJPATH=object 
TESTPATH=tests 

OBJ=$(OBJPATH)/nameb.o $(OBJPATH)/hebbann.o 
INF=$(SRCPATH)/nameb.hpp $(SRCPATH)/hebbann.hpp 
TESTS=$(TESTPATH)/test_api $(TESTPATH)/test_speed 


all : libname.a 

libname.a : $(OBJ) 
    ar rvs libname.a $(OBJ) 

$(OBJ) : $(OBJPATH)/%.o : $(SRCPATH)/%.cpp $(SRCPATH)/%.hpp 
    $(CC) $(CFLAGS) -c $< -o [email protected] 

btests : $(TESTS) 

$(TESTS) : % : %.cpp all 
    $(CC) $(CFLAGS) $< -L. -lname -o [email protected] 

install : all 
    mkdir -p /usr/include/name 
    cp $(INF) /usr/include/name 
    cp libname.a /usr/lib 

pack : all 
    mkdir -p name/ 
    cp $(INF) name/ 
    tar -cvf libname.tar name/ libname.a doc/ source/ 

clean : 
    rm -f $(OBJPATH)/* libname.a libname.tar $(TESTS) 

我如何可以強制讓只有當事情已經改變,重新編譯?

+0

那makefile文件看起來很好 - 真的是你正在使用的一個? –

+1

我無法重現此問題;你確定這是你正在使用的makefile,並且沒有其他的東西可能會混淆各種文件的最後修改時間嗎? –

+0

我修剪掉了一些與我無關的部分,但我想他們不是。我將添加整個makefile。 – corazza

回答

1

您的測試取決於all。由於沒有文件稱爲「全部」,因此得出結論認爲它必須重建,所以依賴它的測試也必須重建。

修復很簡單。爲all規則不執行任何操作,但需要libname.a,所以只是削減了中間商:

$(TESTS) : % : %.cpp libname.a 
    $(CC) $(CFLAGS) $< -L. -lname -o [email protected] 
+0

太好了,謝謝。 – corazza