Autoconfautomake step by step

    技术2025-09-30  39

    Autoconf/automake 在开源社区里,它的重要性可以说不下于 gcc ,目前除了 Xfree86 外,几乎所有的开源项目都使用 Autoconf/automake ,甚至 Xfree86 的开发人员已经计划抛弃 imake ,而采用 Autoconf/automake 作为工程管理工具了。

     

    Autoconf/automake 冗长的手册让我犯晕。虽然我曾耐着性子浏览过一遍,但是决大部分内容,在日常工作根本用不上。加上建立工程的机会并不多,等到下一次要建立时,上次学到的知识早忘光了,还得去看手册,真是麻烦。

     

    大多数时候,我更需要的是 step by step 的指南,只有在特殊情况下,要使用 Autoconf/automake 的高级功能时候,我才愿意去查手册。最近刚好建过几个工程,记个笔记吧,以便下次查阅。

     

    一、建立可执行文件工程。

    l          前提:

    项目目录: helloworld

    源文   件: helloworld/src/helloworld.c

     

    l          autoscan 产生 configure.in 的框架:

    [root@linux helloworld]# autoscan

    [root@linux helloworld]# mv configure.scan configure.in

     

    打开 configure.in ,我们可以看到:

    #                                               -*- Autoconf -*-

    # 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([src/helloworld.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_OUTPUT

    这个文件并不能直接使用,要做几处修改才行。

    AC_INIT 的参数要换成实际的参数。

    AC_OUTPUT 中要指明实际要生成的文件。

    增加 automake 的初始化宏。

    我们把它修改为:

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

     

    AC_PREREQ(2.59)

    AC_INIT(helloworld, 0.1, jim@jim.com)

    AC_CONFIG_SRCDIR([src/helloworld.c])

    AC_CONFIG_HEADER([config.h])

    AM_INIT_AUTOMAKE(helloworld, 0.1)

     

    # 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_OUTPUT([

    Makefile

    src/Makefile

    ])

     

    l          建立根顶层目录中的 Makefile.am ,用 SUBDIRS 指明子目录。

    SUBDIRS=src

     

    l          建立 src 目录中的 Makefile.am ,这里我们生成的可执行文件名为 helloworld ,安装目录为 ${prefix}/bin 。如果只想编译,不想安装到系统中,可以用 noinst_PROGRAMS 代替 bin_PROGRAMS

    bin_PROGRAMS=helloworld

    helloworld_SOURCES=helloworld.c

     

    l          在顶层目录中建立几个空文件。

    [root@linux helloworld]# touch NEWS README ChangeLog AUTHORS

    l          拷贝 automake 必要的文件。

    [root@linux helloworld]# cp -f /usr/share/automake-1.9/depcomp .

    [root@linux helloworld]# cp -f /usr/share/automake-1.9/compile .

     

    l          建立 autogen.sh

    #!/bin/bash

    aclocal

    autoheader

    autoconf

    automake -a

    ./configure

    [root@linux helloworld]# chmod 755 autogen.sh

    l          测试一下

    [root@linux helloworld]# ./autogen.sh ;make;make install

    OK

     

    二、建立共享库工程。

    l          前提:

    项目目录: helloworld

    源文   件: helloworld/src/helloworld.c

    头文   件: helloworld/src/helloworld.h

    l          autoscan 产生 configure.in 的框架:

    [root@linux helloworld]# autoscan

    [root@linux helloworld]# mv configure.scan configure.in

     

    打开 configure.in ,我们可以看到:

    #                                               -*- Autoconf -*-

    # 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([src/helloworld.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_OUTPUT

    这个文件并不能直接使用,要做几处修改才行。

    AC_INIT 的参数要换成实际的参数。

    AC_OUTPUT 中要指明实际要生成的文件。

    增加 automake 的初始化宏。

    增加 libtool 检查。

    我们把它修改为:

    #                                               -*- Autoconf -*-

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

     

    AC_PREREQ(2.59)

    AC_INIT(helloworld, 0.1, jim@jim.com)

    AC_CONFIG_SRCDIR([src/helloworld.c])

    AC_CONFIG_HEADER([config.h])

    AM_INIT_AUTOMAKE(helloworld, 0.1)

     

    # Checks for programs.

    AC_PROG_CC

    AC_LIBTOOL_DLOPEN

    AC_PROG_LIBTOOL

     

    # Checks for libraries.

     

    # Checks for header files.

     

    # Checks for typedefs, structures, and compiler characteristics.

     

    # Checks for library functions.

    AC_OUTPUT([

    Makefile

    src/Makefile

    ])

     

    l          建立根顶层目录中的 Makefile.am ,用 SUBDIRS 指明子目录。

    SUBDIRS=src

     

    l          建立 src 目录中的 Makefile.am ,这里我们生成的共享文件名为 libhelloworld.la ,安装目录为 ${prefix}/lib ,头文件安装到 ${prefix}/include/helloworld/

    lib_LTLIBRARIES       = libhelloworld.la

     

    libhelloworld_la_SOURCES=helloworld.c

    libhelloworld_la_CFLAGS=-I./

    libhelloworld_la_LDFLAGS=

     

    helloworldincludedir=$(includedir)/helloworld

    helloworldinclude_HEADERS= helloworld.h

     

    l          在顶层目录中建立几个空文件。

    [root@linux helloworld]# touch NEWS README ChangeLog AUTHORS

    l          拷贝 automake libtool 必要的文件。

    [root@linux helloworld]# cp -f /usr/share/automake-1.9/depcomp .

    [root@linux helloworld]# cp -f /usr/share/automake-1.9/compile .

    [root@linux helloworld]# cp -f /usr/share/libtool/ltmain.sh .

    l          建立 autogen.sh

    #!/bin/bash

    aclocal

    autoheader

    autoconf

    automake -a

    ./configure

    [root@linux helloworld]# chmod 755 autogen.sh

    l          测试一下

    [root@linux helloworld]# ./autogen.sh ;make;make install

    OK

     

    转自:http://blog.csdn.net/absurd/archive/2006/06/12/792397.aspx

    最新回复(0)