2017-03-07 78 views
0

我有一個源文件benchmark.c,我想用每個編譯器優化級別來構建它。 有沒有辦法自動實現這一點,而不是像這樣手動提供每一個標誌?如何使用gcc編譯爲每個優化級別的二進制文件?

all: 
    gcc benchmark.c -o benchmark-O0 -O0 
    gcc benchmark.c -o benchmark-O1 -O1 
    gcc benchmark.c -o benchmark-O2 -O2 
    gcc benchmark.c -o benchmark-O3 -O3 

我想要一個更一般的方法。 預先感謝您。

+0

你想自動化哪部分?更重要的是,你有一些看起來像是有效的東西,而且非常清晰和簡單,所以它究竟有什麼問題呢? –

回答

1

你在考慮for循環嗎?

all: 
    for level in O0 O1 O2 O3; do \ 
     gcc benchmark.c -$level benchmark-$level \ 
    done 
1

您可以通過單詞的列表迭代,每個包含設置優化選項的數字,每一次調用罐裝配方,它能直接調用相應的命令:

LIST := 0 1 2 3 

define RUN 

gcc benchmark.c -o benchmark-O$1 -O$1 

endef 

all: 
    $(foreach variable,$(LIST),$(call RUN,$(variable))) 
1

既然你假設使用GNU make,你不妨使用諸如函數之類的GNU特性。這裏是你可以做什麼,在我看來是一個合理的做出類似的成語任務的一種方法:

baseexe := benchmark 
levels := 0 1 2 3 s 
files := $(foreach level,$(levels),$(baseexe)-O$(level)) 

all: $(files) 

$(files): $(baseexe).c 
    gcc $(subst $(baseexe),,[email protected]) $< -o [email protected] 

有神奇的兩個或三個位有:

  • 的定義files使變量使用GNU的foreach使函數從基本名稱和優化級別列表構建目標文件的列表。

  • (以下你)目標文件的名稱編碼的優化選項,所以

  • 構建配方可以和不使用GNU的subst進行函數來提取的每個目標名稱的優化選項。

您將不得不判斷這個有點神祕的8行(包括兩個空白)的makefile對於您的目的而言是否比您開始使用時更好。至於我,我會把你簡單明瞭的初始版本。