一、目的
使用autotools工具来帮助我们自动地生成符合自由软件惯例的makefile(这样就可以像常见的GNU程序一样,只要使用“./configure”, “make”, “make install” 就可以把程序安装到linux系统中去了)
GNU的软件风格的编译安装步骤:
# ./configure 侦测系统的环境,确定软件安装目录,生成Makefile
(用户执行configure时可以通过它的命令行参数指定自己所需的编译选项
例如:安装目录通过--prefix= PREFIX设置,缺省情况下PREFIX为/usr/local
默认安装时,执行文件安装到/usr/local/bin目录;
库安装到/usr/local/lib目录;
数据文件安装到/usr/local/share目录)
# make 调用系统中的编译器进行编译和连接
# make install 将软件安装到设定的目录
二、GNU autotools
1、主要包括三个软件: autoconf ,automake,libtool。
很多linux发行版都会默认安装这几个工具,软件包是通过pkgsrc,他们在pkgsrc目录为devel/autoconf,devel/automake,devel/libtool。
2、简介:configure.ac里面主要是m4宏,用于侦测系统;Makefile.am里面主要是编译相关的设置信息。使用autoconf工具将configure.ac转换为configure执行文件,使用automake将Makefile.am转换为Makefile.in。执行configure脚本时会读取Makefile.in里面的设置信息,并与侦测信息一起写到Makefile文件中。
(autoscan)->configure.ac->(autoconf)->configure
Makefile.am->(automake)->Makefile.in->(configure)->Makefile
3、命名习惯:
.ac后缀的文件,是autoconf的输入文件(旧版本中configure.in等同于configure.ac,虽然新版本也
可以识别,但它不符合命名规则,所以新版本的文件应该使用ac后缀)
.am后缀的文件,是automake的输入文件
.in后缀的文件,是configure的输入文件
三、步骤
1、建立目录,放入文件。按照GNU的习惯,将程序的源码放入src子目录,其他的数据文件也放在各自的子目录中。
2、autoscan
autoconf软件包里的autoscan工具根据参数指定目录生成一个configure.ac的模板文件configure.scan。autoscan如果不加参数则默认当前目录为工作目录。
3、重命名configure.scan->configure.ac(autoconf的输入文件),然后在此基础上进行修改
分析configure.scan文件:
① configure.ac文件是autoconf的输入文件,经过autoconf处理,展开里面的m4宏,输出的是
configure脚本,其主要作用是侦测系统。
② #开始的行为注释,其他都是m4宏命令,宏参数中会使用`[]`来表示其中的字符串是一个整体
③ AC_PREREQ([2.69]) 声明本文件要求的autoconf版本
④ AC_INIT(FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS)
定义软件的名称和版本等信息,第三项BUG-REPORT-ADDRESS是可选项,一般写成作者的邮
件地址,此处可修改为AC_INIT(helloworld, 1.0)
⑤ AC_CONFIG_SRCDIR 该宏通过侦测所指定的源码文件是否存在,来确定源码目录的有效性。
可以选择源码目录中的任何一个文件作为代表。
⑥ AC_CONFIG_HEADER 宏用于生成config.h文件,里面存放configure脚本侦测到的信息。如果
程序需要使用其中的定义,就在源码中加入#include <config.h>
⑦ 其他的一些宏是标准的侦测过程,可以保留不动。configure.ac文件要求AC_INIT必须放在开头位
置,AC_OUTPUT放在文件末,中介用来检测编译环境的各种宏没有特别的先后次序要求,由宏之
间相互关系决定Makefile文件的产生。
⑧ AC_INIT_AUTOMAKE 简单的Makefile.in可以手动编写,如果使用automake产生,需要在
configure.ac中加入该宏进行声明
⑨ AC_CONFIG_FILES 要输出Makefile文件,需要在configure.ac中使用该宏进行声明该宏并不只
是处理Makefile,而是将FILE.in文件转换为FILE文件
**注意:因为makefile可以遍历子目录,如果子目录中存在Makefile,也将同时处理。例如在src
目录下是源码, 其他目录下是数据文件的多个子目录的实例中,可以使用单独一个Makefile放
在根目录下面,也可以用多个Makefile。由于每个子目录的Makefile只处理本目录的文件,分工
明确,是模块化的方法,推荐使用。因此在configure.ac中增加下面的宏,表示软件根目录和子
目录中都需要生成Makefile文件:
AC_CONFIG_FILES([Makefile
src/Makefile
data/Makefile
docs/Makefile
fonts/Makefile
images/Makefile
music/Makefile
sound/Makefile])
4、编写Makefile.am文件
① 软件根(非叶子)目录Makefile.am:
由于该目录下面保存的是与autotools相关的文件,没有需要编译安装的文件,所以只注明需要
进一步处理的子目录信息:
SUBDIRS = src data docs fonts images music sound
② 文件(叶子)目录Makefile.am
(具体语法后续再详细研究)
5、运行autotools
准备好configure.ac和Makefile.am,就可以用autotools的命令来处理这些文件:
① aclocal命令:它根据configure.ac的定义,将需要使用的m4宏定义复制到aclocal.m4中。缺省
时,m4 宏是从 autoconf 的安装目录和系统的aclocal目录搜索。如果需要使用其他路径下的宏,可
以通过命令行的-I选项指定。
② autoheader命令,生成config.h.in文件,这里面的C语言宏定义也是通过解析configure.ac产生。
③ automake命令,处理Makefile.am,生成Makefile.in
**注意:
a. GNU对自己发布的软件有严格的规范,比如必须附带许可证声明文件COPYING等等,否则
automake执行时会报错。
b. automake提供了三种软件等级:foreign,gnu和gnits,让用户选择。默认为gnu,foreign指
它只检测必须的文件和有一些必须的脚本文件可以从automake软件包里复制过来。
c. --add-missing选项:将缺失的标准文件添加到包中
④ autoconf命令,生成configure文件

GNU autotools自动生成Makefile 介绍的更多相关文章

  1. 一个简单的执行程序的GNU automake自动生成Makefile的方法及案例

    一个简单的执行程序的GNU automake自动生成Makefile的方法及案例 在GNU的世界里,存在Automake这样的工具进行自动生成Makefile文件,automake是由Perl语言编写 ...

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

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

  3. 使用AutoTools自动生成Makefile

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

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

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

  5. 自动生成 Makefile (automake/autoconf 入门)

    作为Linux 下的程序开发人员,大家一定都遇到过Makefile ,用make 命令来编译自己写的程序确实是很方便.一般情况下,大家都是手工写一个简单Makefile ,如果要想写出一个符合自由软件 ...

  6. 7、使用autotools自动产生makefile

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

  7. 自动生成makefile

    原文  http://www.laruence.com/2009/11/18/1154.html 作为Linux下的程序开发人员,大家一定都遇到过Makefile,用make命令来编译自己写的程序确实 ...

  8. 如何自动生成Makefile

    作为Linux下的程序开发人员,大家一定都遇到过Makefile,用make命令来编译自己写的程序确实是很方便.一般情况下,大家都是手工写一个简单Makefile,如果要想写出一个符合自由软件惯例的M ...

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

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

随机推荐

  1. Django权限机制的实现

    Django权限机制的实现 1. Django权限机制概述 权限机制能够约束用户行为,控制页面的显示内容,也能使API更加安全和灵活:用好权限机制,能让系统更加强大和健壮.因此,基于Django的开发 ...

  2. 关于win10企业版1607累积更新(KB4013429)安装失败后,个人的解决办法

    最近连续一个多星期更新(1607-KB4013429)失败,更抓狂的是windows不厌其烦的,不断下载,不断更新,导致每天打开电脑都要等个十几分钟,看来不解决是不行了. 网上一查,有各种解决版本 1 ...

  3. JS 中的事件设计

    看懂此文,不再困惑于 JS 中的事件设计 原文出处: aitangyong    抽空学习了下javascript和jquery的事件设计,收获颇大,总结此贴,和大家分享. (一)事件绑定的几种方式 ...

  4. 链表法解决hash冲突

    /* @链表法解决hash冲突 * 大单元数组,小单元链表 */ #pragma once #include <string> using namespace std; template& ...

  5. Asp.net Core 入门实战

    Asp.Net Core 是开源,跨平台,模块化,快速而简单的Web框架. Asp.net Core官网的一个合集,方便一次性Clone 目录 快速入门 安装 一个最小的应用 项目模板 路由 静态文件 ...

  6. The man Command

    The man command is used to format and display the man pages. The man pages are a user manual that is ...

  7. WPF之ViewModel

    写之前我先唠叨两句,现在公司要求用wpf写个客户端,我之前玩过winform,没怎么用wpf写过正经项目,我接手这个wpf项目之后就开始研究这个东西,MVVM,自定义控件,等等.可能是winfrom先 ...

  8. 原生JS实现图片轮播

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. linux中sed在指定字符前后添加内容

      假设文档内容如下: [root@localhost ~]# cat /tmp/input.txt null 000011112222 test 要求:在1111之前添加AAA,方法如下: sed ...

  10. 不要用for循环去遍历LinkedList

    ArrayList与LinkedList的普通for循环遍历 对于大部分Java程序员朋友们来说,可能平时使用得最多的List就是ArrayList,对于ArrayList的遍历,一般用如下写法: p ...