2015-08-22 54 views
0

我試圖製作一個自包含的Makefile。 我的Makefile有類似以下的規則:使目標依賴於具有不同標誌的相同前提條件

benchmark: 
     (something that depends on variable CXX) 

這條規則代表了一個編譯器的單一基準。我想基準幾個編譯器。

所以我想實現的目標是在不脫離情節規則內調用$(MAKE)遞歸(僞語法)以下:

plot: benchmark CXX=clang++ benchmark CXX=g++ 
    (generate a plot) 

也就是說,我想這個目標取決於先決條件標杆+一個標誌並將兩者視爲兩個不同的先決條件,即使它們是相同的規則。

+0

爲什麼你對遞歸調用?您如何計劃確保每次使用正確的編譯器重新編譯目標文件以及與之鏈接的程序?我認爲你的方向是錯誤的,但我不確定如何讓你朝正確的方向發展。也許你需要一個'benchmark-1'(子)目錄,在那裏你爲'g ++'和一個'benchmark-2'(子目錄)構建可執行文件,在那裏爲'clang ++'構建可執行文件。源可以來自原始(父)目錄 - 也許通過VPATH。但我沒有嘗試過。 _ [...繼續...] _ –

+0

_ [...延續...] _通常我會做的就是'清潔;做基準CXX = g ++;清潔;做基準CXX = g ++;乾淨「或類似的東西。無論先前操作的順序或成功如何,最終的「make clean」都可確保下一個構建的行爲正確。 –

回答

1

假設GNU製作,我認爲你正在尋找可以用這種方式來表達的邏輯:

CXXES := clang++ g++ 

benchmark: $(CXXES:%=benchmark-%) 

然後有一個單一的規則生成基準:

benchmark-%: 
    # generate a plot using $(CXX), which will be equal to [email protected] 

或多個如果您的繪圖生成規則是編譯器特定的:

benchmark-clang++: CXX = clang++ 
    # generate a plot using $(CXX) 
    (...) 

benchmark-g++: CXX = g++ 
    # generate a plot using $(CXX) 
    (...) 

這將更好地識別fy輸出文件(繪圖?),其文件名取決於$(CXX)的值並將其用作中間目標。

+0

依賴線如何工作?他們不是說'make'試圖創建文件'CXX','=',或者'clang ++'或'g ++',並且可能會失敗嗎?您可能會想到一個想法的萌芽 - 分別命名的目標使用不同的編譯器構建可執行文件。但是對象文件也需要重新命名。我感覺它變得毛茸茸的。 –

+0

@Jonathan Leffler:我沒有真正嘗試過這個,但是它的想法是用它們的名字中具體的'$(CXX)'值來指定目標,並且具有總體(僞)目標取決於它們中的全部。即使這個特定實現的細節不適用(在這種情況下,這個答案應該被修復),這個想法應該可行。 – reinierpost

+0

問題是那些是兩個編譯器。我不能依賴這樣的靜態規則。該規則必須是基準測試 - $ {COMPILER} –

1

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 

cleanultraclean目標將幫助你保持你的工作區乾淨整潔。您可以輕鬆地通過echo $(CXX) > [email protected]更換<generate plot file using the CXX variable>配方測試了這一切,並且:

make 
make clean 
cat plots.txt 
+0

我想爲所有結果繪製一張圖:)它按照編譯器分成幾部分。比較每個編譯器的兩個二進制文件。所以這不符合我想要的。我認爲這可能不是一致的:我有類似CXX的東西,它總是在每個編譯器中工作。但我想要的結果需要編譯幾次。所以我最終產生了一種「衝突」,即繪製我需要爲不同的CXX編譯的文件,但我只想要一個繪圖文件。 –

+0

這不是一個真正的問題。如果您知道如何將新節添加到現有的繪圖文件中,則可以使用空文件作爲目標。只需用'touch $ @'結束你的食譜,就完成了。 –

相關問題