2016-10-31 53 views
0

在以下示例中生成文件:生成文件:計算變量名

EXTENS := .c .C .cc .c++ .cpp .cxx 
SOURCES := 1.c 2.C 3.cc 4.c++ 5.cpp 6.cxx 
OBJECTS := $(SOURCES) 

REPLACE_EXTENS = $(foreach f,$(EXTENS),$(eval $(1) := $(patsubst %$(f),%.o,$($(1))))) 
$(call REPLACE_EXTENS, OBJECTS) 

all: 
    @echo $(SOURCES) 
    @echo $(OBJECTS) 

我期望線@echo $(OBJECTS)到輸出:

1.o 2.o 3.o 4.o 5.o 6.o 

然而它輸出什麼。我做錯了什麼,做什麼是正確的方法?

+0

'$(EVAL ...)'沒有意義在這裏。 – reinierpost

+0

'做什麼纔是正確的方法'你應該詳細說明你正在試圖解決什麼問題。 – user657267

+0

@ user657267,我認爲這很明顯 - 從源文件列表創建目標文件列表 –

回答

1

$(call REPLACE_EXTENS, OBJECTS)更改爲$(call REPLACE_EXTENS,OBJECTS)。調用參數之間沒有空格。

+0

我知道這是愚蠢的......謝謝。 –

1

來做到這一點,正確的方法是拋出了EXTENS和REPLACE_EXTENS打電話完全,並寫上:

SOURCES := 1.c 2.C 3.cc 4.c++ 5.cpp 6.cxx 
OBJECTS := $(addsuffix .o,$(basename $(SOURCES)) 

all: 
     @echo $(SOURCES) 
     @echo $(OBJECTS) 
+0

謝謝。雖然它不能回答我的問題,但這是一個非常好的替代解決方案。我希望我可以接受這兩個答案 - 總之,我已經提出了你的答案。 –