• 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])
    

      

  • 相关阅读:
    (转)Android Studio解决unspecified on project app resolves to an APK archive which is not supported
    OpenGL 学习总结
    关于tap设备
    写把proto函数搞清楚
    qemu中是怎么模拟的新的设备
    kvm搭建完成了,那么问题来了,到底是什么原理
    kvm竟然抓不到kvm的tracepoint
    安装KVM
    试着理解下kvm
    网络namespace
  • 原文地址:https://www.cnblogs.com/D3Hunter/p/3169090.html
Copyright © 2020-2023  润新知