autotools工具的使用

    近期项目开发中,因文件较多,后来就改用了autotools来构建整个工程,免去手写Makefile的麻烦,在此记录一下autotools工具的使用。
linux

    autotools是一系列工具,它包含了autoscan, aclocal, autoheader, automake, autoconf这些工具。使用流程以下:
shell

    上述图片是从https://www.ibm.com/developerworks/cn/linux/l-makefile/ 截取的,图片已经把流程说的很清楚了,本身就懒得去画了。工具

    使用autotools工具来构建整个工程,最终的目的是可让咱们在编译代码的时候,能够很方便的执行以下的步骤便可:code

./configure 
make && sudo make install

    在实际的项目构建过程当中,须要咱们编写的就是Makefile.am文件,而后就是对configure.scan文件进行修改。其余的步骤只须要执行相应的命令便可。对象

    1. 修改configure.scan文件:递归

    1) 修改AC_INIT宏
图片

AC_INIT([FULL-PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS])

    把上述的宏中的内容按照本身的项目须要修改便可,如:
开发

AC_INIT(hello, 0.1, wenhaoye@126.com)

    2) 增长AM_INIT_AUTOMAKE宏, 此宏是给automake工具使用的get

AM_INIT_AUTOMAKE(hello, 0.1)

    2.  把configure.scan文件重命名为configure.in编译

    3. 编写Makefile.am文件。咱们要在这个文件中说明咱们须要编译的目标对象,以及目标对象的依赖和编译连接参数。能够认为这个文件上面须要编写的东西,大部分也是咱们要在Makefile中定义的。

    先以一个最简单的hello工程来讲明,hello工程的目录结构以下:

hello
    -- src
        -- hello.c

    首先在src目录中添加Makefile.am文件,内容以下:

bin_PROGRAMS=hello
hello_SOURCES=hello.c

    而后在项目的顶层目录下创建Makefile.am,即在hello目录下,内容以下:

AUTOMAKE_OPTIONS=foreign
SUBDIRS=src

    

    1) bin_PROGRAMS: 定义咱们须要生成的可执行目标,能够有多个,用空格分开。

    2) xxx_SOURCES: 定义要生成xxx目标须要的源文件,有多个源文件时,用空格分开。

    3) SUBDIRS: 定义项目子模块的目录,若是有多个子目录,用空格分开。表示在处理本目录前,要递归处理哪些子目录。

    4) AUTOMAKE_OPTIONS: 这个而是automake的选项,在执行automake时,它会去检测目录下是否存在标准gnu软件包中应具有的各类文件,如AUTHORS, README, NEWS, ChangeLog等文件。在此我将其设置为foreign,automake会改用通常软件包的标准来检查。默认就是按照标准gnu软件包检查。

    在Makefile中,咱们能够经过修改CFLAGS, LDFLAGS变量来配置编译与连接选项,那么在Makefile,am中,也是能够配置的,好比咱们上述的hello目标在编译的时候须要定义DEBUG宏,在连接的时候须要连接pthread库,能够这样子修改src/Makefile.am文件:

bin_PROGRAMS=hello
hello_SOURCES=hello.c
hello_CFLAGS= -DDEBUG
hello_LDFLAGS= -lpthread

    若是咱们须要把代码编译成库文件,在Makefile.am文件中定义以下:

lib_LTLIBRARIES=libutils.la
libutils_la_SOURCES= $(libutils_sources)
libutils_la_CFLAGS=-Wall -DDEBUG
libutils_la_LDFLAGS=-lpthread -lrt
libutils_HEADERS=$(libutils_inc)
libutilsdir=$(includedir)/libutils

    libutils使咱们要编译的库,其中la表示同时生成动态库与静态库,a则表示只生成静态库。

    后面就是分别制定要生成libutils.la目标,依赖的源文件,编译与连接选项,以及须要安装的头文件

    libutils_HEADERS: 表示须要安装的头文件

    xxdir: 表示头文件被安装的路径

    此外,还须要修改configure.in文件,增长AC_PROG_LIBTOOL,用来检查libtool脚本,由于要使用libtool工具来制做、安装库。


    Makefile.am文件还有以下可用的全局变量:

    1) INCLUDES: 编译时须要用到的头文件,

    2) LDFLAGS: 连接时须要用到的库文件选项标志

    3) LDADD: 连接时须要用到的库


下面把autotools使用的一些步骤进行说明:

  1. 若是咱们须要配置头文件的模块config.h.in文件,则须要在aclocal命令完成后,使用autoheader来生成;

  2. 若是咱们须要libtool来制做库文件,则须要在autoconf以前执行libtoolize --force --copy,生成libtool所须要的文件。这个命令主要功能是生成ltmain.sh,而ltmain,sh是用来产生libtool脚本的。

  3. 执行automake生成Makefile.in文件时,须要automake -a, 这样子能够创建须要的脚本。

  4. 在执行configure脚本时,能够经过--disable-static配置不生成静态库,或者--disable-shared配置不生成动态库。

  5. 最后咱们能够make checkdist 或者make dist来生成一个发布软件包。

相关文章
相关标签/搜索