【发布时间】:2014-04-19 12:54:18
【问题描述】:
给定以下 autoconf sn-p:
if test x"$rsync_cv_HAVE_GETADDR_DEFINES" = x"yes" -a x"$ac_cv_type_struct_addrinfo" = x"yes"; then
# Tru64 UNIX has getaddrinfo() but has it renamed in libc as
# something else so we must include <netdb.h> to get the
# redefinition.
AC_CHECK_FUNCS(getaddrinfo, ,
[AC_MSG_CHECKING([for getaddrinfo by including <netdb.h>])
AC_TRY_LINK([#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>],[getaddrinfo(NULL, NULL, NULL, NULL);],
[AC_MSG_RESULT([yes])
AC_DEFINE(HAVE_GETADDRINFO, 1,
[Define to 1 if you have the "getaddrinfo" function and required types.])],
[AC_MSG_RESULT([no])
AC_LIBOBJ([getaddrinfo])])])
else
AC_LIBOBJ([getaddrinfo])
fi
在该项目中运行autoconf 或autoreconf -fi 时,出现错误:
configure.ac:529: error: possibly undefined macro: AC_LIBOBJ
它指向第一个出现的AC_LIBOBJ。
改为运行以下序列:
aclocal
autoreconf
问题在于,在这个特定的项目中,配置脚本应该命名为 configure.sh(并使用包装器调用),所以我必须改用这个序列:
autoconf -o configure.sh
autoreconf
总是会产生上述错误。
这是autoconf-2.69 加上我设置了以下(相关)选项:
AM_INIT_AUTOMAKE([subdir-objects tar-ustar foreign])
AC_CONFIG_LIBOBJ_DIR([lib])
我很可能会在未来某个时候将整个检测替换为 gnulib 中包含的检测,但目前我希望保持原样。
【问题讨论】:
-
为什么要命名为.sh?这是任意且具有误导性的,因为
configure.ac不是有效的shell 脚本。问题是你告诉 autoconf 你错命名的 configure.ac 是什么,但没有告诉 aclocal 相同的信息。 -
不应将 configure.ac 命名为 configure.sh,但结果是:我想要/需要 configure.sh 脚本而不是配置脚本。 autoconf 的结果(配置脚本本身)是一个有效的 shell 脚本。但正如我所写,问题开始得更早,例如在运行
autoreconf -fi时。 -
对不起,我看错了你的描述。为什么不能手动调用aclocal/autoconf/automake?我相信你必须用“-o”告诉autoconf输出的明确名称,因为automake会跟踪它的依赖关系(configure.ac)并在需要时重新生成它。你不能简单地让
configure.sh调用configure吗? -
好的,我更新了描述。我的问题的重点是:我想知道为什么会发生这个错误。即使在产生该错误之前将 AC_LIBOBJ([something]) 放在单独的行上,我也不明白为什么。
标签: autoconf