如何处理 autoconf 警告“'%'-style pattern rules are a GNU make extension”

How to deal with autoconf warning "'%'-style pattern rules are a GNU make extension"

Makefile

%.o: %.c
    @echo Compiling $< ...

我在 运行 autoreconf --installautoconf 版本 2.69)时收到警告 '%'-style pattern rules are a GNU make extension。警告不是很清楚,但让我觉得 configure.ac.

有一些东西要添加

我在 google.com、duckduckgo.com 和 yahoo.com 上进行了搜索,但它们似乎都无法区分它们索引的大量构建日志(为什么他们应该...) 这使得搜索变得痛苦。我认为:

替换

%.o: %.c

.c.o:

这是一个做同样事情的后缀规则,而且更便携。如果您的规则涉及未知的后缀,请将其列在特殊 .SUFFIXES 目标的先决条件中:

.SUFFIXES: .hack .win

.hack.win:
      # build a .win file from a .hack file.

详细了解其工作原理here。他们建议使用模式规则而不是后缀规则,因为它们更清晰、更通用,这是事实,但正如 autoconf 指出的那样,它们确实不太便携。所以如果这是一个担心(如果你想在 BSD/Mac OS 上构建而不安装 GNU make,基本上),回到 "old-fashioned suffix rules."

如果您有一个不能被后缀规则替换的模式规则,另一个 automake 不会抱怨的可能替换是 static pattern rule。这类似于模式规则,但需要它适用的目标列表。而不是说

%.o: %.c

你不得不说

OBJS = foo.o bar.o baz.o # list all .o files here

$(OBJS): %.o: %.c

或者更一般地说,

target-pattern: prerequisite-pattern

取代
target-list: target-pattern: prerequisite-pattern

Winteermute 涵盖了问题的几乎所有方面。我将在这里添加我自己的挫败感之一。在我的 make 文件中,我一直在使用模式规则来安装 shell 没有 .sh 后缀的脚本。 Automake 不喜欢模式规则并给你警告。您现在可以简单地忽略该警告。我的 configure.ac 文件:

AM_INIT_AUTOMAKE([-Wall -Wportability])

在我的Makefile.am

dist_bin_SCRIPTS = foobar

# pattern rule
% : %.sh
    cp $< $@
    chmod +x $@

在我的脚本目录中有 foobar.sh 文件。

虽然我真的很努力地在互联网上搜索并向后阅读了一些手册,但我一直无法找到一种更好的方法来指定后缀规则以涵盖目标没有扩展名的情况次。

我分发 *.sh 文件的原因是用户不必知道实现细节。他们只需要记住可执行文件的名称。此外,要求用户键入额外的 .sh 确实是在浪费生命。