这几天看了下autoconf的使用,写个教程,免得下次再用还得再看一遍文档
- 使用autoscan扫描整个源代码目录,生成configure.scan,改名为configure.ac,这个文件可以作为configure.ac的基础
- 使用ifnames扫描源代码,获取需要在config.h中使用的宏什么的,这个工具只扫描#if #ifdef等宏,其他需要的内容需要在congfigure.ac中单独添加
- 修改configure.ac, 主要改以下部分
添加AM_INIT_AUTOMAKE,生成makefile用 如果需要生产库文件,添加AC_PROG_LIBTOOL 添加必要的AC_CHECK_LIB, AC_CHECK_HEADER, AC_CHECK_FUNCS, autoscan生成的是AC_CHECK_HEADERS, 这个宏会对每个头文件定义HAVE_headfile(全大写),用不着定义的就是用AC_CHECK_HEADER, AC_CHECK_FUNCS也会生成HAVE_func
- 在config.h中定义目录类的宏,使用AC_DEFINE_DIR,如果没有可以使用AC_DEFINE_UNQUOTED,如:
$test_dir = "a/b/c"
AC_DEFINE_UNQUOTED([TEST_DIR], ["$test_dir"], "....."),将会在config.h中生成
#define TEST_DIR "a/b/c"
- 修改AC_OUTPUT,将需要生成的Makefile都添加在这里,使用空格分开
- 在工程目录、每个模块目录及对应上层目录添加Makefile.am,如目录结构为,这需要在:./ ./src ./src/m1 ./src/m2中添加Makefile.am
./
src
m1
m2
doc
man
- Makefile.am,格式如下,以上例说明:
# ./Makefile.am如下 SUBDIRS = src # ./src/Makefile.am如下 SUBDIRS = m1 m2 # 需要是DIST_SUBDIRS的子集 DIST_SUBDIRS = $(SUBDIRS) #./src/m1/Makefile.am 如下,这里m1生成一个库文件 # 这里的变量有前缀规则 lib_LTLIBRARIES = libm1.la #库会被安装到lib目录 libm1_la_SOURCES = a.cpp # 源文件 libm1_la_LIBADD = # 依赖的库 libm1_la_LDFLAGS = -module #标明该库为动态库,且需要被dlopen libm1_la_CPPFLAGS = -I.. # 预处理参数,也可以用INCLUDES,但已被弃用
#./src/m2/Makefile.am , m2生成可执行文件
bin_PROGRAMS = m2 # 安装到bin
m2_SOURCES =
m2_LDADD = # 与生成库的区别,这里不能使用_LIBADD
m2_CPPFLAGS =
- 以上文件生成好后,调用autoreconf, 这时会提示缺一些文件,README什么的自己创建,config.guess和config.sub使用libtoolize生成,其他的使用automake -a 生成缺失的文件,在调用autoreconf
configure.in: required file `./install-sh' not found configure.in: required file `./mkinstalldirs' not found configure.in: required file `./missing' not found Makefile.am: required file `./COPYING' not found Makefile.am: required file `./INSTALL' not found Makefile.am: required file `./NEWS' not found Makefile.am: required file `./README' not found Makefile.am: required file `./AUTHORS' not found Makefile.am: required file `./ChangeLog' not found Makefile.am: required file `./depcomp' not found
- 接下来./configure make make install 就行了
===========================================================================
添加对MPI编译的支持
# 在configure.ac中添加如下: AC_CONFIG_MACRO_DIR([./])# m4宏搜索目录 # for mpi m4_include([./ax_mpi.m4]) # 类似于C中的#include,引入文件 AX_MPI([]) # 用来检测MPI,之后会定义MPICC,在Makefile.am中将CC设为@[email protected]即可
===========================================================================
如果希望将文件安装到自定义目录中,需要在configure.ac中定义该目录
mydir=/a/b/c #官网提供的AC_DEFINE_DIR不定义$2, 在Makefile.am中是不能用的,需要注意 AC_DEFUN([AC_DEFINE_DIR], [ prefix_NONE= exec_prefix_NONE= test "x$prefix" = xNONE && prefix_NONE=yes && prefix=$ac_default_prefix test "x$exec_prefix" = xNONE && exec_prefix_NONE=yes && exec_prefix=$prefix eval ac_define_dir="[$]$2" # [$]$2等同于$$2,在shell中是错的,具体看生产的configure文件 eval ac_define_dir="\"[$]ac_define_dir\"" AC_SUBST($1, "$ac_define_dir") AC_SUBST($2, "$ac_define_dir") AC_DEFINE_UNQUOTED($1, "$ac_define_dir", [$3]) test "$prefix_NONE" && prefix=NONE test "$exec_prefix_NONE" && exec_prefix=NONE ]) AC_DEFINE_DIR(MY_DIR,mydir,[dir])