automake简介

在 Unix 上写过程序的人尤其是用 C 来开发程序的人一般都遇到过 Makefile,用 make 来开发和编译程序的确很方便,可是要写出一个 Makefile 就不那么简单了。GNU Make 那份几百页的文件,让许多人害怕。当然,现在关于 make的文档比较多,不过写一个 Makefile 总是一件很烦人的事情,GNU Autoconf 及Automake 这两个软件就是帮助程序开发者轻松产生 Makefile
文件的。现在的 GNU 软件如 Apache, MySQL Minigui 等都是利用 Autoconf,Automake实现自动编译的。用户只要使用 “./configure”, “make”, “make install” 就可以把程序安裝到系统中。

Makefile 基本上就是『目标』(target), 『关联』(dependencies) 和『动作』三者所组成的一系列规则。而 make 就是根据 Makefile 的规则决定如何编译 (compile) 和连接 (link) 程序或者其它动作。当然,make 可做的不只是编译和连接程序,例如 FreeBSD 的 port collection 中 ,Makefile 还可以做到自动下载远程程序,解压缩
(extract) ,打补丁 (patch),设定,然后编译,安装到系统中。Makefile 基本结构虽然很简单,但是妥善运用这些规则就可以变换出许多不同的花样。却也因为这样,许多人刚开始学写 Makefile 时会觉得没有规范可以遵循,每个人写出来的 Makefile 都不大一样,不知道从哪里下手,而且常常会受到开发环境的限制,只要环境参数不同或者路径更改,可能 Makefile 就得跟着修改。虽然有 GNU MakefileConventions (GNU Makefile 惯例)制订出一些在进行 GNU
程序设计时写 Makefile 的一些标准和规范,但是其内容很长而且很复杂,并且经常作一些调整,为了减轻程序开发人员维护 Makefile 的负担,就出现了 Automake。利用 Automake,编程者只需要写一些预先定义好的宏 (macro),提交给 Automake 处理,就会产生一个可以供Autoconf 使用的 Makefile.in 文件。再配合使用 Autoconf 产生的自动配置文件 configure 即可产生一份符合 GNUMakefile 惯例的 Makeifle 了。

下面使用一个简单的例子来介绍automake产生makefile的步骤,后面会具体介绍如何使用automake来编译静态库、动态库以及编译整个项目。

本例只是简单的把一个hello.c文件编译成hello可执行文件,具体的步骤如下:

1、执行autoscan命令生成autoscan.log和configure.scan文件

2、mv configure.scan configure.ac且修改configure.ac(早期使用configure.in)

  -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.  

AC_PREREQ([2.68])
AC_INIT(hello, 1.0,[email])
AM_INIT_AUTOMAKE(hello, 1.0)
AC_CONFIG_SRCDIR([hello.c])    #用于检测源码目录的有效性,任选一个源码文件即可
AC_CONFIG_HEADERS([config.h])             #用于生成config.h文件,以便autoheader使用  

# Checks for programs.
AC_PROG_CXX
AC_PROG_CC
#LT_INIT                            #编译libtool必须添加的两行,这里直接编译成so,故不需要
#AC_PROG_LIBTOOL
# Checks for libraries.
# Checks for header files.
# Checks for typedefs, structures, and compiler characteristics.
# Checks for library functions.  

AC_CONFIG_FILES([Makefile ])   #需要生成的所有Makefile  

AC_OUTPUT  

3、使用aclocal生成aclocal.m4文件

4、执行autoconf命令生成configure文件

5、执行autoheader命令生成config.h和config.h.in

6、创建一个Makefile.am文件,内容如下:

AUTOMAKE_OPTIONS= foreign
bin_PROGRAMS= hello
hello_SOURCES= hello.c

7、touch NEWS README AUTHORS ChangeLog

8、执行 automake --add-missing ,Automake 会根据 Makefile.am 文件产生一些文件,包含最重要的Makefile.in

9、执行./configure 命令生成Makefile文件

说明:

上述产生 Makefile 的过程和以往自行编写的方式非常不一样,使用 Automake 只需用到一些已经定义好的宏就可以了。我们把宏及目标 (target)写在 Makefile.am 文件内,Automake 读入 Makefile.am 文件后会把这一串已经定义好的宏展开并产生相对应的 Makefile.in
文件,然后再由 configure 这个 shell script 根据 Makefile.in 产生合适的 Makefile。

在上面产生的中间文件中,开发者需要设置的有configure.ac和Makefile.am,下面介绍这两个文件中常用宏的意义。

configure.ac文件:autoconf 是用来产生 ‘configure‘文件的工具。‘configure‘ 是一个 shell script,它可以自动设定一些编译参数使程序能够条件编译以符合各种不同平台的
Unix 系统。autoconf 会读取 configure.ac文件然后产生‘configure‘ 这个shell script。configure.ac文件内容是一系列 GNU m4 的宏,这些宏经 autoconf 处理后会变成检查系统特性的 shell scripts。configure.ac文件中宏的顺序并没有特别的规定,但是每一个 configure.in 文件必须在所有其它宏前加入 AC_INIT宏,然后在所有其它宏的最后加上 AC_OUTPUT 宏。常用到的宏如下:

dnl和#:这个宏后面的内容不会被处理,可以视为注释

AC_INIT(FILE):该宏用来检查源代码所在路径,autoscan 会自动产生,一般无须修改它。

AM_INIT_AUTOMAKE(PACKAGE,VERSION):这个是使用 Automake 所必备的宏,PACKAGE 是所要产生软件的名称,VERSION 是版本编号。一般autoscan不会产生,需要手动添加

AC_PROG_CC:检查系统可用的 C 编译器,若源代码是用 C 写的就需要这个宏。

AC_OUTPUT(FILE):设置 configure 所要产生的文件,若是 Makefile ,configure 便会把它检查出来的结果填充到 Makefile.ac文件后产生合适的 Makefile。

实际上,在使用 automake 时,还需要一些其他的宏,这些额外的宏我们用 aclocal 来帮助产生。执行 aclocal 会产生 aclocal.m4 文件,如果没有特别的用途,不需要修改它,用 aclocal 所产生的宏会告诉 automake 如何动作。有了 configure.ac 及 aclocal.m4 两个文件以后,便可以执行 autoconf 来产生configure 文件了.

具体的参考文献见官方文档:http://www.gnu.org/software/autoconf/manual/autoconf.html

Makefile.am 文件:Automake 会根据 configure.ac 中的宏并在 perl 的帮助下把 Makefile.am 转成 Makefile.in 文件。Makefile.am 文件定义所要产生的目标,下面一张图中,列出了可执行文件、静态库、头文件和数据文件,四种书写Makefile.am文件的一般规则:

下面是上图中全局变量的含义:

在编写Makefile.am文件时,尽可能的用相对路径,要不在不同的地方编译,安装可能是到不同的目录了,

整个Makefile.am就是按照上面三个表格来编写的,不管是编写可执行文件还是动态库。对照着上面的表格,来解释我们hello程序的Makefile.am:

AUTOMAKE_OPTIONS:设置 Automake 的选项。Automake 主要是帮助开发 GNU 软件的人员来维护软件,所以在执行 Automake 时 ,会检查目录下是否存在标准 GNU 软件中应具备的文件,例如 ‘NEWS‘、‘AUTHOR‘、‘ChangeLog‘ 等文件。设置为
foreign 时,Automake 会改用一般软件的标准来检查,此时不需要这些文件

bin_PROGRAMS:定义要产生的执行文件名。如果要产生多个执行文件,每个文件名用空白符隔开。

hello_SOURCES:定义 ‘hello‘ 这个执行程序所需要的原始文件。如果 ‘hello‘这个程序是由多个原始文件所产生,必須把它所用到的所有原始文件都列出来,以空白符隔开。假设 ‘hello‘ 还需要 ‘hello.c‘、‘main.c‘、‘hello.h‘ 三个文件的话,则定义hello_SOURCES= hello.c main.c hello.h。如果定义多个执行文件,则对每个执行程序都要定义相对的
filename_SOURCES。

LDADD:一般用于指明本项目自己生成的库,而LDFLAGS一般使用-l等指明本项目依赖的第三方库,如opencv库。另外由于一个Makefile.am中可能会生成多个动态库、可执行文件等,所以如果使用LDADD,则是为所有的库或者执行文件指定依赖库,如果使用hello_LDADD则是为hello应用程序指定依赖库,类似于全局变量和局部变量的关系

其他的宏的用法可以参考下一篇automake编写完整的项目---动态库+可执行文件

具体参考automake官方文档:http://www.gnu.org/software/automake/manual/automake.html

时间: 2024-10-11 13:53:31

automake简介的相关文章

Autoconf/Automake工具简介

http://www.cnblogs.com/xf-linux-arm-java-android/p/3590770.html 在linux下编程的时候,有时候工程项目很大,文件比较多,此时需要使用自动创建Makefile文件功能.也就是使用Autoconf/Automake工具自动生成Makefile,为编译程序带来了方便,当前大多数软件包都是用此方法生成,Autoconf/Automake工具组主要包括autoconf,automake,perl,m4. Autoconfig/Automak

Varnish缓存代理简介与配置

一.varnish原理: 1)Varnish简介: varnish缓存是web应用加速器,同时也作为http反向缓存代理.你可以安装varnish在任何http的前端,同时配置它缓存内容.与传统的 squid 相比,varnish 具有性能更高.速度更快.管理更加方便等诸多优点.有一部分企业已经在生产环境中使用其作为旧版本的squid的替代方案,以在相同的服务器成本下提供更好的缓存效果,Varnish更是作为CDN缓存服务器的可选服务之一. 根据官网的介绍,Varnish的主要特性如下:http

PYTHON简介及安装

Python简介 Python是一种广泛使用的高层次,通用,解释,动态编程语言.它的设计理念强调代码的可读性,它的语法允许程序员表达更少的代码的概念比将在可能语言如C ++或Java.该语言提供旨在使两个小型和大型项目清晰的结构.Python支持多种编程范例,包括面向对象的,命令式和函数式编程或程序性的风格.它的特点是动态类型系统和自动内存管理和拥有庞大而全面的标准库. Python解释可用于许多操作系统,让Python代码在各种系统上运行.使用第三方工具,如Py2exe或Pyinstaller

例解 autoconf 和 automake 生成 Makefile 文件

转自:http://www.ibm.com/developerworks/cn/linux/l-makefile/ 引子 无论是在Linux还是在Unix环境中,make都是一个非常重要的编译命令.不管是自己进行项 目开发还是安装应用软件,我们都经常要用到make或 make install.利用make工具,我们可以将大型的开发项目分解成为多个更易于管理的模块,对于一个包括几百个源文件的应用程序,使用make和 makefile工具就可以轻而易举的理顺各个源文件之间纷繁复杂的相互关系. 但是如

autoscan,aclocal,autoheader,automake,autoconf,make

简介:下面的例子是在 linux下创建的一个包含多个源文件的c语言项目,其中基本用到了整个autotools自动化工具链(autoscan,aclocal,autoheader,automake,autoconf,make).如果读者要制作符合GNU标准的开源项目,这是一个很好的开始. $ mkdir 1 $ cd 1 $ touch main.c plus.c plus.h minus.c minus.h $ cat >main.c #include <stdio.h> #includ

微服务部署(一)架构简介

简介 金财项目是微服务构架,每个功能模块都是一个单独部署的服务,现有20个服务:AUTH.CUSTOMER.EHALL.CONFIG.EUREKA.GATEWAY.GATEWAY-UI.GENERATOR.JCCOLLEGE.NOTIFY.ORDER.PAY.PRODUCT.REPORT.SECURITY.SYSTEM.STORE.TASK.WECHAT.WECHAT-AUTH,整个系统服务,在不断增加中. 系统架构图 环境准备 操作系统:Centos 7.2 x64 应用环境:openrest

drbd(一):简介和安装

本文目录:1.drbd简介2.drbd工作原理和术语说明 2.1 drbd工作原理 2.2 drbd复制协议模型 2.3 drbd设备的概念 2.4 drbd资源角色 2.5 drbd工作模式 2.6 drbd分区说明3.drbd部署实验 3.1 实验环境和部署前的准备 3.2 yum安装drbd 3.3 编译安装drbd 1.drbd简介 drbd是通过网络(tcp连接)在不同服务器之间实现基于block级别进行数据实时同步的软件.类似于inotify+rsync,只不过inotify+rsy

Python安装及简介

Python简介 Python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言的一种继承.之所以选中Python作为程序的名字,是因为他是BBC电视剧--蒙提·派森的飞行马戏团(Monty Python's Flying Circus)的爱好者.ABC是由吉多参加设计的一种教学语言.就吉多本人看来,ABC这种语言非常优美和强大,是专门为非专业程序员设计的.但是ABC语言并没有

Android网络通讯简介

网络通信应该包含三部分的内容:发送方.接收方.协议栈.发送方和接收方是参与通信的主体,协议栈是发送方和接收方进行通信的契约.按照服务类型,网络通信可分为面向连接和无连接的方式.面向连接是在通信前建立通信链路,而通信结束后释放该链路.无连接的方式则不需要在通信前建立通信连接,这种方式不保证传输的质量. Android提供了多种网络通信的方式,如Java中提供的网络编程,在Android中都提供了支持.Android中常用的网络编程方式如下: 针对TCP/IP协议的Socket和ServerSock