【问题标题】:How to deal with autoconf warning "'%'-style pattern rules are a GNU make extension"如何处理 autoconf 警告“'%'-style pattern rules are a GNU make extension”
【发布时间】:2015-03-14 13:28:07
【问题描述】:

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 上进行了搜索,但它们似乎都无法区分它们索引的大量构建日志(为什么要...),这使得搜索痛苦。我想:

  • 我可以通过将AM_INIT_AUTOMAKE([-Wno-portability]) 添加到configure.ac(在post of the openais mailing list 中找到)来消除警告,这似乎不太好,因为在技术环境中简单地消除警告通常不是一个好主意 - 请告诉我是否 GNU autotools 是个例外。

【问题讨论】:

  • 您没有提供足够的信息。你用automake吗?该语法与您的 Makefile.am 文件中的模式规则一致吗?还是只是 autoconf,语法在您的 Makefile.in 文件中?如果是前者,这条规则可能是没用的。如果是后者,这条规则可能应该写成 SUFFIX 规则。此警告告诉您的是您的 makefile 包含 GNU make 特定的功能(模式规则不是 make 的 POSIX 标准的一部分),并且它不适用于 make 的其他变体。你必须决定你是否关心。
  • 另见 Automake 邮件列表中的 Warning about GNU make extension with automake 1.10

标签: makefile autotools autoconf


【解决方案1】:

替换

%.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,基本上),回到“老式的后缀规则”。

如果您有一个不能被后缀规则替换的模式规则,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

【讨论】:

  • 新版本的 autoconf '要求'我使用 SUFFIXES= .hack .win insetead of target .SUFFIXES
  • SUFFIXES += .hack .win
【解决方案2】:

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

AM_INIT_AUTOMAKE([-Wall -Wportability])

在我的 Makefile.am 中

dist_bin_SCRIPTS = foobar

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-03
    • 2017-10-18
    相关资源
    最近更新 更多