Autotools 的机理和解决过程
为什么出错以及为什么这么做就 OK 了呢?如果要说清楚,要了解 autoconf, automake, aclocal 等,即 autotools 的机理。
可以参考一篇名为《autotools系列工具—-自动生成Makefile》的文章。
下面是解决过程,其中饶了不少弯路
* 在遇到这个问题时,首先想到的是生成新的 configure.ac 文件,取代示例中的 configure.ac 文件
$ autoscan $ mv configure.scan configure.ac |
* 再执行 aclocal ,不再死锁,但是也没有任何新文件生成
$ aclocal |
* 比较新旧的 configure.ac ,发现当注释掉 AM_PATH_CHECK() 之后,便不再死锁
* AM_PATH_CHECK 是什么呢?我们从 check 软件包的部署文件中,我们看到这个文件:
/usr/share/aclocal/check.m4 |
* 我们打开这个文件(/usr/share/aclocal/check.m4),看到其中只包含了一个宏 AM_PATH_CHECK 的宏定义。而这个宏被标记为过时,建议使用 PKG_CHECK_MODULES 宏代替。看来在 autoconf 版本升级后,已经完全不能使用旧的宏语法了。
AC_DEFUN([AM_PATH_CHECK], [ AC_MSG_WARN([AM_PATH_CHECK() is deprecated]) AC_MSG_WARN([[use PKG_CHECK_MODULES([CHECK], [check >= 0.9.4]) instead]]) AC_ARG_WITH([check], [ --with-check=PATH prefix where check is installed [default=auto]]) |
* 将 AM_PATH_CHECK 的宏用 PKG_CHECK_MODULES 宏代替。diff如下:
--- a/configure.ac +++ b/configure.ac @@ -23,9 +23,7 @@ AC_PROG_LIBTOOL # This macro is defined in check.m4 and tests if check.h and # libcheck.a are installed in your system. It sets CHECK_CFLAGS and # CHECK_LIBS accordingly. -# AM_PATH_CHECK([MINIMUM-VERSION, -# [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]]) -AM_PATH_CHECK() +PKG_CHECK_MODULES([CHECK], [check >= 0.9.4]) |