如reinierpost所示,您可以爲每個編譯器定義僞目標。僞目標是沒有與其關聯的實際文件生產的目標。
但是,make對真正的文件目標非常滿意(目標被視爲最新或不基於他們的最後修改日期),您還可以使用您的繪圖結果作爲目標。而且,還有人建議,可以將所有這些包裝在一個foreach
-eval
-call
結構中,以將您的代碼因式分解。喜歡的東西:
COMPILERS = clang++ g++
define PLOT_compiler
plotfile-$(1): CXX = $(1)
plotfiles += plotfile-$(1)
endef
$(foreach compiler,$(COMPILERS),$(eval $(call PLOT_compiler,$(compiler))))
all: $(plotfiles)
plotfile-%:
<generate plot file using the CXX variable>
的foreach
- eval
- call
構建體實例化一組使每編譯語句,如由PLOT_compiler
變量定義的。
如果你喜歡收集在一個名爲單個文件的所有結果,讓我們說,plots.txt
您可以改用:
COMPILERS = clang++ g++
define PLOT_compiler
plotfile-$(1): CXX = $(1)
plotfiles += plotfile-$(1)
endef
$(foreach compiler,$(COMPILERS),$(eval $(call PLOT_compiler,$(compiler))))
plots.txt: $(plotfiles)
cat $(plotfiles) > [email protected]
plotfile-%:
<generate plot file using the CXX variable>
clean:
rm -f $(plotfiles)
ultraclean:
rm -f $(plotfiles) plots.txt
的clean
和ultraclean
目標將幫助你保持你的工作區乾淨整潔。您可以輕鬆地通過echo $(CXX) > [email protected]
更換<generate plot file using the CXX variable>
配方測試了這一切,並且:
make
make clean
cat plots.txt
爲什麼你對遞歸調用?您如何計劃確保每次使用正確的編譯器重新編譯目標文件以及與之鏈接的程序?我認爲你的方向是錯誤的,但我不確定如何讓你朝正確的方向發展。也許你需要一個'benchmark-1'(子)目錄,在那裏你爲'g ++'和一個'benchmark-2'(子目錄)構建可執行文件,在那裏爲'clang ++'構建可執行文件。源可以來自原始(父)目錄 - 也許通過VPATH。但我沒有嘗試過。 _ [...繼續...] _ –
_ [...延續...] _通常我會做的就是'清潔;做基準CXX = g ++;清潔;做基準CXX = g ++;乾淨「或類似的東西。無論先前操作的順序或成功如何,最終的「make clean」都可確保下一個構建的行爲正確。 –