Makefile BSD在规则$(objdir)/%o中进行替换失败:%c

Makefile BSD在规则$(objdir)/%o中进行替换失败:%c,makefile,gnu-make,bsdmake,Makefile,Gnu Make,Bsdmake,我正在尝试编写一个可移植的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) $(OB

我正在尝试编写一个可移植的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)
我的猜测是BSD Make不理解路径中的替换(这是正确的术语吗?
$(OBJDIR)/%.o:%.c
,因为
bmake OBJDIR=。
工作正常。如果是这样,我如何编写一个简单的、可移植的Makefile来实现相同的功能


谢谢大家!

模式规则是GNU Make的一个特性,上次我看它时,它在BSD Make中是不可用的。BSD Make确实希望在当前目录中生成。你也许可以使用
VPATH
做你想做的事情,我认为这是对BSD和GNU make的评论,但是你要么在目标目录中调用make,要么在目标目录中自动重新调用make(我不确定这是否可以通过可移植的方式实现)。我如何编写一个简单的,实现相同功能的可移植Makefile?简单回答:你不能。您可以编写一个makefile,以一种非常不同的方式获得类似的结果(正如编程人员所提到的,在对象目录中运行构建)。好的,我很高兴您回答了,因为我已经分析了您博客上的文章一段时间了。我打算放弃源代码外构建,转而使用bmake。谢谢如果你想写可移植的
Makefile
你应该读一读:你只能使用这些功能;但是我想像这样摆弄
VPATH
mkdir-build;光盘制作;使VPATH=-f../Makefile
。但是,我在项目的根目录下有一些生成头文件的脚本。它们是通过
/script.sh>header.h
启动的,Make无法启动它们,因为工作目录现在是
build
,而不是项目的根目录。有办法解决这个问题吗?预结束
VPATH
$ 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