使用autotools生成Makefile(一)

为什么使用autotools

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

autotools组成

名称功能描述
autoscanautoscan是用来扫描源代码目录生成configure.scan文件的。configure.scan包含了系统配置的基本选项,里面都是一些宏定义。我们需要将它改名为configure.in
aclocalaclocal是一个perl脚本程序。aclocal根据configure.in文件的内容,自动生成aclocal.m4文件。aclocal的定义是:“aclocal - create aclocal.m4 by scanning configure.ac”。 生成的aclocal.m4是宏展开文件
autoconfautoconf是用来产生configure文件的configure.in文件的内容是一些宏,这些宏经过autoconf处理后会变成检查系统特性、环境变量、软件必须的参数的shell脚本
autoheader自动生成config.h.in在configure生成config.h时候的in文件
automake我们使用automake --add-missing来产生Makefile.inMakefile.am是用来生成Makefile.in的,需要你手工书写

一般步骤

  1. 执行autoscan命令生成autoscan.log和configure.scan文件
  2. mv configure.scan configure.ac且修改configure.ac(早期使用configure.in)
  3. 使用aclocal生成aclocal.m4文件
  4. 执行autoconf命令生成configure文件
  5. 执行autoheader命令生成config.h和config.h.in
  6. 创建一个Makefile.am文件
  7. touch NEWS README AUTHORS ChangeLog
  8. 执行 automake --add-missing ,automake 会根据 Makefile.am 文件产生一些文件,包含最重要的Makefile.in
  9. 执行./configure 命令生成Makefile文件

最简单例子并解释

以hello.c为例,代码如下:

#include <stdio.h>

int main()
{
    printf("Hello, Linux World!\n");
    return 0;
}

执行第1步,生成configure.scan文件,情况如下:
图1
configure.scan内容如下:

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

# 确保使用的是足够新的Autoconf版本。如果用于创建configure的Autoconf的版
# 本比version 要早,就在标准错误输出打印一条错误消息并不会创建configure
AC_PREREQ([2.69])

# 初始化,定义软件的基本信息,包括设置包的全称,版本号以及报告BUG时需要用的邮箱地址
AC_INIT([FULL-PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS])

# 用来侦测所指定的源码文件是否存在,来确定源码目录的有效性,任选一个源码文件即可
AC_CONFIG_SRCDIR([hello.c])

#用于生成config.h文件,以便autoheader使用
AC_CONFIG_HEADERS([config.h])

# Checks for programs.
AC_PROG_CC               # gcc

# Checks for libraries.

# Checks for header files.

# Checks for typedefs, structures, and compiler characteristics.

# Checks for library functions.

AC_OUTPUT

执行第2步,configure.ac 内容如下:

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

# 确保使用的是足够新的Autoconf版本。如果用于创建configure的Autoconf的版
# 本比version 要早,就在标准错误输出打印一条错误消息并不会创建configure
AC_PREREQ([2.69])

# 初始化,定义软件的基本信息,包括设置包的全称,版本号以及报告BUG时需要用的邮箱地址
AC_INIT([hello], [1.0], [qigaohua@xxx.com])

# 添加宏AM_INIT_AUTOMAKE, 它是automake所必备的宏,
# 也同前面一样,PACKAGE是所要产生软件套件的名称,VERSION是版本编号
AM_INIT_AUTOMAKE(hello, 1.0)

# 用来侦测所指定的源码文件是否存在,来确定源码目录的有效性,任选一个源码文件即可
AC_CONFIG_SRCDIR([hello.c])

#用于生成config.h文件,以便autoheader使用
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.

# 创建输出文件。在`configure.in'的末尾调用本宏一次

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

AC_OUTPUT   # 如果只有一个Makefile, 也可改为AC_OUTPUT([Makefile])

执行3、4、5步,结果如下:
图2
执行第6步,创建Makefile.am文件:

AUTOMAKE_OPTIONS = foreign
bin_PROGRAMS = hello
hello_SOURCES = hello.c

  其中的AUTOMAKE_OPTIONS为设置automake的选项。由于GNU(在第1章中已经有所介绍)对自己发布的软件有严格的规范,比如必须附 带许可证声明文件COPYING等,否则automake执行时会报错。automake提供了三种软件等级:foreign、gnu和gnits,让用 户选择采用,默认等级为gnu。在本例使用foreign等级,它只检测必须的文件。
  bin_PROGRAMS定义要产生的执行文件名。如果要产生多个执行文件,每个文件名用空格隔开。
  hello_SOURCES定义“hello”这个执行程序所需要的原始文件。如果”hello”这个程序是由多个原始文件所产生的,则必须把它所用到的所有原 始文件都列出来,并用空格隔开。例如:若目标体“hello”需要"hello.c”、“xxx.c”、“hello.h”三个依赖文件,则定义 hello_SOURCES=hello.c xxx.c hello.h。
  要注意的是,如果要定义多个执行文件,则对每个执行程序都要定义相应的file_SOURCES。

第7步可要可不要:

第8步:
使用automake对其生成“configure.in”文件,在这里使用选项“–adding-missing”可以让automake自动添加有一些必需的脚本文件。
图3这个时候我们生成了configure文件。

执行最后一步,生成Makefile文件:
图4
生成Makefile成功了。

make 运行一下:
图5



为了生成复杂项目的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文件时,尽可能的用相对路径,要不在不同的地方编译,安装可能是到不同的目录了
图8

  解释我们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应用程序指定依赖库,类似于全局变量和局部变量的关系

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值