通过之前的学习可以知道,makefile拥有复杂的语法结构,编写与维护都不是很方便于是设计出了专门用来生成Makefile的autotools工具,以减轻制作makefile文件的负担。

  自主软件主要以源码形式发布,着需要在多种系统上重新编译。源代码包安装分为3个步骤,configure、make和make install,在构建过程中涉及到许多文件,制作起来十分复杂,使用autotools工具生成Makefile文件,可以大大方便源码安装包的制作。

1、Autotools的工作原理

  一个autotool项目至少需要一个名为configure的配置脚本和一个名为Makefile.in的makefile模板。项目的每个目录中有一个Makefile.in文件。Autotools项目还使用其他文件,这些文件不是必须的,有的还是自动产生的,如果去查看相关文件内容,会发现它们非常负责,不过这些文件是Autotools通过容易编写的模板文件生成的。

  实际上并不需要Autotools来建立Autotools包,configure是在最基础的Shell上运行的Shell脚本,它检查用户系统获取每个特征,通过模板写出makefile文件。

  configure在每个目录中创建所有文件。这个目录称为创建目录。如果从源码运行他,可以使用./configure,创建目录也是同样的。

  configure在命令行接受几个选项,用于在不同的目录中安装文件。可以通过执行configure --help命令来获得相关帮助,这里给出最常用的选项列表。

  --help:列出所有的变量选项。

  --help host:编译以使其在另一个系统上运行(交叉编译)

  --prefix dir:选择根目录已安装项目路径,默认的是/usr/local

  configure产生几个附加文件:config.log(日志文件,出现问题以获得详细信息)、config.status(一个shell脚本,可以真实的了解当前的配置)、config.h(头文件,从模板config.h.in中产生),不过这些文件并不特别重要。

  由configure产生的makefie文件比较复杂,其定义是由GNU标准所需的所有标准目标,常用的目标列举如下:

make或make all:创建程序
make install:安装程序
make distclean:删除由configure产生的所有文件。

  生成configure过程中各文件之间的关系图

2、Autotools工具

  autotools由autoconf、automake、prel语言环境和M4等组成。它所包含的命令有5个:aclocal(处理本地的宏定义)、autoscan(检查源文件)、autoconf(根据autoscan收集的信息及用户的修改生成配置程序configure)、autoheader(创建配置头文件)、automake(创建Makefile的模板makefile.in)。

  下面为使用apt-get指令安装autoconf

3、Autotools示例

1、准备源代码

  首先编写main.c

#include <stdio.h>

#include "common.h"

int main()

{

	hello_method();

	return 0;

}

  hello.c文件

#include <stdio.h>
#include "common.h"
void hello_method()
{
printf("hello_world!\n");
}

  common.h文件

void hello_method();

2、运行autoscan命令

  切换到项目工作目录,执行autoscan命令扫描工作目录生成configure.scan文件

  生成的configure.scan文件

#                                               -*- Autoconf -*-
# Process this file with autoconf to produce a configure script. AC_PREREQ([2.69])
AC_INIT([FULL-PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS])
AC_CONFIG_SRCDIR([main.c])
AC_CONFIG_HEADERS([config.h]) # Checks for programs.
AC_PROG_CC # Checks for libraries. # Checks for header files. # Checks for typedefs, structures, and compiler characteristics. # Checks for library functions. AC_OUTPUT

   其中都是M4宏命令,这些宏命令的主要内容是检测系统。

3、修改autoscan.scan文件,并重命名为configure.ac

  configure.ac文件是autoconf的配置文件,修改编辑配置文件如下:

#                                               -*- Autoconf -*-
# Process this file with autoconf to produce a configure script. AC_PREREQ([2.69])
AC_INIT([hello], [1.0], [mynoticeable@gmail.com])
AC_CONFIG_SRCDIR([hello.c])
AC_CONFIG_HEADERS([config.h])
AM_INIT_AUTOMAKE
# Checks for programs.
AC_PROG_CC # Checks for libraries. # Checks for header files. # Checks for typedefs, structures, and compiler characteristics. # Checks for library functions.
AC_CONFIG_FILES([Malkefile])
AC_OUTPUT

  这里修改了宏AC_INIT,添加了宏AM_INIT_AUTOMAKE和AC_CONFIG_FILES.

  configure.ac配置文件中的宏的解释如下表

4、执行aclocal命令

  执行aclocal命令,扫描configure.ac文件生成aclocal.m4文件

  

aclocal.m4文件主要处理本地的宏定义。aclocal命令根据已经安装的宏、用户定义宏和acinclude.m4文件中的宏,将configure.ac文件需要的宏集中定义到文件aclocal.m4文件中。

5、执行autoconf命令

  执行autoconf命令生成configure文件。

该命令将configure.ac文件中的宏展开,生成configure脚本。这个过程可能要用到aclocal.m4中定义的宏。

6、执行autoheader命令

  执行autoheader命令生成config.h.in文件。

如果用户需要附加一些符号定义,可以创建acconfig.h文件,autoheader会自动从acconfig.h文件中复制符号定义。

7、创建Makefile.am文件

  在项目目录下创建要给Makefile.am文件,供automake工具根据configure.in中的参数将Makefile.am转换称Makefile.in文件。Makefile文件定义了一些生成Makefile的规则。本例中创建的Makefile.am的内容如下:

AUTOMARK_OPTIONS = foreign
bin_PROGRAMS = hello
hello_SOURCES = main.c hello.c common.h

  其中AUTOMARK_OPTION为automake的选项。GNU对自己发布的软件有严格的规范,如必须附带许可证声明文件COPYING等,否则automake执行时会报错,automake提供了3个软件等级;foreign、gnu和gnits供用户选择,默认为GNU,本例中使用最低的foreign等级,只检测必需的文件。

  bin_PROGRAMS定义了要产生的可执行文件名,如果要产生多个可执行文件,每个文件名间用空格隔开。

  file_SOURCES定义了生成可执行文件需要依赖的源文件。

7、执行automake命令

  在项目目录下执行automake命令生成Makefile.in文件。通常要使用--add-missing让automake自动添加一些必需的脚本文件。不过这里还有几个必需的文件没创建,这里先通过touch命令来创建,然后再执行automake命令。

  至此,使用autotools工具完成了源码安装的准备,接下来可以按照源码安装的3个步骤完成软件的编译和安装。

9、执行./configure命令

  执行./configure命令,基于Makefile.in生成最终的Makefile文件,该命令将一些配置参数添加到Makefile文件中。

10、执行make命令并运行程序

  执行make命令,基于Makefile文件编译源代码文件并生成可执行文件。

  接着在该目录下运行所产生的可执行文件进行测试。

10、执行make install命令

  在项目目录下执行make install 命令将软件包安装到系统中,默认设置会将软件安装到/usr/local/bin目录,需要root权限,安装完毕后,可以直接运行hello命令

  

  自动产生的Makefile文件指出主要的目标,如执行make uninstall命令将安装的软件从系统中卸载;执行make clean命令清除已编译的文件,包括目标文件*.o和可执行文件。make命令默认执行的是make all命令。

11、执行make dist命令对软件进行打包

  如果要对外发布,可以在项目目录下执行make dist命令将程序和相关的文档打包为一个压缩文档。如下

参考资料

Autoconf

GNU_makefile中文手册

7、使用autotools自动产生makefile的更多相关文章

  1. 使用autotools自动生成Makefile并在此之上使用dh-make生成可发布的deb程序包(详解)

    转自:http://blog.csdn.net/longerzone/article/details/12705507 一.前言 本文将介绍如何使用autotools生成一个Makefile文件,并在 ...

  2. GNU autotools自动生成Makefile 介绍

    一.目的 使用autotools工具来帮助我们自动地生成符合自由软件惯例的makefile(这样就可以像常见的GNU程序一样,只要使用"./configure", "ma ...

  3. 使用AutoTools自动生成Makefile

    前两天赶时间写了个简易的数据库系统,实现了简单的增删改查等功能.因为赶实验...无节操的我用shell实现的文件读写...咳咳...这都不是重点,重点是自己写Makefile感觉有点不伦不类...虽然 ...

  4. linux下使用automake工具自动生成makefile文件

    linux环境下,当项目工程很大的时候,编译的过程很复杂,所以需要使用make工具,自动进行编译安装,但是手写makefile文件比较复杂,所幸在GNU的计划中,设计出了一种叫做Autoconf/Au ...

  5. 工程管理之makefile与自动创建makefile文件过程

    (风雪之隅 http://www.laruence.com/2009/11/18/1154.html) Linux Makefile自动编译和链接使用的环境 想知道到Linux Makefile系统的 ...

  6. 使用automake等命令自动生成Makefile文件 (转载)

    使用automake等命令自动生成Makefile文件   Linux下编程时,为了方便编译,往往使用Makefile文件自动完成编译,但是Makefile文件本身的书写十分复杂,规则很多.好在Lin ...

  7. 自动构建Makefile(1)--C/C++编译流程&Makefile规则简介

      前言: 大家在Windows上使用VS构建C/C++程序时,不需要自己编辑略显晦涩的Makefile文件,而对于初学者而言, 他们甚至没意识到它的存在.VS是自动生成Makefile文件, 并构建 ...

  8. 自动生成Makefile时,关于Makefile.am编写

    最近编译一个项目的程序时,二十几个源代码文件放在六个文件夹中,而且各个文件中头文件互相包含.以前写过编译这样组织的源码的makefile,所以这次也就直接写了. 确实因为各个文件间的头文件互相包含,造 ...

  9. 手把手教你自动生成Makefile

    概述:autoconf/automake工具用于自动创建功能完善的Makefile文件,接下来简单介绍一下,如何使用上述工具 自动生成Makefile 前提:安装autoconf工具(ubuntu:s ...

随机推荐

  1. 22.Mysql磁盘I/O

    22.磁盘I/O问题磁盘IO是数据库性能瓶颈,一般优化是通过减少或延缓磁盘读写来减轻磁盘IO的压力及其对性能的影响.增强磁盘读写性能和吞吐量也是重要的优化手段. 22.1 使用磁盘阵列 RAID(Re ...

  2. (转)JavaScript escape() 函数(该方法不会对 ASCII 字母和数字进行编码,也不会对下面这些 ASCII 标点符号进行编码: * @ - _ + . / 。其他所有的字符都会被转义序列替换。)

    JavaScript escape() 函数 JavaScript 全局对象参考手册 定义和用法 escape() 函数可对字符串进行编码,这样就可以在所有的计算机上读取该字符串. 语法 escape ...

  3. 20172325 2018-2019-2 《Java程序设计》第四周学习总结

    20172325 2018-2019-2 <Java程序设计>第四周学习总结 教材学习内容总结 <Java软件结构与数据结构>第六章-列表 一.概述 1.列表是什么? 列表集合 ...

  4. [翻译]Javaslang 介绍

    原文地址:Introduction to Javaslang 1. 概述 在这篇文章中,我们将会探讨: Javaslang 是什么? 为什么需要它? 以及怎样在项目中使用它? Javaslang 是J ...

  5. Servlet会话管理二(Cookie)

    Cookie是在HTTP协议下,将服务器传递给浏览器的的少量信息保存到浏览器客户端的一种技术,通过这种技术,即使在浏览器被关闭或链接中断的情况下,用户仍可以维护Cookie中的数据. Cookie是经 ...

  6. swift NSdata 转换 nsstring

    result = NSString(data: data, encoding: NSUTF8StringEncoding) 做HTTP 请求时 遇到 打印结果看  所以~~~

  7. ListView 删除item删除不了的问题解决办法

    下面的方法是删除不了item的: Integer pos = Integer.valueOf(msg.getBody().toString()); adapter.getList().remove(p ...

  8. ViewPager源码分析——滑动切换页面处理过程

    上周客户反馈Contacts快速滑动界面切换tab有明显卡顿,让优化. 自己验证又没发现卡顿现象,但总得给客户一个技术性的回复,于是看了一下ViewPager源码中处理滑动切换tab的过程. View ...

  9. 使用EventLog Analyzer监控、管理及分析日志

  10. windows无法卸载jdk的解决方法

    装了java之后非常纠结的就是无法卸载,总不能因为卸载一个jdk去重装系统,但是看着它残存在那又非常不爽, 因为卸载会牵扯注册表等琐碎的东西,,,后来在官网发现神器一枚,此神器就是java卸载工具. ...