2011-05-22 121 views
0

我一直在使用參數化目標的生成文件。在我的OpenSUSE PC上,它運行成功時給出make all,但(奇怪)運行clean而不是make all如果您只提供make沒有額外的參數。更糟糕的是,在我的Ubuntu PC上,make all完全不起作用,並且從瀏覽make -pn all | less時,all甚至沒有被生成爲目標。生成文件無法正確生成「所有」目標

很明顯,我在生成all目標時做錯了什麼。這裏是生成文件:

# To see predefined preprocessor macros: 
# gcc -dM -E - < /dev/null | sort | less 

# After a default installation of opencc, you might need to run: 
# sudo ln -s /opt/x86_open64-4.2.5/lib/gcc-lib /usr/lib/gcc-lib 

allflags = -Wall -pipe 
cflags = -std=c99 
cxxflags = 

flags_O0 = -O0 -ggdb 
flags_O1 = -O1 
flags_O2 = -O2 
flags_O3 = -O3 -fomit-frame-pointer 

flags_opt_gcc = -march=native -s 
flags_opt_icc = -march=native -s 
flags_opt_opencc = -march=auto -s 
flags_opt_clang = -march=native 

ldflags_O0 = $(cflags_O0) 
ldflags_O1 = $(cflags_O1) -Wl,-s -Wl,-O,1 
ldflags_O2 = $(cflags_O2) -Wl,-s -Wl,-O,2 
ldflags_O3 = $(cflags_O3) -Wl,-s -Wl,-O,3 

define dcompiler = 
version-$(1): 
    $(1) --version 2>&1 | sed 's/.*/"&\\n"/' > [email protected] 
flags_$(1)_O0 = $$(allflags) $$(flags_O0) $$(flags_$(1)) 
flags_$(1)_O1 = $$(allflags) $$(flags_O1) $$(flags_$(1)) $$(flags_opt_$(1)) 
flags_$(1)_O2 = $$(allflags) $$(flags_O2) $$(flags_$(1)) $$(flags_opt_$(1)) 
flags_$(1)_O3 = $$(allflags) $$(flags_O3) $$(flags_$(1)) $$(flags_opt_$(1)) 
$$(eval $$(call diter,$(1),O0)) 
$$(eval $$(call diter,$(1),O1)) 
$$(eval $$(call diter,$(1),O2)) 
$$(eval $$(call diter,$(1),O3)) 
endef 

define dimpaler = 
cc_impaler_$(2) = gcc $$(flags_gcc_$(2)) $$(cflags) 
all: impaler$(1) 
impaler$(1): impaler$(1).o util$(1).o 
    $$(cc_impaler_$(2)) -o [email protected] $$^ $$(ldflags_$(2)) -ldl -lm -lpopt 
impaler$(1).o: impaler.c impaler.h util.h makefile 
    $$(cc_impaler_$(2)) -o [email protected] $$< -c 
util$(1).o: util.c util.h makefile 
    $$(cc_impaler_$(2)) -o [email protected] $$< -c 
clean:: 
    rm -f impaler$(1) 
endef 

define diter = 
cc_iters_$(1)_$(2) = $(1) $$(flags_$(1)_$(2)) 
all: iters-$(1)-$(2).so 
iters-$(1)-$(2).so: iters-$(1)-$(2).c.o iters-$(1)-$(2).cpp.o 
    $$(cc_iters_$(1)_$(2)) -o [email protected] $$^ -shared $$(ldflags_$(2)) 
iters-$(1)-$(2).c.o: iters.c impaler.h version-$(1) makefile 
    $$(cc_iters_$(1)_$(2)) $$(cflags) -o [email protected] $$< -c 
iters-$(1)-$(2).cpp.o: iters.cpp impaler.h version-$(1) makefile 
    $$(cc_iters_$(1)_$(2)) $$(cxxflags) -o [email protected] $$< -c 
endef 

clean:: 
    rm -f *.o *.so version-* 

$(eval $(call dimpaler,-debug,O0)) 
$(eval $(call dimpaler,,O3)) 
$(eval $(call dcompiler,gcc)) 
$(eval $(call dcompiler,icc)) 
$(eval $(call dcompiler,opencc)) 
$(eval $(call dcompiler,clang)) 

任何提示,將不勝感激。謝謝。


編輯:

即使當我減少生成文件到以下幾點:

define dimpaler = 
all: impaler 
impaler: impaler.o 
    gcc -o [email protected] $$^ 
impaler.o: impaler.c 
    gcc -o [email protected] $$< -c 
endef 

$(eval $(call dimpaler)) 

「所有」 依然沒有發生。


編輯:

相反的是非常清楚的解釋http://www.gnu.org/software/make/manual/make.html#Reading-Makefiles語法,顯然添加=一個限定使得後一切默默地消失,且省略了=,使生成文件表現得更加出色。

現在我剩下的另一個問題:make all工程,但make沒有。

+0

我能說的只是「aaargh!」 - 我通常會嘗試在這裏提出問題,但看到這一點讓我感覺不舒服。也許你可以解釋它想做什麼? – 2011-05-22 19:08:16

+0

「impaler」是一個程序,用於比較從使用各種標誌的各種編譯器編譯的一段迭代代碼的性能。 「dcompiler」是爲每個調用的編譯器執行一次的函數。 「dimpaler」是爲主程序調用的函數,爲調試和發佈變體執行。 「diter」是針對編譯器和優化級別的每個組合而調用的函數。我同意這很討厭。 – Reinderien 2011-05-22 19:13:22

回答

3

正如你所說,在define之後刪除=使其更好。這可能會改變=define中的處理方式。

至於另一個問題,make不起作用,因爲all未被定義爲第一條規則。嘗試在開始處添加一個空的all:規則。還應該有一種建立默認目標規則的方法,但我會查看文檔,因爲我現在不記得它。

編輯

好像是可變.DEFAULT_TARGET

+0

改變順序以便首先出現'all:'確實修復了它。抱怨抱怨讓人厭惡。 – Reinderien 2011-05-22 20:41:41