2013-10-31 106 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