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

标签 makefile gnu-make

我正在尝试制定一个仅限订单的先决条件,以确保在输出文件之前存在构建目录。根据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/

相关文章:

Makefile:从数字序列生成目标

path - Makefile中的路径定义

生成文件 w. Protocol Buffer 和自动依赖

makefile - 在 foreach 中添加额外空间时 makefile 中缺少分隔符错误

makefile - makefile 内的版本号比较

makefile - 使 : implicit rule chain broken when binary is intermediate target

makefile - 如何修改隐式GNUMake规则来编译文件?

c - 如何在 CLion 中添加链接器标志

makefile - 如何使用 CMake 为目标创建别名?

c - 如何在Linux内核Makefile中添加规则