`
conkeyn
  • 浏览: 1529319 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

运用autoconf和automake自动生成Makefile实例讲解

阅读更多

运用 autoconf automake 自动生成 Makefile 实例讲解

http://hi.baidu.com/vctianya/blog/item/dd1a1c7a14118fee2e73b3c8.html

 

对于一个 UNIX/Linux C 程序员来说,一个比较麻烦的工作就是写自己的 Makefile
可能你有如下经验:写一个简单的 C 程序,自己多写几行 gcc 命令就把程序变成可执行的了;写一个稍微复杂点的程序,源文件个数可能在 30 个左右,还是写一行行的 gcc 命令就麻烦了,你可能想到写个 makefile ,你可能也在这样做着;但你某一天会发现你写的这个 Makefile 可能不是一个所有 UNIX/Linux 类操作系统下通用的 Makefile ,比如某人下载了你的程序去他自己电脑上可能 make 不了。

这样,你就有必要了解并学会运用 autoconf automake 了。
autoconf
是一个用于生成可以自动地配置软件源代码包以适应多种 UNIX 类系统的 shell 脚本的工具。由 autoconf 生成的配置脚本在运行的时候不需要用户的手工干预;通常它们甚至不需要手工给出参数以确定系统的类型。相反,它们对软件包可能需要的各种特征进行独立的测试。在每个测试之前,它们打印一个单行的消息以说明它们正在进行的检测,以使得用户不会因为等待脚本执行完毕而焦躁。因此,它们在混合系统或者从各种常见 UNIX 变种定制而成的系统中工作的很好。你也省了工作,没必要维护文件以储存由各个 UNIX 变种、各个发行版本所支持的特征的列表。
automake
是一个从文件 Makefile.am 自动生成 Makefile.in 的工具。每个 Makefile.am 基本上是一系列 make 的宏定义( make 规则也会偶尔出现)生成的 Makefile.in ,服从 GNU Makefile 标准。
为了生成 Makefile.in automake 需要 perl 。但是由 automake 创建的发布完全服从 GNU 标准,并且在创建中不需要 perl

在开始使用 autoconf automake 之前,首先确认你的系统安装有 GNU 的如下软件:
1. automake
2. autoconf
3. m4
4. perl
5.
如果你需要产生共享库( shared library )则还需要 GNU Libtool

介绍方法之前大家看一下下面这个图,先记下 autoconf automake 工作的几个步骤:
<!-- --><!-- --><!-- -->

步骤解释如下:
1
、由你的源文件通过 autoscan 命令生成 configure.scan 文件,然后修改 configure.scan 文件并重命名为 configure.in
2
、由 aclocal 命令生成 aclocal.m4
3
、由 autoconf 命令生成 configure
4
、编辑一个 Makefile.am 文件并由 automake 命令生成 Makefile.in 文件
5
、运行 configure 命令生成 Makefile

automake
支持三种目录层次: flat shallow deep
一个 flat 包指的是所有文件都在一个目录中的包。为这类包提供的 Makefile.am 不需要 SUBDIRS 这个宏。这类包的一个例子是 termutils 。对应咱们程序员来说:就是所有源文件及自己写的头文件都位于当前目录里面,且没有子目录。
一个 deep 包指的是所有的源代码都被储存在子目录中的包;顶层目录主要包含配置信息。 GNU cpio 是这类包的一个很好的例子, GNU tar 也是。 deep 包的顶层 Makefile.am 将包括宏 SUBDIRS ,但没有其它定义需要创建的对象的宏。对应咱们程序员来说:就是所有源文件及自己写的头文件都位于当前目录的一个子目录里面,而当前目录里没有任何源文件。
一个 shallow 包指的是主要的源代码储存在顶层目录中,而各个部分(典型的是库)则储存在子目录中的包。 automake 本身就是这类包( GNU make 也是如此,它现在已经不使用 automake )。对应咱们程序员来说:就是主要源文件在当前目录里,而其它一些实现各部分功能的源文件各自位于不同目录。

前两个层次的程序编辑方法非常简单,按照上述步骤一步步即可。而第三种层次 shallow 稍微复杂一点,但这是我们经常写程序用到的结构。下面以一个例子说明 shallow 层次结构的源文件如何自动生成 Makefile 文件。
例子源程序结构如下:
hello
是我们的工作目录, hello 目录下有 main.c 源文件和 comm tools db network interface 等五个目录。 comm 目录下有 comm.c comm.h 源文件及头文件, tools 目录下有 tools.c tools.h ,同样其它目录分别有 db.c db.h network.c network.h interface.c interface.h 等一些源文件。

按照如下步骤来自动生成 Makefile 吧:
1
、进入 hello 目录,运行 autoscan 命令,命令如下:
cd hello
autoscan
2
ls 会发现多了一个 configure.scan 文件。修改此文件,在 AC_INIT 宏之后加入 AM_INIT_AUTOMAKE(hello, 1.0) ,这里 hello 是你的软件名称, 1.0 是版本号,即你的这些源程序编译将生成一个软件 hello-1.0 版。然后把 configure.scan 文件的最后一行 AC_OUTPUT 宏填写完整变成 AC_OUTPUT(Makefile) ,表明 autoconf automake 最终将生成 Makefile 文件。最后把 configure.scan 文件改名为 configure.in 。最终 configure.in 文件内容如下:

# Process this file with autoconf to produce a configure script.
AC_INIT(target.c)
AM_INIT_AUTOMAKE(hello, 1.0)
# 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)

3
、运行 aclocal 命令, ls 会发现多了一个 aclocal.m4 文件。
4
、然后运行 autoconf 命令, ls 将发现生成了一个可执行的 configure 命令。
5
、编辑一个 Makefile.am 文件,文件内容如下:
AUTOMAKE_OPTIONS=foreign
bin_PROGRAMS=hello
hello_SOURCES=main.c comm/comm.c comm/comm.h tools/tools.c tools/tools.h db/db.c db/db.h network/network.c network/network.h interface/interface.c interface/interface.h
这表明你最后将通过一个 make 命令利用上述 hello_SOURCES 源文件生成一个 hello 的程序。
6
、运行 automake --add-missing 命令。屏幕提示如下:
automake: configure.in: installing `./install-sh'
automake: configure.in: installing `./mkinstalldirs'
automake: configure.in: installing `./missing'
7
、然后你可以运行之前生成的 configure 命令来生成一个 Makefile 文件,输入 ./configure 命令即可。
8
、编辑 Makefile 文件,找到 $(LINK) 所在的那一行,本来生成的文件内容如下:
@rm -f hello
$(LINK) $(hello_LDFLAGS) $(hello_OBJECTS) $(hello_LDADD) $(LIBS)
在这两行之间增加几行变成:
@rm -f hello
@mv -f comm.o comm
@mv -f tools.o tools
@mv -f db.o db
@mv -f network.o network
@mv -f interface.o interface
$(LINK) $(hello_LDFLAGS) $(hello_OBJECTS) $(hello_LDADD) $(LIBS)
这是因为默认生成的 Makefile 将在编译后把所有目标文件置于当前目录,而在进行链接 (link) 时又会到各个子目录去找相应的目标文件。
当然,为了完整,建议各位在 clean 部分加上如下一些行:
@rm -f comm/comm.o
@rm -f tools/tools.o
@rm -f db/db.o
@rm -f network/network.o
@rm -f interface/interface.o

好了,经过上述这些步骤后,现在你可以来编译生成你自己的可执行程序了。输入一个 make all 吧,然后就可以运行 ./hello 来看你的程序运行了。

运用 autoconf automake 的最大好处是,你的程序以源程序方式发布后,其它所有人只需要依次输入
./configure
make
make install
命令就可以把你的程序安装在自己的电脑上运行了。所有符合 GNU 标准的 UNIX/Linux 都不需要再修改 Makefile 里的任何字符。

 

  • 大小: 4.5 KB
分享到:
评论

相关推荐

    automake工具生成makefile的一个实例

    在Linux和Unix环境中,`automake`是一个自动化工具,它帮助开发者生成符合GNU标准的`Makefile.in`文件,这些文件随后会被`autoconf`处理,生成用户友好的`configure`脚本,使得软件编译过程更加标准化和跨平台。...

    automake生成makefile的工具

    这个文档很可能提供了使用Automake的实例,包括如何配置Makefile.am文件,如何运行Automake和Autoconf命令,以及可能出现的问题和解决方法。通过阅读这个文档,你可以更深入地理解Automake的实际应用。 总的来说,...

    autofile生成makefile实例

    `automake`和`autoconf`是两个与`Makefile`紧密相关的工具,它们可以帮助开发者创建跨平台、符合GNU标准的构建系统。 `automake`是GNU项目的一部分,主要用于自动生成符合GNU标准的`Makefile.in`文件。这个文件是`...

    Autotools : a practitioner's guide to GNU Autoconf, Automake, and Libtool

    紧接着,作者进一步深入讲解了高级细节,包括如何在Autoconf中使用M4宏处理器,如何扩展Automake提供的框架,以及如何构建Java和C#源代码。本书的高潮部分,作者提供了初学者在使用Autotools时经常遇到的问题的详细...

    automake help

    4. **生成Makefile.in**:运行autoconf和automake命令,基于configure.in和Makefile.am文件(Automake的输入),生成configure脚本和Makefile.in。configure脚本会在构建前运行,检测系统环境并自定义Makefile。 5....

    autobook

    GNU Autoconf和Automake是两个广泛使用的工具,它们帮助开发者创建跨平台的、符合GNU标准的Makefile。本指南将深入讲解这两个工具的使用方法和原理。 **GNU Autoconf** Autoconf是一个生成配置脚本的程序,这些...

    autoconf实例

    在IT行业中,构建自动化工具是开发过程中的重要一环,其中`autoconf`是一个广泛使用的开源工具,主要用于生成跨平台的配置脚本,使源代码能够适应不同的操作系统和编译环境。`autoconf`通过自动检测系统特性并生成...

    autotools简介

    Autotools是一套用于在Unix-like操作系统上自动化生成软件构建系统的工具集,这包括了autoconf、automake和libtool等多个组件,目的是帮助开发者轻松编写可以在多种类Unix系统上编译和安装软件的脚本。这套工具链...

    linux下c编程注意事项2

    为此,Linux提供了autoconf和automake两个工具,它们能够自动生成Makefile,使得软件的构建、安装更加简便。许多知名的开源软件,如Apache和MySQL,都利用这两个工具实现自动编译。 首先,确保系统已经安装了...

    Autotools A Practioner's Guide

    GNU Autoconf 是一个用于生成自动配置脚本的工具,它可以让开发者编写一次代码,然后在各种Unix-like操作系统上进行配置。它通过检查编译器、库和其他系统特性来决定是否需要对源代码进行特定的修改以适应目标平台。...

    autotools建立makefile实例解析

    `autotools`包括了多个工具,如`aclocal`、`autoscan`、`autoconf`、`autoheader`和`automake`,它们共同作用于项目,生成适应多种平台的配置脚本和Makefile。 首先,我们来看第一步,`autoscan`的使用。这个工具会...

    automake官方手册

    - **创建amhello-1.0.tar.gz**: 这一步涉及使用`autoreconf`或`autoconf`和`automake`命令来生成初始的构建脚本和Makefile模板。 - **解读amhello的`configure.ac`**: 这个文件包含了Autoconf宏,用于检查系统特性、...

    PPT教学课件《嵌入式Linux培训讲座》

    - 使用Autoconf和Automake自动生成配置头文件和Makefile文件的过程主要包括以下几个步骤: 1. **源文件处理**:从源文件开始,使用`autoscan`生成`configure.scan`文件。 2. **生成配置脚本**:将`configure.scan`...

    Automake使用实例

    Automake 是一个工具,可以帮助开发者生成 Makefile,以便更好地管理和编译项目。在本文档中,我们将使用 Automake 对一个工程进行管理,并生成 Makefile 等文件。 Automake 的使用实例 首先,我们需要创建一个...

    autoconf 工具

    `autoconf`通常与`automake`一起使用,`automake`负责生成遵循GNU标准的Makefile.am文件,这些文件再由`autoconf`生成的`configure`脚本处理。这种组合提供了更完整的构建系统,使得项目更容易遵循GNU编程规范。 **...

    Autotool Tutorial(epita.fr) - Autorools使用教程PDF文档

    "配置过程"章节详细讲解了confgure脚本的作用,它是Autotools的核心部分,用于检测主机环境,生成Makefile以适应不同的编译和链接需求。这一过程对于确保软件能够正确地识别和利用系统上的各种库和特性至关重要。 ...

    AutoMake 中文手册

    - **AutoMake**:作为GNU项目的一部分,AutoMake是一种辅助工具,用于自动生成`Makefile.in`文件,这些文件随后会在软件构建过程中被配置成特定于平台的`Makefile`文件。 #### 二、通用性概念 - **通用操作**:...

    automake_example

    `automake`会根据这些文件生成`Makefile.in`,然后`autoconf`将这个模板转化为具体的Makefile,适应用户的系统环境。 在C++的实例中,情况类似,但可能会涉及到`.cpp`和`.hpp`文件。`automake`会处理链接C++库和...

Global site tag (gtag.js) - Google Analytics