2013-06-21 94 views
1

如何在構建庫時實現make installcheck目標?也就是說,我有一個check目標,創建一個測試程序,鏈接到創建的庫,由某個腳本調用以檢查庫代碼是否正常工作,並且希望執行相同的檢查,但是鏈接到庫後的庫已經安裝了它的;我怎樣才能實現這個?(GNU make)installcheck一個庫

回答

3

由於我的問題沒有得到答覆,我不能輕鬆地找到任何東西,因爲我的方法至少有效(儘管可能有點難看),我會用通用方法I回答我自己的問題用過的。

如果構建庫的檢查例程涉及將庫鏈接到測試程序並查看該程序是否正常工作,那麼爲了安裝檢查庫,我們只需要做同樣的事情,但將測試程序鏈接到已安裝的庫比當地建立的圖書館。

我們調用庫阿爾法(所以我們要創建libalpha.so和/或libalpha.a)。假設字母的源代碼是在SRC目錄中的文件alpha.cpp中,我們將創建的src/Makefile.am像往常一樣:

# src/Makefile.am 

lib_LTLIBRARIES = libalpha.la 
libalpha_la_SOURCES = alpha.cpp 
include_HEADERS = alpha.h 

的檢驗程序包括創建一個二進制公測鏈接到alphabeta的源代碼位於目錄測試中的文件beta.cpp中。 automake的文件測試/ Makefile.am樣子:

# tests/Makefile.am 

check_PROGRAMS = beta 
beta_SOURCES = beta.cpp 
beta_CPPFLAGS = -I$(top_srcdir)/src 
beta_LDADD = $(top_builddir)/src/libalpha.la 

我們將增加checkinstallcheck指標納入測試/ Makefile.am爲:

check-local: 
    # recipe to run when 'make check' is called. 

installcheck-local: 
    # recipe to run when 'make installcheck' is called. 

checkinstallcheck目標衝突因爲使用任一目標都會阻止其他目標正常執行(一個目標「污染」另一個目標的構建樹);爲了讓另一個目標正確執行,我們需要刪除beta及其目標文件,並根據其本質(安裝文件爲installcheck,本地文件爲check)根據目標文件重新編譯並重新鏈接。

我們可以通過在兩個目標的配方中簡單運行make clean來解決受污染的構建樹的這個問題。這將清除污染的構建,但過於熱情,因爲我們不需要重新建立,只要我們再次運行相同的目標。只要我們運行其他目標,構建樹就會被污染。

我們只能通過記住之前調用過兩個目標中的哪一個來解決這個問題,我們可以通過創建/銷燬中間文件(我們稱之爲污點)來做到這一點。當文件污點存在時,check目標受到污染,其通過清潔,重建和移除污點來解決;並且installcheck目標受到污染時,文件污點不存在,它通過清理,重建和創建污點來解決。

我們的目標,將採取以下形式:

check-local: 
     # First, check to see if the build tree is tainted and rebuild if so 
    test ! -f taint || $(MAKE) $(AM_MAKEFLAGS) check_rebuild 
     # Then, run our check tests 
    check_script.sh --bin=./beta --scenario=1 
    check_script.sh --bin=./beta --scenario=2 
    ... 

installcheck-local: 
     # First, check to see if the build tree is tainted and rebuild if so 
    test -f taint || $(MAKE) $(AM_MAKEFLAGS) installcheck_rebuild 
     # Then, run our installcheck tests 
    check_script.sh --bin=./beta --scenario=1 
    check_script.sh --bin=./beta --scenario=2 
    ... 

check_rebuild需要根據如何check將運行重建,並期待這樣的目標:

.PHONY: check_rebuild 
check_rebuild: 
    $(MAKE) $(AM_MAKEFLAGS) clean   # remove tainted build tree 
    $(MAKE) $(AM_MAKEFLAGS) beta$(EXEEXT) # rebuild beta 
    rm -f taint       # mark build tree as untainted 

目標installcheck_rebuild同樣的樣子這個:

.PHONY: installcheck_rebuild 
installcheck_rebuild: 
    $(MAKE) $(AM_MAKEFLAGS) clean   # remove tainted build tree 
    $(MAKE) $(AM_MAKEFLAGS) beta$(EXEEXT) \ 
     alpha_CPPFLAGS="-I$(DESTDIR)$(includedir)" \ 
     alpha_LDADD="$(DESTDIR)$(libdir)/libalpha.la" \ 
     alpha_DEPENDENCIES="$(DESTDIR)$(libdir)/libalpha.la" 
    echo 1 > taint       # mark build tree as untainted 

請注意,在installcheck_rebuild中重建beta現在需要重寫automake變量,以便它們指向已安裝的庫。

而且應該是這樣。上述最終形式的目標check-localinstallcheck-localcheck_rebuildinstallcheck_rebuild應該放在文件tests/Makefile.am中的任意位置,以及其中的任何其他命令。