我正在尝试制定一个仅限订单的先决条件,以确保在输出文件之前存在构建目录。根据GNU Make manual :
you may still declare multiple lines of prerequisites for the same target: they are appended appropriately (normal prerequisites are appended to the list of normal prerequisites; order-only prerequisites are appended to the list of order-only prerequisites).
所以我希望这应该有效:
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
最佳答案
在 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 $<
关于makefile - 仅订单先决条件的多个隐式规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33810728/