Autoconf学习笔记

这几天看了下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设为@MPICC@即可

 ===========================================================================

如果希望将文件安装到自定义目录中,需要在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])

  

posted @ 2013-07-03 11:18  D3猎人  阅读(922)  评论(0编辑  收藏  举报