一、目的
使用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. 利用神经网络算法的C#手写数字识别

    欢迎大家前往云+社区,获取更多腾讯海量技术实践干货哦~ 下载Demo - 2.77 MB (原始地址):handwritten_character_recognition.zip 下载源码 - 70. ...

  2. TF-卷积函数 tf.nn.conv2d 介绍

    转自 http://www.cnblogs.com/welhzh/p/6607581.html 下面是这位博主自己的翻译加上测试心得 tf.nn.conv2d是TensorFlow里面实现卷积的函数, ...

  3. java8-新特性--(接口的默认方法与静态方法)

    Java 8用默认方法与静态方法这两个新概念来扩展接口的声明. public interface Inte{ void method(); default void defaultMethod(){ ...

  4. scipy.optimize.minimize 解决实际问题

    接上博客问题http://www.cnblogs.com/shizhenqiang/p/8274806.html # coding=utf-8 from scipy import optimize i ...

  5. 11_什么是sql注入?

    什么是sql注入? --因为后台会把用户输入的插入到后台的sql语句中,来进行sql查询判断用户输入是否存在数据库中,     来验证用户是否合法,就会出现一个问题,用户在做用户验证的时候,在输入框注 ...

  6. XML (一)

    1 XML概述 XML是指可扩展的标记语言,很类似与HTML.它被设计的宗旨就是描述数据,而非显示数据. XML标签没有被预定义,需要用户自定定义标签. XML技术是W3C组织发布的.目前遵循的规范是 ...

  7. python爬虫之小说爬取

    废话不多说,直接进入正题. 今天我要爬取的网站是起点中文网,内容是一部小说. 首先是引入库 from urllib.request import urlopen from bs4 import Bea ...

  8. python字符串问题

    相关知识点: 字符串在Python内部的表示是unicode编码,因此,在做编码转换时,通常需要以unicode作为中间编码,即先将其他编码的字符串解码(decode)成unicode,再从unico ...

  9. Spring AOP小记

    一.概述 在通常的开发过程中,我们调用的顺序通常是controller->service-dao,其中,service中包含着太多的业务逻辑,并且还要不断调用dao来实现自身的业务逻辑,经常会导 ...

  10. Tomcat8远程访问manager,host-manager被拒绝403

    Tomcat部署在服务器之后在服务器本地访问manager和host-manager成功(即127.0.0.1:8080或者localhost:8080),但使用测试主机访问tomcat的manage ...