makefile patsubst多个表达式

时间:2015-11-16 16:37:09

标签: makefile

我正在尝试简化我的一些makefile,我开始这样做了:

TEMP_OBJECTS_C = $(patsubst %.c,%.c.o,$(C_SOURCES)) 
TEMP_OBJECTS_CPP = $(patsubst %.cpp,%.cpp.o,$(CPP_SOURCES)) 

但我真正想要做的只是将.o附加到以.c或.cpp结尾的任何内容。这只适用于.c,如果我想添加cpp文件,我必须进行完全独立的替换。 我试过这个:

TEMP_OBJECTS = $(patsubst %.c,%.c.o,$(SOURCES)) $(patsubst %.cpp,%.cpp.o,$(SOURCES))

SOURCES是所有cpp和c文件,但后来我显然有重复文件,并且原始源文件名在其中......

所以,我接受了这个:

TEMP_OBJECTS = $(patsubst %.c,%.c.o,$(SOURCES))
TEMP_OBJECTS = $(patsubst %.cpp,%.cpp.o,$(TEMP_OBJECTS))

然后它抱怨递归。

有没有办法让我需要的东西? 感谢

2 个答案:

答案 0 :(得分:3)

从我的回答here中解释。

使用$(filter)仅包含您想要的条目。

OBJS = $(filter %.o,$(patsubst %.cpp,%.o,$(CPP_SOURCES)) \
    $(patsubst %.c,%.o,$(C_SOURCES)))

那说你也可以使用Substitution References而不是显式调用$(patsubst)来缩短它。

OBJS = $(filter %.o,$(CPP_SOURCES:.cpp=.o) $(C_SOURCES:.c=.o))

如果您想保留原始的最终尝试,那么您只需要简单地扩展变量而不是递归扩展(有关此差异的更多说明,请参阅The Two Flavors of Variables)。

TEMP_OBJECTS := $(patsubst %.c,%.c.o,$(SOURCES))
TEMP_OBJECTS = $(patsubst %.cpp,%.cpp.o,$(TEMP_OBJECTS))

答案 1 :(得分:0)

我会试试 TEMP_OBJECTS = $(patsubst %.c,%.c.o,$(patsubst %.cpp,%.cpp.o,$(SOURCES)))

或类似的东西:

TEMP_OBJECTS_C = $(patsubst %.c,%.c.o,$(SOURCES))
TEMP_OBJECTS = $(patsubst %.cpp,%.cpp.o,$(TEMP_OBJECTS_C))

两者都非常相似,会过滤两次来源。

或已经给出的anser:

TEMP_OBJECTS := $(patsubst %.c,%.c.o,$(SOURCES))
TEMP_OBJECTS = $(patsubst %.cpp,%.cpp.o,$(TEMP_OBJECTS))

:=将立即评估表达式,从而避免递归。