一直以来在开发中我都是使用自己手工编写的简单Makefile进行代码的编译的,编写一个简单的Makefile通常不太复杂,只需要设置一些编译条件的变量,objs列表,加上几行简单的代码即可。但是这样的makefile在很多情况下会暴露出很大缺点,例如在另一个环境的机器上编译等,很可能需要改写Makefile.
使用autotools生成符合自由软件标准的Makefile,就可以帮助我们解决这个问题。我们可以使用像标准的软件包一样的方式进行编译和安装,形式如下:
./configure
make
make install
下面来总结一下autotools的简单使用:
autotools是一系列的工具包含aclocal,autoscan,autoconf,autoheader,automake
aclocal用于生成aclocalm4,用于帮助autoconf生成configure
autoscan 用于生成一个叫做configure.scan的文件,该文件可以作为configure.in的模板
autoconf 使用aclocalm4和configure.in一起生成configure
autoheader 负责生成config.h.in文件。该工具通常会从“acconfig.h”文件中复制用户附加的符号定义
automake 通过他的配置文件Makefile.am和configure.in生成Makefile.in文件
用户最后调用configure来生成Makefile
具体过程如下:
1、在每个需要生成可执行文件、静态库或动态库的目录中都先加入一个Makefile.am文件,作为automake的配置文件
内容需要如下:
AUTOMAKE_OPTIONS=foreign #foreign/gnu/gnits软件等级foreign表示只检查必须的文件,gnu是默认等级
bin_PROGRAMS= 生成目标名称 #bin_PROGRAMS表示可执行文件,noinst_LIBRARIES表示静态库不需要make install,lib_LTLIBRARIES表示动态库
生成目标名称_SOURCES= 所需的源文件,多个文件用空格分开
2、执行autoscan生成configure.scan,将其重命名为configure.in并对内容进行如下修改:
# -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.
AC_PREREQ(2.59) #这里是autoconf所需的版本
#The next one is modified by sunq
AC_INIT(软件包的全称,版本,[提交bug的邮箱])
# The next one is added by sunq
AM_INIT_AUTOMAKE(软件包的全称,版本)
AC_CONFIG_SRCDIR([需要检查的源文件]) #每个文件写一条
AC_CONFIG_HEADER([需要检查的头文件]) #每个文件写一条
# Checks for programs.
AC_PROG_CC #需要有gcc
AC_PROG_GXX #需要有g++
# Checks for libraries. #检查所需的lib是否走存在
# Checks for header files. #检查所需的头文件是否存在
# Checks for typedefs, structures, and compiler characteristics.
# Checks for library functions.
AC_PROG_LIBTOOL #如果是编译库需要加上这条
AC_CONFIG_FILES([Makefile])
AC_OUTPUT
3、接下来执行aclocal
4、执行autoconf
5、执行automake --add-missing
如果上面的两个配置文件都没写错的话,就可以生成正确的configure和Makefile.in了
6、执行./configure生成Makefile
这样就大功告成