2010-09-16 65 views
5

我很努力地編寫Makefile來正確構建我的單元測試。舉個例子,假設該文件結構看起來像這樣C++中單元測試的Makefile

src/foo.cpp 
src/foo.hpp 
src/main.cpp 
tests/test_foo.cpp 
tests/test_all.cpp 

因此,要建立可執行test_all,我需要建立test_foo.o而這又取決於test_foo.cpp而且對SRC/foo中。 O操作。

這種情況下的最佳做法是什麼?父文件夾中有一個Makefile?每個文件夾一個Makefile?如果是這樣,我如何管理跨文件夾的依賴關係?

回答

4

常見的做法是每個文件夾一個Makefile。下面是一個簡單Makefile.am腳本的根文件夾:

#SUBDIRS = src tests 
all: 
    make -C ./src 
    make -C ./tests  
install: 
    make -C ./src install 
uninstall: 
    make -C ./src uninstall 
clean: 
    make -C ./src clean 
test: 
    make -C ./tests test 

相應Makefile.amSRC文件夾將是這樣的:

AM_CPPFLAGS = -I./ 

bin_PROGRAMS = progName 

progName_SOURCES = foo.cpp main.cpp 
LDADD = lib-to-link 

progName_LDADD = ../libs/ 

Makefile文件。 am for 測試看起來類似:

AM_CPPFLAGS = -I../src 

bin_PROGRAMS = tests 

tests_SOURCES = test_foo.cpp test_all.cpp 

使用automake從.am文件生成Makefile.in文件。 配置腳本將使用.in文件生成Makefiles。 (對於小型項目,您希望直接對Makefiles進行手動編碼)。

+0

這似乎沒有考慮src/foo.o中test_all.cpp的依賴性。例如。清潔後會發生什麼?在頂級目錄中進行測試? – 2010-09-16 09:16:07

+0

如果測試是從main.cpp驅動的,則不會有任何依賴性問題。 – 2010-09-16 11:38:40

+0

但main.cpp將是應用程序的可執行文件,而不是驅動測試。執行測試的可執行文件應駐留在測試文件夾中。 – 2010-09-16 12:14:59

5

通常的做法是每個目錄都有一個Makefile。這是我在讀「遞歸考慮Harmfull」之前建議的(http://miller.emu.id.au/pmiller/books/rmch/)。現在我推薦一個Makefile。還要檢查自動生成依賴關係 - 現在你甚至不需要計算出你的測試依賴於什麼。你所需要的只是一些目標。

+0

非常感謝戴夫對此有趣的閱讀。然而,試圖真正實現一個非遞歸的Makefile似乎是非常複雜的,如http://www.xs4all.nl/~evbergen/nonrecursive-make.html所示 - 這對於小的工作似乎太多了 - 涉及我參與的中型項目。 – 2010-09-17 04:48:47

+1

在這個例子中,他們做了很多事情,而不是隻有一個Makefile。我在閱讀那篇文章(+另外2-4小時前閱讀關於make的前兩小時)後,在大約2小時內設置了一個頂級Makefile,閱讀了他們的指示,並且寫出了所有的鈴聲和​​哨聲。 – dave 2010-09-18 01:24:35

+1

我爲整個項目編寫了一個makefile,它是嚴重不那麼複雜,但我的項目只是一個.c和.h文件... – MarcusJ 2016-08-11 21:41:40