从版本1中升级

优质
小牛编辑
131浏览
2023-12-01

Autoconf第2版基本上与第1版是向后兼容的。但是,它给出了作某些事的更好方法,并且不再支持版本1中一些丑陋的东西。 因此,根据你的'configure.in'文件的复杂性,你可能必须作一些手工的工作以升级到版本2。本章指出了一些在 升级的时候需要注意的问题。还

有,可能你的configure脚本可以从版本2中的新特征中获得一些好处 在Autoconf发布包中的'NEWS'文件概括了改变的部分。

首先,确认你安装了1.1版或者更高版本的GNU m4,最好是1.3版或者更高版本。在1.1版之前的版本含有bug 以至于它不能与Autoconf版本2一同工作。版本1.3及其后的版本比早期的版本更快一些,这是因为1.3版的GNU m4 对转换(diversions)进行了更有效的实现并且能够在可以快速读回的文件中冻结(freeze)它的内部状态。

改变了的文件名

如果你随Autoconf一起安装了'aclocal.m4'(相对于特定软件包的源代码目录中的'aclocal.m4'), 你必须把它重命名为'acsite.m4'。 参见用autoconf创建configure。

如果你与你的软件包一同发布'install.sh',就把它重命名为'install-sh'以便make的内置 规则不会无意地从该文件创建一个称为'install'的文件。AC—PROG—INSTALL将寻找这两个名字的脚本, 但最好使用新名字。

如果你使用'config.h.top'或者'config.h.bot',你仍然可以使用它们,但如果你把它们混合到 'acconfig.h'之中,将减少你的麻烦。 参见 用 autoheader 创建 'config.h.in'。

改变了的Makefile

在你的'Makefile.in'文件中添加'@CFLAGS@'、'@CPPFLAGS@'和'@LDFLAGS@', 以便它们可以在configure运行的时候利用环境中的这些变鼠的值。这样做不是必须的,但对用户来说比较方便。

对于AC—OUTPUT的每个非'Makefile'的输入文件,你还应该添加一条含有 '@configure—input@'的注释, 以便输出文件将会包含一条注释以说明它们是由configure生成的。 自动地为每种入们在AC—OUTPUT中输出的文件选择正确的注释语法需要做太多的工作。

把'config.log'和'config.cache'添加到你要在distclean目标中删除的文件的列表中。如果你的'Makefile.in'如下:

prefix = /usr/local exec—prefix = ${prefix}

你必须把它修改成:

prefix = @prefix@ exec—prefix = @exec—prefix@

不使用'@'字符的老式的对这些变鼠的替换行为已经被删除了。

改变了的宏

在Autoconf第2版中,重新命名了许多宏。你仍然可以使用旧名字,但新名字更清晰,并且易于找到相关文档。 关于为旧宏名提供新宏名的列表,参见 陈旧的宏名 。 用autoupdate程序转换你的'configure.in'以使用新的宏名。 参见 用 autoupdate 更新 configure。

有些宏已经被能够更好地完成工作的类似宏所代替,但在调用上并不兼容。 如果你在运行autoconf时受到了关于调用过时宏的警告,你可以安全地忽略它们,但如果你按照打印的建议 替换过时的宏,你的configure脚本通常可以工作的更好。特别地,报告测试结果的机制已经改变了。 如果你使用了echo或者AC—VERBOSE(可能是通过AC—COMPILE—CHECK), 如果你改

用AC—MSG—CHECKING和AC—MSG—RESULT,你的configure脚本的输出将 更加美观。参见 打印消息 。这些宏能够更好地与缓存变鼠协同

工作。 参见 缓存结果 。

用autoupdate更新configure

程序autoupdate把使用Autoconf旧宏名的'configure.in'文件更新为使用当前宏名的文件。 在Autoconf第2版中,大部分宏被重命名以使用一个更统一、更具有描述性的命名机制。关于对新的命名机制的描述, 参见 宏名 。虽然旧宏名仍然可以工作(关于旧宏名和对应的新宏名的列表, 参见 陈旧的宏名 ),如果你更新它们以使用新的宏名,你可以使你的 'configure.in'文件更加可读并且易于使用当前的Autoconf文档。

如果没有给出参数,autoupdate就更新'configure.in',并且通过添加后缀'~' (或者在设置了环境变鼠SIMPLE—BACKUP—SUFFIX的时候,使用该环境变鼠的值)以备份原始版本。 如果你带参数调用autoupdate,它就读入那个文件而不是读入'configure.in',并且把 更新的文件输出到标准输出。

autoupdate接受下列选项:--help-h 打印命令行选项的概述并且退出。--macrodir=dir-m dir

在目录dir中,而不是在缺省安装目录中寻找Autoconf宏文件。 你还可以把环境变鼠AC—MACRODIR设置成一个目录 本选项覆盖该环境变鼠。

--version

打印autoupdate的版本号并且退出。

改变了的结果

如果你通过检验shell变鼠DEFS来检验以前测试的结果,你需要把这些检验替换为对那些测试的缓存变鼠的检查。 在configure运行的时候,DEFS不再存在 它仅仅在生成输出文件的时候才被创建。这种与第1版 的不同是因为正确地对变鼠实行引用(quoting)实在太麻烦而且在每次调用AC—DEFINE都要实行引用是低效的。 参见 缓存变鼠名 。

例如,下面是为Autoconf第1版编写的'configure.in'的片断:

AC—HAVE—FUNCS(syslog)case "$DEFS" in*-DHAVE—SYSLOG*) ;;*) # syslog is not in the default libraries. See if it's in some other. saved—LIBS="$LIBS"for lib in bsd socket inet; do AC—CHECKING(for syslog in -l$lib) LIBS="$saved—LIBS -l$lib" AC—HAVE—FUNCS(syslog)case "$DEFS" in*-DHAVE—SYSLOG*) break ;;*) ;;esac LIBS="$saved—LIBS"done ;; esac

这里是为版本2编写的方式:

AC—CHECK—FUNCS(syslog)if test $ac—cv—func—syslog = no; then# syslog is not in the default libraries. See if it's in some other. for lib in bsd socket inet; doAC—CHECK—LIB($lib, syslog, [AC—DEFINE(HAVE—SYSLOG)LIBS="$LIBS $lib"; break]) donefi

如果你通过在引号的后边添加反斜线以处理AC—DEFINE—UNQUOTED中的bug,你需要删除它们。 它现在以可以预期的方式工作,并且不需要特别地处理引号(处理反斜线)。 参见 设定输出变鼠 。

所有由Autoconf宏设置的布尔shell变鼠现在用'yes'来表示真值。虽然为了向后兼容,有些宏使用空字符串 表示假,大部分宏使用'no'来表示假。如果你依赖于shell变鼠用诸如1或者't'来表示真, 你就需要改变你的测试。

改变了的宏的编写

在定义你自己的宏时,你现在应该使用AC—DEFUN而不是define。 AC—DEFUN自动调用AC—PROVIDE并且确保通过AC—REQUIRE调用该宏不会被其他宏所打断,从而防止在屏募上出现嵌套的'checking...'消息。缝续按照老办法行事没有实际上的伤害, 但它缺乏便利和吸引力。参见 宏定义 。

你可能把与Autoconf一同发行的宏作为如何解决问题的指南。看看它们的新版本将是一个好主意,因为风格已经有些改进并且 它们利用了一些新的特征。

如果你利用未公开的(undocumented)Autoconf内部元素(宏、变鼠、变换(diversions))作了微妙的工作,就要检查 你是否需要修改些什么以适应已经发生的变化。可能你甚至能够用版本2中公开(officially)支持的技术来代替你的拼装(kludging)。 但也可能不能。

为了加快你自行编写的特征测试,为它们添加缓存。看看你所有的测试是否足够一般化,从而具有足够的用途以把它们 苤装到你可以共享的宏中去。