我正在尝试编写一个可移植的 BSD 和 GNU Makefile,它可以进行源外构建和自动先决条件。GNU Make 工作正常,但 BSD Make 不行。
OBJDIR := objdir
SRCS := foo.c bar.c baz.c
OBJS := $(SRCS:%.c=$(OBJDIR)/%.o)
CPPFLAGS += -MMD -MP
all: $(OBJDIR) $(OBJS)
$(CC) $(LDFLAGS) -o main $(OBJS) $(LDLIBS)
$(OBJDIR)/%.o: %.c
$(COMPILE.c) $(OUTPUT_OPTION) $<
$(OBJDIR):
mkdir $(OBJDIR)
-include $(OBJDIR)/$(SRCS:%.c=%.d)
clean:
rm -rf main $(OBJDIR)
这是输出:
$ gmake
mkdir objdir
cc -MMD -MP -c -o objdir/foo.o foo.c
cc -MMD -MP -c -o objdir/bar.o bar.c
cc -MMD -MP -c -o objdir/baz.o baz.c
cc -o main objdir/foo.o objdir/bar.o objdir/baz.o
$ bmake
--- objdir ---
bmake: bmake: don't know how to make objdir/foo.o. Stop
bmake: stopped in /home/antonin/tests
我的猜测是 BSD Make 不理解路径中的替换(这是正确的术语吗?)$(OBJDIR)/%.o: %.c
,因为bmake OBJDIR=.
工作正常。如果是这样,我如何编写一个实现相同功能的简单、可移植的 Makefile?
测试示例。
谢谢!