autoconf学习笔记
configure.in/configure.ac是各种宏的集合,主要作用是编译流程的整合
具体文件生成的配置,其实是在Makefile.am里进行的,然后经过automake处理Makefile.am生成发布用的Makefile.in。
在执行configure时,将使用Makefile.in里的参数生成Makefile。
注:目前没看到autoconf和automake有自动列举目录中所有文件的能力。这点不及CMake方便。不过,可以通过脚本生成Makefile.am的方式来自动引入源文件。但Cmake没有 autoconf的 make distclean清理中间文件的能力。
Makefile.am中是使用 组合字符串的方式进行变量定义。
特定变量在后面,前面是一个指示或者已定义的标示。
比如 特定变量有 PROGRAMS LIBRARIES
inst_PROGRAMS=program_name 表明需要生成要安装的可执行文件program_name
noinst_PROGRAMS=program_name 则是不用安装的。
然后用 program_name_SOURCES= 声明所用到的源文件,
program_name_LDADD= 声明用到的库文件。
其中PROGRAMS=行所的程序文件名如果包含./等字符,在后续的变量声明中要替换成_下划线。
首先使用 autoscan 自动生成初始化的configure.scan
然后改名为configure.ac根据需要修改其中内容。
使用宏AM_INIT_AUTOMAKE来引入automake。
注意,如果要使用子目录的话,需要在configure.ac的最后AC_OUTPUT中声明生成子目录的文件,比如Makefile,Makefile.in之类。AC_OUTPUT(Makefile src/Makefile test/Makefile)
否则,即使在Makefile.am中声明了SUBDIRS也会因为缺少子目录中的Makefie而不能工作。因为automake负责生成Makefile.in,而configure负责生成Makefile.
附一个更新用脚本
#/bin/sh
set -x #enable trace
if [ -e Makefile ];then make distclean; fi
aclocal
#autoheader
automake --foreign --add-missing
autoconf
configure.in/configure.ac是各种宏的集合,主要作用是编译流程的整合
具体文件生成的配置,其实是在Makefile.am里进行的,然后经过automake处理Makefile.am生成发布用的Makefile.in。
在执行configure时,将使用Makefile.in里的参数生成Makefile。
注:目前没看到autoconf和automake有自动列举目录中所有文件的能力。这点不及CMake方便。不过,可以通过脚本生成Makefile.am的方式来自动引入源文件。但Cmake没有 autoconf的 make distclean清理中间文件的能力。
Makefile.am中是使用 组合字符串的方式进行变量定义。
特定变量在后面,前面是一个指示或者已定义的标示。
比如 特定变量有 PROGRAMS LIBRARIES
inst_PROGRAMS=program_name 表明需要生成要安装的可执行文件program_name
noinst_PROGRAMS=program_name 则是不用安装的。
然后用 program_name_SOURCES= 声明所用到的源文件,
program_name_LDADD= 声明用到的库文件。
其中PROGRAMS=行所的程序文件名如果包含./等字符,在后续的变量声明中要替换成_下划线。
首先使用 autoscan 自动生成初始化的configure.scan
然后改名为configure.ac根据需要修改其中内容。
使用宏AM_INIT_AUTOMAKE来引入automake。
注意,如果要使用子目录的话,需要在configure.ac的最后AC_OUTPUT中声明生成子目录的文件,比如Makefile,Makefile.in之类。AC_OUTPUT(Makefile src/Makefile test/Makefile)
否则,即使在Makefile.am中声明了SUBDIRS也会因为缺少子目录中的Makefie而不能工作。因为automake负责生成Makefile.in,而configure负责生成Makefile.
附一个更新用脚本
#/bin/sh
set -x #enable trace
if [ -e Makefile ];then make distclean; fi
aclocal
#autoheader
automake --foreign --add-missing
autoconf