【问题标题】:Can a makefile Pattern Rule prerequisite be a Pattern Rule?makefile 模式规则先决条件可以是模式规则吗?
【发布时间】:2015-05-18 21:24:56
【问题描述】:

我有这个makefile:

.PHONY: all
all: foo.o

makefile: ;

%.inc:
    echo INC
    touch $@

%.o: bar.inc
    echo O
    touch $@

%.o:
    FAIL

我希望它使用第一个 %.o 规则,创建 bar.inc 作为先决条件,然后创建 foo.o。相反,它使用最后一条规则,我得到了这个:

FAIL
make: FAIL: Command not found
make: *** [foo.o] Error 127

如果我将%.inc 更改为bar.inc 或将%.o 更改为foo.o,它工作正常。 documentation

为了应用模式规则,其目标模式必须与所考虑的文件名匹配,并且其所有先决条件(模式替换后)必须命名存在或可以制作的文件。

模式规则%.inc 算不算“可以制作”?我正在使用 GNU Make 3.81。

【问题讨论】:

    标签: makefile gnu-make


    【解决方案1】:

    您缺少的相关详细信息在10.5.4 How Patterns Match 部分中。

    具体来说(强调我的):

    仅当存在与文件名匹配的目标模式并且该规则中的所有先决条件都存在或可以构建时,才能使用模式规则构建给定文件。您编写的规则优先于内置规则。但请注意,其先决条件实际存在或被提及的规则始终优先于具有必须通过链接其他隐式规则来制定的先决条件的规则。

    所以问题不在于您的先决条件无法满足,而是由于您的其他规则“获胜”,因此 make 甚至没有尝试。

    MadScientist 在他的回答 here 中提供了一些额外的信息和细节。

    【讨论】:

    • 谢谢!我可以删除最后一个 %.o 规则,但是 make 会选择一个内置规则 $(AS) $(ASFLAGS) 因为 foo.s 存在其他原因。如果我取消它应该选择正确的规则。
    • 供参考,这里是如何取消内置规则:gnu.org/software/make/manual/html_node/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多