欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Autoconf学习笔记

程序员文章站 2022-07-14 13:02:36
...

这几天看了下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])

  

上一篇: Attribute

下一篇: Attribute