Keep on going, never give up.

automake生成Makefile

提起Makefile很多人都非常头疼,在Linux上编程最麻烦不是写程序,而是编译和调试,尤其对于大项目,尽管有automake帮助,其实一点也不auto,但还是要学,要么就只能自己手动写Makefile(牢骚)。【本文未整理修改验证完,待续】

本文整理automake和autoconf“协助”生成Makefile文件过程,实际上,我还可能会用到aclocal和libtoolize等相关软件。

Automake,程序设计者只需要写一些预先定义好的宏 (macro),提交给Automake处理后会产生一个可以供 Autoconf 使用的 Makefile.in文件。再配合利用 Autoconf产生的自动配置设置文件 configure 即可产生一份符合符合 GNU Makefile 惯例的 Makeifle 了。

一、软件准备

在开始使用 Automake 之前,首先确认你的系统安装有如下软件:

  • apt-get install automake
  • apt-get install autoconf
  • apt-get install m4 
  • apt-get install perl
  • 如果你需要产生shared library,还需要:
  • apt-get install libtool

二、测试实例

1、测试文件

在当前工作目录下,创建Helloworld目录,下面再创建一个Module子目录,编写一个hello.c文件,内容如下:

#include <stdio.h>
int main(int argc, char** argv) {
printf(``Hello World!\n'');
return 0;
} 

2、生成configure.in

$ autoscan

该命令产生一个configure.in 原型文件configure.scan。改名为configure.in,参考内容如下:

  • dnl Process this file with autoconf to produce a configure script.
  • AC_INIT(hello.c) AM_INIT_AUTOMAKE(hello, 1.0)
  • dnl Checks for programs.
  • AC_PROG_CC
  • dnl Checks for libraries.
  • dnl Checks for header files.
  • dnl Checks for typedefs, structures, and compiler characteristics.
  • dnl Checks for library functions.
  • AC_OUTPUT(Makefile)

3、产生 aclocal.m4 及 configure 文件

$ aclocal

$ autoconf

4、编辑 Makefile.am 文件,內容如下

AUTOMAKE_OPTIONS= foreign
bin_PROGRAMS= hello
hello_SOURCES= hello.c 

5、执行 automake --add-missing

Automake 会根据Makefile.am 文件产生一些文件,读入 Makefile.am 文件后会把这一串已经定义好的宏展开并产生相对应的 Makefile.in 文件,包含最重要的 Makefile.in

$automake --add-missing

6、执行 ./configure

$ ./configure

現在你的目录下已经产生了一个 Makefile文件。

7、编译make

$ make

8、执行测试

$ ./hello

三、生成流程介绍

利用 autoconf 及 automake产生Makefile 的流程如下:

上图表示在上一范例中要使用的文件档案及产生出来的文件,有星号 (*) 者代表可执行文件。在此示例中可由 Autoconf 及 Automake 工具所产生的额外文件有 configure.scan、aclocal.m4、configure、Makefile.in,需要自行加入设置的有configure.in 及 Makefile.am

1、编辑 configure.in 文件

Autoconf 是用来产生“configure”文件的工具。“configure” 是一个 shell script,它可以自动设定原始程序以符合各种不同平台上Unix 系统的特性,并且根据系统参数及环境产生合适的Makefile文件或C 的头文件(header file),让原始程式可以很方便地在不同的平台上进行编译。Autoconf会读取 configure.in 文件然后产生“configure"这个 shell script。
configure.in 文件内容是一系列GNU m4 的宏,这些宏经autoconf处理后会变成检查系统特性的shell scripts。 configure.in 内宏的顺序并没有特别的规定,但是每一个configure.in 文件必須在所有宏前加入 AC_INIT 宏,然后在所有宏的最后加上 AC_OUTPUT宏。可先用 autoscan 扫描原始文件以产生一个 configure.scan 文件,再对 configure.scan 做些修改成 configure.in 文件。在范例中所用到的宏如下:

  • dnl ——这个宏后面的字不会被处理,可以视为注释
  • AC_INIT(FILE) ——该宏用来检查源代码所在路径,autoscan 会自动产生,一般无须修改它。
  • AM_INIT_AUTOMAKE(PACKAGE,VERSION)——这个是使用 Automake 所必备的宏,PACKAGE 是所要产生软件套件的名称,VERSION 是版本编号。
  • AC_PROG_CC ——检查系统可用的C编译器,若源代码是用C写的就需要这个宏。
  • AC_OUTPUT(FILE) ——设置 configure 所要产生的文件,若是Makefile ,configure 便会把它检查出来的结果带入 Makefile.in 文件后产生合适的 Makefile。

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

2、编辑Makefile.am 文件

接下来要编辑Makefile.am 文件,Automake 会根据 configure.in 中的宏把Makefile.am 转成 Makefile.in 文件。 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。
编辑好 Makefile.am 文件,就可以用 automake --add-missing来产生 Makefile.in。加上 --add-missing 选项来告诉 automake顺便假如包装一个软件所必须的文件。Automake产生生出來的 Makefile.in 文件是完全符合 GNU Makefile 的惯例,只要执行 configure这个shell script 便可以产生合适的 Makefile 文件了。

3、 使用 Makefile

利用 configure 所产生的 Makefile文件有几个预先设定的目标可供使用,这里只用几个简述如下:

  • make all ——产生设定的目标,既次范例中的执行文件。只敲入make 也可以,此时会开始编译源代码,然后连接并产生执行文件。
  • make clean ——清除之前所编译的执行文件及目标文件(object file, *.o)。
  • make distclean ——除了清除执行文件和目的文件以外,也把 configure 所产生的 Makefile 清除掉。
  • make install ——將程序安装到系统中,若源码编译成功,且执行结果正确,便可以把程序安装到系统预先设定的执行文件存放路径中,若用 bin_PROGRAMS 宏的话,程序会被安装到 /usr/local/bin下。
  • make dist ——將程序和相关的文档包装为一个压缩文档以供发布 (distribution) 。执行完在目录下会产生一个以PACKAGE-VERSION.tar.gz 为名称的文件。PACKAGE 和 VERSION 这两个参数是根据 configure.in 文件中 AM_INIT_AUTOMAKE(PACKAGE, VERSION) 的定义。在此范例中会产生 'hello-1.0.tar.gz' 的文件。
  • make distcheck ——和 make dist 类似,但是加入检查包装以后的压缩文件是否正常,这个目标除了把程序和相关文档包装成 tar.gz 文件外,还会自动把这个压缩文件解开,执行 configure,并执行 make all ,确认编译无错误以后,户显示这个 tar.gz 文件已经准备好可以发布了。这个检查非常有用,检查过关的套件,基本上可以给任何具备 GNU 开发环境的人去重新编译成功。就 hello-1.tar.gz 这个范例而言,除了在Red Hat Linux 上,在 FreeBSD 2.2.x 也可以正确编译。

要注意的是,利用 Autoconf 及 Automake 所产生出來的软件套件是可以在没有安装 Autoconf 及 Automake 的环境使用的,因为 configure 是一个 shell script,它己被设计为可以在一般 Unix 的 sh 这个 shell 下执行。但是如果要修改 configure.in 及 Makefile.am 文件再产生新的 configure 及 Makefile.in 文件时就一定要有 Autoconf 及 Automake 了。

[本部分摘自网络文章,非天缘原创,更多参考http://www.ccw.com.cn/]

参考资料:

http://bbs.csdn.net/topics/100060358

http://www.ibm.com/developerworks/cn/linux/l-makefile/

相关评论(0):  

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

订阅博客

最新文章

本站采用创作共用版权协议, 要求署名、非商业用途和保持一致. 转载也必须遵循“署名-非商业用途-保持一致”的创作共用协议. 返回顶部
Copyright@2005-2016 Metsky.com, All rights Reserved.