仅订单先决条件的多个隐式规则

时间:2015-11-19 17:39:39

标签: makefile gnu-make

我正在尝试制作一个仅订单的先决条件,以确保在输出文件之前存在构建目录。根据{{​​3}}:

  

您仍然可以为同一目标声明多行先决条件:它们会被适当地附加(正常的先决条件会附加到正常先决条件列表中;仅限订单的先决条件会附加到仅限订单的先决条件列表中)。

所以我希望这应该有效:

BUILDDIR:=build

all: $(BUILDDIR)/test.o
clean:
    rm -rf $(BUILDDIR)

$(BUILDDIR):
    mkdir -p $(@)

$(BUILDDIR)/%.o: | $(BUILDDIR)
$(BUILDDIR)/%.o: %.c
    gcc -o $@ -c $<

但它没有,无法创建目录。但是,当我将规则放在一行时,它确实有效:

$(BUILDDIR)/%.o: %.c | $(BUILDDIR)

在这个简单的例子中,它并不重要,但我需要为我更复杂的makefile制作这样的多个先决条件列表,并且手册使它听起来应该有效。我怎么能做到这一点?

如果重要:

$ make -v
GNU Make 3.81

1 个答案:

答案 0 :(得分:3)

implicit rule search期间删除了没有配方的隐式规则,其唯一目的是cancel任何先前定义的相同规则。这意味着行$(BUILDDIR)/%.o: | $(BUILDDIR)基本上没有效果。

由于您已经有一个先决条件列表,您可以使用常规和静态模式规则:

BUILDDIR := build
OBJS     := $(BUILDDIR)/test.o

all: $(OBJS)
clean:
    $(RM) -r $(BUILDDIR)

$(BUILDDIR):
    mkdir -p $@

$(OBJS): | $(BUILDDIR)
$(OBJS): $(BUILDDIR)/%.o: %.c
    $(CC) -o $@ -c $<