用 Autotools 生成 Makefile 文件

Jun 01 2011 Published by under Study

Autotools 是一个工具集,可以自动生成 Makefile 文件。Ubuntu 如果没有安装 Autotools ,需要执行 sudo apt-get install autoconf automake 进行安装,其他发行版类似。

在体验 Autotools 之前先创建一个简单的 helloworld 程序:

//helloworld.c
#include 
#include 
int main(void)
{
    double sec;
    struct timeval tv;

    gettimeofday(&tv, NULL);
    sec = tv.tv_sec;
    sec += tv.tv_usec/1000000.0;
    printf ("hello word!\nsec = %e\n", sec);
    return 0;
}

接下来是用 Autotools 为一个简单的程序 helloworld.c 生成 Makefile 文件的过程:

1. 用 autoscan 生成 configure.scan 文件:

进入 helloworld.c 所在的文件夹,执行:

autoscan

这样会得到 configure.scan 文件,这个文件可以修改为 configure.in 。而 configure.in 是 Autoconf 必须的东西,里面包含了一些宏的调用,可以测试系统里存在的和可以使用的包。

在这里 helloworld 的例子里,把 configure.scan 修改为 configure.in 只要修改三行,第一行是修改的,后面两行直接添加:

AC_INIT(helloworld.c)
AM_INIT_AUTOMAKE(helloworld,1.0)
AC_CONFIG_FILES([Makefile])

AC_INIT 宏用来定义软件包里的文件路径,这个简单例子里只有 helloworld.c 一个文件, AM_INIT_AUTOMAKE 描述了将要生成的软件包的名字及其版本号。AC_CONFIG_FILES 用来生成对应的 Makefile 文件,具体里面的其他参数可以参考这个网页

2. 用 aclocal 生成 aclocal.m4:

aclocal

m4 是一个宏处理器,用来处理本地的宏定义。

3. 用 autoconf 生成 configure:

autoconf

这样可以生成 configure 脚本,用于自动配置软件源代码脚本。

4. 用 autoheader 生成 config.h.in:

autoheader

config.h.in 包含了 configure 所定义的宏,实质是个模板文件,打开可以看到对头文件的定义。configure.in 里的那句 AC_CONFIG_HEADERS 就是用来搜索这个文件的。

5. 创建一个 Makefile.am 文件,里面写入:

AUTOMAKE_OPTIONS=foreign
bin_PROGRAMS=helloworld
helloworld_SOURCES=helloworld.c

其中的 AUTOMAKE_OPTIONS 为设置 automake 的选项。由于 GNU 对自己发布的软件有严格的规范,比如必须附带许可证声明文件 COPYING 等,否则 automake 执行时会报错。automake 提供了三种软件等级:foreign、gnu 和 gnits ,让用户选择采用,默认等级为 gnu。在本例使用 foreign 等级,它只检测必须的文件。

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

hello_SOURCES 定义“hello”这个执行程序所需要的原始文件。如果”helloworld”这个程序是由多个原始文件所产生的,则必须把它所用到的所有原始文件都列出来,并用空格隔开。例如:若目标体“hello”需要“hello.c”、“sunq.c”、“hello.h”三个依赖文件,则定义hello_SOURCES=hello.c sunq.c hello.h。

6. 用 automake 命令生成 configure.in 文件:

automake --add-missing

参数 –ad-missing 是 add missing standard files to package ,它会让 automake 加入一个标准的软件包所必须的一些文件。

7. 执行 ./configure 命令把 makefile.in 变成最终的 makefile 文件。然后执行 make 就会把 helloworld 程序编译,最后用 ./helloworld 运行就可以了。

11 responses so far

  • lyxint says:

    为什么都要sudo cmd呢?

    [Reply]

    feicun Reply:

    @lyxint, 因为在用make装软件的时候我发现很多时候没有root权限会导致编译失败,所以做makefile的时候也就用sudo了,这个用多了会有副作用吗?

    [Reply]

    lyxint Reply:

    @feicun, 我只是觉得看起来不美观。。。

    P.S. 代码高亮插件有问题啊。 include后面的头文件没出来。。

    [Reply]

    feicun Reply:

    @lyxint, 话说,你wp用的什么代码高亮插件?求推荐

    [Reply]

    jesse Reply:

    @feicun, 这个… 编译的时候最好不要用 sudo 。我自己编的东西都装到 /home 下,所以 make install 也可以不用 sudo 的。

    [Reply]

    feicun Reply:

    @jesse, 嗯,我把sudo都去掉了。博客好久没看了,都快废了

    [Reply]

  • wayne says:

    sudo时声称的文件owner和group不一样的。只要在make install时sudo就好

    [Reply]

  • lyxint says:

    代码高亮我用的wp-syntax, 我觉得挺好用的.

    [Reply]

    feicun Reply:

    @lyxint, 好,我试试去

    [Reply]

  • Todd says:

    以前一直只知道你有一个音乐网站, 今天才看到这里. 哈哈, 准备来美国吗?

    [Reply]

    feicun Reply:

    @Todd, 是啊,如果老婆settle down了那我更要去美国了。

    [Reply]

Leave a Reply