GNU autotool学习备忘

autoconf和automake是啥?这 要从类Unix系统的程序编译说起。一般一个真正的工程肯定不只一个文件,而多个文件的编译是件很麻烦的事情(最简单的就是用gcc或者g 后面接着多个文件),再加上要推出跨平台的(一般只是跨不同的类Unix平台),还有啥包依赖啊什么的,很麻烦嗯。于是就有了一个工具叫 make,它接收一个名为Makefile的文件作为参数,自动地进行编译,还可以在Makefile里设置接受不同的选项,然后人们就可以 make install、make all什么的了。
然而不同系统的编译要用不同的编译参数,但是 开源软件不可能带多个Makefile,而且又难写,怎么办?于是有了configure脚本,它自动检测系统,并接受一个 Makefile.in文件,根据它来生成Makefile。
然而confiure脚本和 Makefile.in还是很难写,至少我不会写,而且看得也眼花。于是GNU推出了autoconf和automake,用于生成 configure脚本和Makefile.in文件。其中autoconf是用来生成configure的,automake是用来生成 Makefile.in的。



GNU autotools主要包括三个工具:autoconf、automake、libtool,还有很多辅助工具,包括:autoheader、 aclocal、autoscan:

  • autoscan:用于检测源代码文件并生成configure.scan
  • autoconf:根据configure.in(或者configure.ac)生成Makefile.in
  • automake:configure.in和Makefile.am生成Makefile.in

使用autotools的详细编译流程:

 

主要步骤:  (1):在源目录下运行autoscan生成configure.scan,重命名为configure.in  (2):编辑configure.in    
在AC_INIT后添加:AM_INIT_AUTOMAKE([program名称], [Version])

如果要编译静态库在 #Checks for libraries后添加:AC_PROG_RANLIB
如果要编译动态库在 #Checks for libraries后添加:AC_PROG_LIBTOOL

然后在AC_OUTPUT前添加(或者修改为)AC_CONFIG_FILES([Makefile])

(3):运行aclocal生成aclocal.m4
(4):运行autoconf生成configure脚本
(5):运行autoheader生成config.h.in文件
(6):创建并编辑Makefile.am:

AUTOMAKE_OPTIONS = foreign  #foreign, gnu, gnits,默认等级为gnu(会检测NEWS、README、AUTHORS和Change log文件),foreign只检测必须的文件。
bin_PROGRAMS = main(可执行文件安装到bin下,或者noinst_PROGRAMS = (不安装))
如果是lib则noinst_LIBRARIES = xxx.a
main_SOURCES = xxx.c
如果是lib则lib_xxx_a_SOURCES

如果引用其他头文件则:
INCLUDE = -I path_2_inlcude

(7):运行automake --add-missing生成makefile.in
(8):运行configure脚本生成Makefile
(9):运行make,生成可执行文件或静动态lib

编辑动态lib,如果在执行automake到configure.in中的AC_PROG_LIBTOOL时发生错误 build/ltmain.sh找不到,则可用如下命令解决:
$libtoolize --automake --copy --debug --force

其他有关Makefile.am和configure.in的内容以后在更新吧,不爱写了。

参考:  http://www.gnu.org/software/autoconf/manual/index.html  http://en.wikipedia.org/wiki/GNU_build_system  
posted @ 2014-09-24 11:22  夯爹  阅读(499)  评论(0编辑  收藏  举报