一、目的
使用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 automake自动生成Makefile的方法及案例
一个简单的执行程序的GNU automake自动生成Makefile的方法及案例 在GNU的世界里,存在Automake这样的工具进行自动生成Makefile文件,automake是由Perl语言编写 ...
- 使用autotools自动生成Makefile并在此之上使用dh-make生成可发布的deb程序包(详解)
转自:http://blog.csdn.net/longerzone/article/details/12705507 一.前言 本文将介绍如何使用autotools生成一个Makefile文件,并在 ...
- 使用AutoTools自动生成Makefile
前两天赶时间写了个简易的数据库系统,实现了简单的增删改查等功能.因为赶实验...无节操的我用shell实现的文件读写...咳咳...这都不是重点,重点是自己写Makefile感觉有点不伦不类...虽然 ...
- linux下使用automake工具自动生成makefile文件
linux环境下,当项目工程很大的时候,编译的过程很复杂,所以需要使用make工具,自动进行编译安装,但是手写makefile文件比较复杂,所幸在GNU的计划中,设计出了一种叫做Autoconf/Au ...
- 自动生成 Makefile (automake/autoconf 入门)
作为Linux 下的程序开发人员,大家一定都遇到过Makefile ,用make 命令来编译自己写的程序确实是很方便.一般情况下,大家都是手工写一个简单Makefile ,如果要想写出一个符合自由软件 ...
- 7、使用autotools自动产生makefile
通过之前的学习可以知道,makefile拥有复杂的语法结构,编写与维护都不是很方便于是设计出了专门用来生成Makefile的autotools工具,以减轻制作makefile文件的负担. 自主软件主要 ...
- 自动生成makefile
原文 http://www.laruence.com/2009/11/18/1154.html 作为Linux下的程序开发人员,大家一定都遇到过Makefile,用make命令来编译自己写的程序确实 ...
- 如何自动生成Makefile
作为Linux下的程序开发人员,大家一定都遇到过Makefile,用make命令来编译自己写的程序确实是很方便.一般情况下,大家都是手工写一个简单Makefile,如果要想写出一个符合自由软件惯例的M ...
- 使用automake等命令自动生成Makefile文件 (转载)
使用automake等命令自动生成Makefile文件 Linux下编程时,为了方便编译,往往使用Makefile文件自动完成编译,但是Makefile文件本身的书写十分复杂,规则很多.好在Lin ...
随机推荐
- Linux入门——用户组管理
Linux用户组的管理 简介 用户组用来控制操作权限,防止无关人员莫名 rm -rf 重要文件,导致文件无法恢复或者花费很大代价恢复,这不是一个系统管理员 想看到的结果,所以一般系统管理员都会给开发人 ...
- MySQL大表优化方案
转:https://segmentfault.com/a/1190000006158186?hmsr=toutiao.io&utm_medium=toutiao.io&utm_sour ...
- common-logging源码解析
OK,现在我们来研究下common-logging的源码.这篇博客有参照上善若水的博客,感谢他的无私分享. 先来随便扯点吧,貌似所有这些流行的Logging框架都和Log4J多少有点关系(不太确定Co ...
- Asp.net core 2.0.1 Razor 的使用学习笔记(三)
ASP.net core 2.0.0 中 asp.net identity 2.0.0 的基本使用(二)—用户账户及cookie配置 修改用户账户及cookie配置 一.修改密码强度和用户邮箱验证规则 ...
- spring 声明式事务管理详解
前言:spring框架对于事务管理提供了两种方案.一,编程式事务.二,声明式事务.本例主要剖析 声明式事务. 何为声明式事务: 通过spring的配置文件配置事务规则,或使用spring @Trans ...
- VisionPro笔记:色彩区分
VisionPro:色彩区分 来自:blog.sina.com.cn/yangchao168 利用色彩来区分物体这类的项目没做过,总觉得很难,尤其是涉及到RGB和HSI等.看到VisionPro中有这 ...
- Angular之ngRoute与uiRoute
ngRoute不支持嵌套路由 用法如下: <!DOCTYPE html> <html lang="en" ng-app="myApp"> ...
- awk之NR==FNR问题
NR,表示awk开始执行程序后所读取的数据行数. FNR,与NR功用类似,不同的是awk每打开一个新文件,FNR便从0重新累计. 下面看两个例子: 1,对于单个文件NR 和FNR 的 输出结果一样的 ...
- C为变量提供了5中存储模型(类)
- 树莓派小车By 树莓派爱好者ITJoker(通过python socket通信实现树莓派视频小车)(一)
本文由树莓派爱好者ITJoker 编辑,转载请注明出处.本人也有新浪博客同样是树莓派爱好者ITJoker 所需材料:树莓派2B或者2B以上,L2985n驱动板,若干排线,电池及电池盒,usb无线网卡( ...