2012-07-04 53 views
0

當我嘗試運行下面讓文件(更新瞭如下建議):爲什麼我的Makefile中的eval函數不工作?

# Build Directories 
src_dir=src 
obj_dir=obj 
bin_dir=bin 

cc=cl 
cc_flags= 

configs = dbg rel 

# create the directory for the current target. 
[email protected] -p $(@D) 

# source files 
src = MainTest.cpp 

define build_template = 
# object files - replace .cpp on source files with .o and add the temp directory prefix 
obj_$(1) = $$(addprefix $$(obj_dir)/$(1)/, $$(addsuffix .obj, $$(basename $$(src)))) 

testVar = "wooo" 

# build TwoDee.exe from all of the object files. 
$$(bin_dir)/$(1)/MainTest.exe : $$(obj_$(1)) 
    $$(dir_guard) 
    $$(cc) -out:[email protected] $$(obj_$(1)) -link 

# build all of the object files in the temp directory from their corresponding cpp files. 
$$(obj): $$(obj_dir)/$(1)/%.obj : $$(src_dir)/%.cpp 
    $$(dir_guard) 
    $$(cc) $$(cc_flags) -Fo$$(obj_dir)/$$(1) -c $$< 
endef 

$(foreach cfg_dir,$(configs),$(eval $(call build_template,$(cfg_dir)))) 

release: $(bin_dir)/rel/MainTest.exe 

debug: cc_flags += -Yd -ZI 
debug: $(bin_dir)/dbg/MainTest.exe 

$(warning testVar $(testVar)) 

我得到的是:

$ make 
Makefile:41: testVar 
make: *** No rule to make target `bin/rel/MainTest.exe', needed by `release'. Stop. 

你可以從輸出的的testvar變量從未看到。我根據我的最後一個問題進行了這些更改:Why doesn't my makefile target-specific variable work?

+0

請注意:您可能想用[僅限訂購前提條件](http://www.gnu.org/software)替換這些'$(dir_guard)'行/make/manual/html_node/Prerequisite-Types.html#Prerequisite-Types)以避免對'mkdir'的多餘調用。 – MvG

+0

另請注意,您可能希望在模板中設置編譯器標誌,而不是從'debug'目標繼承它們。目前,不帶參數運行make會建立'bin/dbg/MainTest.exe',因爲這是文件中的第一個目標。它會這樣做,沒有調試標誌。即使你預先聲明瞭一個「全部」目標,也可能會出現你想要建立單個目標的情況。最好確保'obj/dbg /'中的任何對象總是使用調試選項進行編譯。 – MvG

回答

1

有一些混淆Make的空格。試試這個:

$(foreach cfg_dir,$(configs),$(eval $(call build_template,$(cfg_dir)))) 

還要確保您指定正確的對象鏈接:

$$(cc) -out:[email protected] $$(obj_$(1)) -link 

而作爲@Beta在下面的評論中指出,在模板定義語法=需要GNU make 3.82或更高版本。所以更好地省略它:

define build_template 
+0

我刪除了空格並修復了obj錯誤,我仍然得到相同的結果。我使用了-p輸出,看起來不像是擴展了eval。我還在模板中定義了一個變量,並嘗試使用警告打印該值,但它是空的。其他的調試技巧是否可以提供? – Farnk

+0

奇怪。你在用什麼?這個GNU是製作還是其他的味道? – MvG

+0

當我讀到-p輸出時,它說GNU make 3.81。 – Farnk

相關問題