makefile patsubst多个表达式
我正在尝试简化一些生成文件,我开始这样做:makefile patsubst多个表达式,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,$(SO
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))
源代码都是cpp和c文件,但很明显我得到了重复的文件,其中的原始源文件名
所以,我选择了这个:
TEMP_OBJECTS = $(patsubst %.c,%.c.o,$(SOURCES))
TEMP_OBJECTS = $(patsubst %.cpp,%.cpp.o,$(TEMP_OBJECTS))
但后来它抱怨递归性
有什么办法可以满足我的需要吗?
谢谢你对我的回答进行解释 使用
$(过滤器)
仅包括所需的条目
OBJS = $(filter %.o,$(patsubst %.cpp,%.o,$(CPP_SOURCES)) \
$(patsubst %.c,%.o,$(C_SOURCES)))
也就是说,您还可以使用而不是显式调用$(patsubst)来将其缩短一点
OBJS = $(filter %.o,$(CPP_SOURCES:.cpp=.o) $(C_SOURCES:.c=.o))
如果您希望保留最初的最终尝试,那么只需要简单地扩展变量,而不是递归地扩展(有关此差异的更多解释,请参阅)
我会试试看
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))
两者都非常相似,将对源进行两次过滤
或者已经给出的答案:
TEMP_OBJECTS := $(patsubst %.c,%.c.o,$(SOURCES))
TEMP_OBJECTS = $(patsubst %.cpp,%.cpp.o,$(TEMP_OBJECTS))
:=
将立即计算表达式,从而避免递归。可能会使用此表达式。我只是想找到一种方法来减少我的makefile上的行数,并避免临时变量等等……我认为最后一个例子的风格是相反的;正如所写的,它仍然会抱怨递归。:=
应该在第二行,=
应该在第一行。
TEMP_OBJECTS := $(patsubst %.c,%.c.o,$(SOURCES))
TEMP_OBJECTS = $(patsubst %.cpp,%.cpp.o,$(TEMP_OBJECTS))