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,$(SOURCES)) $(patsubst %.cpp,%.cpp.o,$(SOURCES))

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

所以,我去了这个:
TEMP_OBJECTS = $(patsubst %.c,%.c.o,$(SOURCES))
TEMP_OBJECTS = $(patsubst %.cpp,%.cpp.o,$(TEMP_OBJECTS))

但后来它提示递归。

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

最佳答案

转述我的回答 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))

关于makefile patsubst 多个表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33740270/

相关文章:

c++ - 制作文件 - 编译并将引用放入系统文件夹

c++ - 编译 Twilio C++ 库时遇到问题

makefile - 使用 GNU Make 处理带空格的文件名

C : Compile openSSL project

c - 使用 Makefile 链接多个文件

docker - make [1]:[install-domserver-l]错误1(忽略)

makefile - 在 dotfiles 存储库中管理用户的 crontab

c - 如何为visual studio构建工具cl.exe编写makefile(nmake)

perl - cpan(1) 失败,返回 'Cannot allocate memory'

makefile - 相同的规则,不同的目标和依赖关系