Autoreconf 以“非 POSIX 变量名”停止

Posted

技术标签:

【中文标题】Autoreconf 以“非 POSIX 变量名”停止【英文标题】:Autoreconf stops with "non-POSIX variable name" 【发布时间】:2013-03-29 21:39:27 【问题描述】:

我创建了一个 Makefile.in,在其中从文件中读取内容并将其传递给 CFLAGS。调用 ./configure ... Makefile 将生成,一切正常。

Makefile.in: 
... 
MY_REVISION_FILE=my-revision.txt 
MY_REVISION=$(shell cat $(top_srcdir)/$(MY_REVISION_FILE)) 
AM_CFLAGS = -I$(EXTRAS_INCLUDE_DIR) -I$(top_srcdir) -DMY_REVISION=$(MY_REVISION) 
... 

一旦我将 Makefile.in 代码移动到 Makefile.am 以允许自动生成 Makefile.in,就会出现问题。那里调用 autoreconf -i --force 停止并出现以下错误:

server/Makefile.am:9: cat $(top_srcdir: non-POSIX variable name 
server/Makefile.am:9: (probably a GNU make extension) 
autoreconf: automake failed with exit status: 1 

这个问题已经困扰我很久了。我到处搜索,但没有找到任何可以帮助我找到解决方案的东西。简而言之,我唯一需要的是一种获取未解释文本的方法,例如从 Makefile.am 复制到 Makefile.in 的“$(shell cat $(top_srcdir)/$(MY_REVISION_FILE))”

有什么想法吗?

谢谢, 奥利弗

【问题讨论】:

【参考方案1】:

正如它所说,问题是你在Makefile.am 中使用了 GNUism,而它只是为了包含可移植的 Makefile 代码。

要么重写您的代码,使其可移植(您应该使用AM_CPPFLAGS,因为您将标志传递给预处理器,而不是编译器):

AM_CPPFLAGS = -I$(EXTRAS_INCLUDE_DIR) -I$(top_srcdir) -DMY_REVISION=`cat $(top_srcdir)/$(MY_REVISION_FILE)`

如果您不想在每次编译时调用cat,您可以在configure.ac 中找到值,然后将AC_SUBST 放入MakefileAC_DEFINE 中,然后将其放入config.h

或者,如果您想成为非便携式 (ಠ_ಠ),您可以将 -Werror 从您的 AM_INIT_AUTOMAKEAUTOMAKE_OPTIONS 中取出,或添加 -Wno-portability

【讨论】:

【参考方案2】:

经过长时间的反复测试,我决定使用 AC_SUBST。 我的解决方案可能不是最干净的,但它对我有用。

在 configure.ac 我添加了以下行 AC_SUBST([DOLLAR_SIGN],[$])

在 Makefile.am 中,我将上一行更改为 MY_REVISION=@DOLLAR_SIGN@(shell cat $(SRC_DIR)/$(MY_REVISION_FILE))

而且它有效。 再次感谢您的帮助。

【讨论】:

这段代码是否在线?如果是这样,我可以建议一些不那么老套的东西。 实际上我删除了 AC_SUBST hack 并将其替换为 -Wno-portability。它只是一种更好的方法。但是,嘿,很高兴知道 AC_SUBST 是如何工作的 ;-)

以上是关于Autoreconf 以“非 POSIX 变量名”停止的主要内容,如果未能解决你的问题,请参考以下文章

`autoreconf` 如何创建 m4/ 文件夹?

autoreconf:未找到命令

autoreconf:需要“configure.ac”或“configure.in”

Unable to locate package autoreconf

autoreconf: command not found

autoreconf: command not found