makefile patsubst 多个表达式

Joa*_*cho 4 makefile

我试图简化我的一些 makefile,我开始这样做:

TEMP_OBJECTS_C = $(patsubst %.c,%.c.o,$(C_SOURCES)) 
TEMP_OBJECTS_CPP = $(patsubst %.cpp,%.cpp.o,$(CPP_SOURCES)) 
Run Code Online (Sandbox Code Playgroud)

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

TEMP_OBJECTS = $(patsubst %.c,%.c.o,$(SOURCES)) $(patsubst %.cpp,%.cpp.o,$(SOURCES))
Run Code Online (Sandbox Code Playgroud)

SOURCES 是所有 cpp 和 c 文件,但随后我显然得到了重复的文件,以及其中的原始源文件名...

所以,我去了这个:

TEMP_OBJECTS = $(patsubst %.c,%.c.o,$(SOURCES))
TEMP_OBJECTS = $(patsubst %.cpp,%.cpp.o,$(TEMP_OBJECTS))
Run Code Online (Sandbox Code Playgroud)

但后来它抱怨递归。

有什么方法可以制作我需要的东西吗?谢谢

Eta*_*ner 5

转述我在这里的回答。

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

OBJS = $(filter %.o,$(patsubst %.cpp,%.o,$(CPP_SOURCES)) \
    $(patsubst %.c,%.o,$(C_SOURCES)))
Run Code Online (Sandbox Code Playgroud)

也就是说,您也可以使用替换引用而不是显式调用 $(patsubst) 来缩短它。

OBJS = $(filter %.o,$(CPP_SOURCES:.cpp=.o) $(C_SOURCES:.c=.o))
Run Code Online (Sandbox Code Playgroud)

如果你想保持你最初的最终尝试,那么你只需要简单地扩展你的变量而不是递归扩展(关于这种差异的更多解释,请参阅变量的两种风格)。

TEMP_OBJECTS := $(patsubst %.c,%.c.o,$(SOURCES))
TEMP_OBJECTS = $(patsubst %.cpp,%.cpp.o,$(TEMP_OBJECTS))
Run Code Online (Sandbox Code Playgroud)