如何在構建庫時實現make installcheck
目標?也就是說,我有一個check
目標,創建一個測試程序,鏈接到創建的庫,由某個腳本調用以檢查庫代碼是否正常工作,並且希望執行相同的檢查,但是鏈接到庫後的庫已經安裝了它的;我怎樣才能實現這個?(GNU make)installcheck一個庫
回答
由於我的問題沒有得到答覆,我不能輕鬆地找到任何東西,因爲我的方法至少有效(儘管可能有點難看),我會用通用方法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
的檢驗程序包括創建一個二進制公測鏈接到alpha。 beta的源代碼位於目錄測試中的文件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
我們將增加check
和installcheck
指標納入測試/ Makefile.am爲:
check-local:
# recipe to run when 'make check' is called.
installcheck-local:
# recipe to run when 'make installcheck' is called.
的check
和installcheck
目標衝突因爲使用任一目標都會阻止其他目標正常執行(一個目標「污染」另一個目標的構建樹);爲了讓另一個目標正確執行,我們需要刪除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-local
,installcheck-local
,check_rebuild
和installcheck_rebuild
應該放在文件tests/Makefile.am中的任意位置,以及其中的任何其他命令。
- 1. GNU Make不執行第一個目標
- 2. 調試GNU make
- 3. gnu make substring
- 4. GNU make引用
- 5. NDK:Android.mk/GNU Make
- 6. Xcode中的GNU make
- 7. 的GNU-make編譯
- 8. 從GNU Make到Scons
- 9. gnu make中的「.MAKE」目標是什麼?
- 10. BSD Make和GNU Make兼容的makefile
- 11. MinGW/GNU Make - 「多個目標模式」
- 12. GNU Make中的互斥量?
- 13. Makefile中的GNU make變量
- 14. GNU make error code(e = -1)
- 15. 綜合gnu make/gcc教程
- 16. Gnu make on Windows 7 64bit?
- 17. GNU make的SECONDEXPANSION和遞歸
- 18. GNU make通配符替代?
- 19. GNU make的-j選項
- 20. GNU Make中的雙精度%
- 21. GNU Make中的concatenate值
- 22. GNU make和對象列表
- 23. qt是否帶有gnu make?
- 24. GNU Make:如何構建一個通用庫作爲32位和64位?
- 25. GNU make:繼承另一個規則的先決條件
- 26. 我該如何提供一個git SHA1來gnu make?
- 27. 如何在GNU Make中定義一個ifeq?
- 28. GNU Make忽略除第一個以外的所有規則
- 29. gnu make,vpath規則,只有一個文件
- 30. 什麼是GNU Make的第一個發佈日期?