刚开始的时候,一直在使用automake 和 autoconf生成Makefile,然后编译这个工具,一直想把自己了解的记录下来,今天做了个简单的实验,趁这个机会,把一些东西写在这里,并尽可能的说清楚这个工具的使用原理。
先从实验开始说
简单实验
编写一个简单的文件,autotest.c,内容如下:
#include <stdio.h>
int main(int argc,char** argv){
printf("If you look this print on your screen , it is work\n");
return 0;
}
1) 运行autoscan命令,这个命令会扫描你在当前目录下的源代码文件,然后会生成一个扫描的报告,这个报告会告诉你必要的配置,文件名为 :configure.scan。其实这个文件也没什么神秘的,它的大致应该如下:
# Process this file with autoconf to produce a configure script.
AC_PREREQ(2.59)
AC_INIT(FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS)
AC_CONFIG_SRCDIR([config.h.in])
AC_CONFIG_HEADER([config.h])
# Checks for programs.
AC_PROG_CC
# Checks for libraries.
# FIXME: Replace `main' with a function in `-lpthread':
AC_CHECK_LIB([pthread], [main])
# Checks for header files.
# Checks for typedefs, structures, and compiler characteristics.
# Checks for library functions.
AC_OUTPUT
有人把这个文件的内容总结为,
AC_INIT // 一定是以这个开头的
测试程序
测试函数库
测试头文件
测试类型定义
测试结构
测试编译器特性
测试库函数
测试系统调用
AC_OUTPUT // 一定是以这个结尾的。
在本实验时,运行autoscan后,configure.scan的内容如下:
# Process this file with autoconf to produce a configure script.
AC_PREREQ(2.59)
AC_INIT(FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS)
AC_CONFIG_SRCDIR([hello.c])
AC_CONFIG_HEADER([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.
AC_CONFIG_FILES([Makefile])
AC_OUTPUT
2)在运行了autoscan命令之后,将configure.scan文件改成configure.in文件,内容也要相应的修改,在本实验中,修改后如下:
AC_INIT(autotest.c) // 该宏的作用是用于说明源代码的路径。
AM_INIT_AUTOMAKE(autotest,1.0) //这个宏用于指定产生软件的名称和版本号automake命令需要用到这个宏所必需的宏。
AC_PROG_CC // 这个宏会检查系统可用的编译器
........不作什么改变。。。。。。。。。。。
AC_OUTPUT(Makefile) // 这个宏设定configure脚本所要产生的文件,我们是想通过Makefile.am产生Makefile文件。
3)然后执行 aclocal 命令,这是由于autoconf需要用到m4文件,调用aclocal主要用于生成aclocal.m4文件。
4)调用autoconf ,autoconf是专门用于产生 configure脚本的工具,它处理configure.in文件中的宏,然后根据宏生成特定的脚本。这时该命令,将configure.in和aclocal.m4 作为输入文件,输出文件是configure ,这个文件就是我们后面在配置调用的文件。 按照一般的开源要求,目录下还要有几个其它的文件,分别是NEWS, README,AUTHORS,ChangeLog这几个文件,只要分别touch一下就行了。
5)编译当然需要编译我们自己的源文件,这个时候要编写一个Makefile.am指导如果编译。在当前目录下建立一个文件Makefile.am,内容如下:(如果有其它编译选项或者是编译连接需求,可以在Makefile.am里面指定,这个文件由automake使用),我这里只是简单的测试automake,所以Makefile.am文件很简单
bin_PROGRAMS = autotest
autotest_SOURCES = autotest.c
6)执行automake --add-missing,这个命令以Makefile.am和configure.in作为输入,输出文件是Makefile.in。如果这时出错,有可能是libtool没有配置,如下操作配置:
libtoolize --automake --debug --copy –force
或:
libtoolize --automake
7)此时就基本完成了,接下来只需要调用./configure 命令,就可以看到输出Makefile文件了。然后make完成编译,此时在目录下面应该就有了 autotest 可运行程序。
实验分析
实验其实很简单,就只有一个文件,并且也只有两行代码,但是后面可以看到目录下生成了很多个文件。另外在这个过程中,有几个文件起到了关键的作用,下面就对这几个文件进行说明一下,分别是
configure.in文件 :这个文件在autoconf和automake这两个命令调用的时候,都要用到。
Makefile.am文件:这个文件告诉编译器,如何编译当前目录下的源文件。
Makefile文件:这个文件由 configure 脚本执行后生成。
简单实验
实验分析
好了,这样的话,就可以输出了,直接在命令行调用 ./autotest 就好了。