0

我正在尝试编写一个可移植的 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?

测试示例

谢谢!

4

0 回答 0