• autotools automake autoconf libtool 笔记


    默认安装路径为:$(prefix) = /usr/local,可以通过./configure --prefix=<new_path>的方法来覆盖。

    其它的预定义目录还包括:bindir = $(prefix)/bin, libdir = $(prefix)/lib, datadir = $(prefix)/share, sysconfdir = $(prefix)/etc等等。

    configure.ac的编写

    最简单的configure.ac必须包含的AC_INIT (package, version, [bug-report], [tarname])、AC_CONFIG_FILES([files])、AC_OUTPUT三个宏,有用到automake的话,则必须添加 AM_INIT_AUTOMAKE和AC_PROG_CC宏。automake一般是要用到的,因为生成的configure会根据 Makefile.in生成Makefile文件,而Makefile.in可以有automake生成。


    Makefile.am就是一系列变量的定义。Makefile的语法:变量名 = 变量值

    Makefile.am的编写

    1.    需要生成Makefile的目录下都要编写一个Makefile.am

    2.    顶层(项目)目录的Makefile.am,可能会包含AUTOMAKE_OPTIONS = foreign 1.4这样一句。

    3.    如果当前目录有其它子目录,子目录中也要生成makefile,则要包含
    SUBDIRS = 子目录…,例如:SUBDIRS = src doc

    4.    对于不需要安装,但是需要一起打包发布的文件,则在当前目录的Makefile.am中可以添加一句:EXTRA_DIST = 发布的文件,例如:EXTRA_DIST = purge.conf purge

    5.    Makefile.am中的变量名,有统一的命名机制,一般是:安装目录_主变量。

    6.    安装目录。
    有些标准的安装目录可以直接使用。例:bin_PROGRAMS = hello,表示hello将被安装在$(prefix)/bin目录下。但是这些标准安装目录可能不够使用,因此我们可以自己定义所需要的安装目录。安装目录一般是省略’dir’的,例如:
    htmldir = $(prefix)/html
    html_DATA = automake.html
    就表示automake.html将被安装在$(prefix)/html目录下。这里DATA是主变量,稍后说明。
    对于不安装的文件,变量名的目录变量可写为noinst。

    7.    主变量。常见的主变量有:`PROGRAMS'、`LIBRARIES'、 `LISP'、`SCRIPTS'、`DATA'、 `HEADERS'、`MANS'和`TEXINFOS'。这些主变量说明了生成的对象类型。例如,主变量PROGRAMS 保存了需要被编译和连接的程序的列表。

    8.    Makefile.am的例子。
    目录结构:
      purge-1.2
       |―·doc
       |     |-purge.conf
       |     |-Makefile.am
       |-·src
       |     |-purge.h
       |     |-thread.h
       |     |-…
       |     |-list.h
       |     |-debug.c
       |     |-fun.c  
       |     |-list.c
       |     |-main.c
       |     |-map.c
       |     |-parseconf.c
       |     |-purge.c
       |     |-thread.c
       |     |-Makefile.am
       |-hello-0.1.0.spec
       |-configure.ac
       |-Makefile.am
    各目录下的Makefile.am文件可以编写如下:
    purge-1.2目录:vi Makefile.am
        AUTOMAKE_OPTIONS = foreign 1.4
        SUBDIRS = src doc
    doc目录:vi Makefile.am
        EXTRA_DIST = purge.conf
    src目录:vi Makefile.am
        bin_PROGRAMS = purge
        purge_SOURCES = main.c purge.c fun.c list.c \
                         parseconf.c thread.c debug.c map.c
        purge_LDADD = -lpthread
    说明:

    a)      在Makefile.am也可以定义变量如:
    ALL_SOURCE = main.c purge.c fun.c list.c parseconf.c thread.c debug.c map.c
    purge_SOURCES = $( ALL_SOURCE)

    b)      名字中除了字母、数字和下划线之外的所有字符都将用下划线代替。例如,如果你的程序被命名为sniff-glue,那么派生出的变量名将是 sniff_glue_SOURCES,而不是sniff-glue_SOURCES;库liblob.a的’_SOURCES’变量对应的变量名 为’liblob_a_SOURCES’,而不是’liblob.a_SOURCES’。

    9.    注:共享库必须被安装,所以不允许使用 `noinst_LTLIBRARIES'和`check_LTLIBRARIES'。

    10.  Makefile.am中configure输出变量的使用。
    在configure.ac中通过宏AC_SUBST引出的变量在Makefile.am中就能被使用到。
    例子:
    在configure.ac中定义如下:
    if test -z "$CACHE_ICP_PORT"; then
           CACHE_ICP_PORT="3130"
    fi
    AC_SUBST(CACHE_ICP_PORT)
    在Makefile.am中通过@CACHE_ICP_PORT@格式就能引用变量CACHE_ICP_PORT。
    例子:DEFAULT_ICP_PORT        = @CACHE_ICP_PORT@

    使用automake根据Makefile.am和aclocal.m4生成Makefile.in文件,在这里使用选项“—adding- missing”可以让automake自动添加有一些必需的脚本文件,如depcomp,install-sh, missing等。


    Makefile文件

    自动生成的Makefile文件常用几个命令如下:
    make all - 生成程序、库、文档等,等同于make,根据Makefile编译原始码,连接,生成目标文件,可执行文件。
    make install - 安装 
    make install-strip -安装,去除调试符号 
    make uninstall - 卸载 
    make clean - 清除临时文件,make all 的反过程,即清除上次的make命令所产生的object文件(后缀为“.o”的文件)及可执行文件。

    make dist - 创建发布包:PACKAGE-VERSION.tar.gz.


    在 configure.in 中,有一些被 autoconf 宏预先定义的变量,重要的有如下几个:

        bindir:安装可执行文件的目录。
    
        includedir:C 头文件目录。
    
        infodir:info 页安装目录。
    
        mandir:安装手册页的目录。
    
        sbindir:为管理员运行该该程序提供的安装路径。
    
        srcdir:为 Makefile 提供的源代码路径。
    
        top_srcdir:源代码的最上层目录。
    
        LIBS:给连接程序的 -l 选项
    
        LDFLAGS:给连接程序的 stripping(-s)和其他一些选项。
    
        DEFS:给 C 编译器的 -D 选项。
    
        CFLAGS:给 C 编译器的 debug 和优化选项。当调用了 AC_PROG_CC 才有效。
    
        CPPFLAGS:头文件搜索路径(-I)和给 C 预处理器和编译器的其他选项。
    
        CXXFLAGS:给 C++ 编译器的 debug 和优化选项。当调用了 AC_PROG_CXX 才有效。
  • 相关阅读:
    EF 配置(SqlServer,Mysql)
    mysql sql优化
    非root用户安装、配置mysql
    使用spring jdbc遇到的一个性能问题
    mac 修改 vim 配色
    logstash 监控日志文件时应对日志文件名改变的原理
    java Atomic compareAndSet部分原理分析
    实现进程单例的一些想法
    java String、String.concat和StringBuilder性能对比
    Elasticsearch 动态修改replica配置、增删replica
  • 原文地址:https://www.cnblogs.com/welkinwalker/p/2091506.html
Copyright © 2020-2023  润新知