近期项目开发中,因文件较多,后来就改用了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使用的一些步骤进行说明:
若是咱们须要配置头文件的模块config.h.in文件,则须要在aclocal命令完成后,使用autoheader来生成;
若是咱们须要libtool来制做库文件,则须要在autoconf以前执行libtoolize --force --copy,生成libtool所须要的文件。这个命令主要功能是生成ltmain.sh,而ltmain,sh是用来产生libtool脚本的。
执行automake生成Makefile.in文件时,须要automake -a, 这样子能够创建须要的脚本。
在执行configure脚本时,能够经过--disable-static配置不生成静态库,或者--disable-shared配置不生成动态库。
最后咱们能够make checkdist 或者make dist来生成一个发布软件包。