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
放入Makefile
或AC_DEFINE
中,然后将其放入config.h
。
或者,如果您想成为非便携式 (ಠ_ಠ),您可以将 -Werror
从您的 AM_INIT_AUTOMAKE
或 AUTOMAKE_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:需要“configure.ac”或“configure.in”