最近在因为修改了strongswan的某些源码,需要重新编译。像strongswan这样的开源项目,一般都使用autotools来自动生成Makefile。以前只接触过简单Makefile的编写,因此初学autotools觉得有点复杂。
autotools包括autoscan、autoconf、automake、aclocal、autoheader等,流程图如下:
由于strongswan的发布版中中,已经写好了configure.in文件,因此autoscan的步骤可以省略。我在修改了源码里的Make.am后,就可以使用以下步骤更新Makefile:
1、aclocal
2、autoconf
3、automake
4、./configure (至此,生成了新的configure文件)
5、make
6、make install
步骤虽如此,但是过程中遇到了不少问题。
首先是各个工具的版本问题,使用系统自默认版本的autoconf、automake后,会发现版本过低,提示出错。最后发现可以在configure文件中找到autoconf版本提示(2.67),在Makefile中找到automake的版本提示(1.11.1)。
其次是gnu m4的版本过低问题(autoconf需要gnu m4提供某些宏的支持),需要升级m4,但找不到关于m4的版本提示,我这里把它升级为一个相对高的版本1.4.13。
再次是libtool,同样是版本问题,把它升级为最新版本2.4。
最后是pkg-config,在autoconf的时候会出错,把它升级为0.25版本。但是发现升级后,仍然出错,提示如下:
configure:15885:error: possibly undefined macro: AS_MESSAGE_LOG_FDdnl
在网上发现这是autoconf与pkg-config 0.25版本的冲突问题,解决办法如下:
用locate pkg.m4找到pkg.m4文件,在pkg.m4文件中搜索"Package requirements",再找到它之后的第一个"dnl",把它替换成"[]dnl"即可。(lists.gnu.org/archive/html/autoconf/2010-07/msg00031.html)
以上只是在别人已经写好configure.in和Makefile.am的情况下更新Makefile,至于configure.in的生成和Makefile.am的编写还没涉及到,以后再写吧。
后记:本来以为./configure执行成功了就万事大吉了,结果还是不行。执行make时出错,提示can not stat deps/*.Tpo之类的错误,大概是找不到库的问题。后来怀疑是libtool的版本问题,于是换了2.2.8版本,结果提示:libtool: version mismatch error.This is libtool 2.2.26b Debian-2.2.6b-2ubuntul,but the definition of this LT_INIT comes from libtool 2.2.8。终于从这条信息中找到libtool的版本信息了,于是果断装了libtool 2.2.6版本,问题解决。
再后记:在解决完所有问题以后,重新aclocal;autoconf;发现会再次出现possibly undefined macro: AC_LIB_PREFIX;possibly undefind macro:AS_MESSAGE_LOG_FDdnl。证明网上的解决办法并不可靠,经过实验,发现执行make clean之后,在重新执行aclocal;autoconf;automake --add-missing;./configure;make;make install就能顺利通过了。
这个配置花了我整天一天的时间,摸索的过程很考验毅力,也让我对autotools有了一点浅显的认识。