2013-10-31 152 views
0

我無法正確使用路徑替換。我有一大堆的源文件中SOURCES替換問題

@echo $(SOURCES) 
foo.c bar.cpp bah.cxx 

而且我想目標文件的列表:

# Imaginary only because nothing works 
@echo $(OBJECTS) 
foo.o bar.o bah.o 

我試圖用patsubst打造OBJECTS列表。首先,這會產生一個源文件和目標文件的列表。除了錯誤,它會導致鏈接失敗的_main的重複。

OBJECTS = $(patsubst %.c, %.o, ${SOURCES}) $(patsubst %.cc, %.o, ${SOURCES}) \ 
      $(patsubst %.cpp, %.o, ${SOURCES}) $(patsubst %.cxx, %.o, ${SOURCES}) 

其次,這不執行替換。不僅是錯誤的,我找回原來的列表SOURCES

OBJECTS = $(patsubst %.c %.cc %.cpp %.cxx, %.o, ${SOURCES}) 

第三,這將產生源文件的原始名單:

OBJECTS = $(patsubst %.*, %.o, ${SOURCES}) 

我使用以下,這似乎乘以文件,就像兔子也嘗試:

OBJECTS = $(SOURCES:.c=.o) $(SOURCES:.cc=.o) \ 
      $(SOURCES:.cpp=.o) $(SOURCES:.cxx=.o) 

如何一個人在使用便攜式產品時執行擴展的簡單替換?

回答

3

湯姆的答案是正確的。 Etan's也會工作。較短的解決方案將是:

$(addsuffix .o,$(basename $(SOURCES)) 
+0

完美,謝謝。這正是我所期待的。 – jww

+0

比我的解決方案好得多。雖然我可能會用foreach,如果我真的寫我的用來縮短它一點。 –

1

如果你有一個類似過濾器的功能,你可以使用它。否則,你可以做到這一點的階段:

SOURCES := foo.c bar.cpp bah.cxx 

O := $(SOURCES) 
$(info $(O)) 
O := $(patsubst %.c,%.o,$(O)) 
$(info $(O)) 
O := $(patsubst %.cpp,%.o,$(O)) 
$(info $(O)) 
O := $(patsubst %.cxx,%.o,$(O)) 
$(info $(O)) 

的問題,您的第一(和第三個自認爲是有效的相同)的嘗試是patsubst留下任何不變的話在不匹配的模式輸入。所以,當你從多次調用到patsubst建立OBJECTS時,你正在複製(在每個片段中)與該模式不匹配的所有SOURCSE條目。

第二個問題是patsubst沒有采用多種模式,所以沒有任何匹配的錯誤模式,所以你完全不修改源。

+0

謝謝Etan。我很感激幫助。 – jww

1

首先,我不認爲patsubst是便攜式的。這是一個GNU make功能。

我覺得一個回答你的問題是嵌套subsitutions,如:

$(patsubst %c,%.o,$(patsubst %.cc,%.o,$(patsubst .....))) 
+0

謝謝湯姆。我很感激幫助。 – jww