`
conkeyn
  • 浏览: 1512469 次
  • 性别: 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`文件。这个文件是`...

    autobook

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

    autoconf实例

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

    linux下c编程注意事项2

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

    autotools建立makefile实例解析

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

    autoconf 工具

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

    Automake使用实例

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

    automake_example

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

    嵌入式学习步骤嵌入式学习步骤.doc

    * Autoconf 和 Automake 使用 * Makefile 规则和代码优化 嵌入式系统开发 * 嵌入式系统概述和交叉编译配置 * TFTP 服务和 NFS 服务配置 * Bootloader 和内核编译和下载 * 嵌入式 Linux 应用软件开发流程 * ARM ...

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

    - GNU自动化构建工具: Autoconf, Automake, Libtool。 获取文本它的目标读者是熟悉Unix开发的人(即假定具有shell、make、C和Unix的基本知识),这些人希望学习使用这些工具,或者只是了解它们的用途。 这些文件是在...

    GNU linux工具

    1. **GNU Autotools**:Autotools是一组自动化工具,包括Autoconf、Automake和Libtool,它们帮助开发者创建可以在多种Unix-like系统上编译的源代码包。Autoconf自动生成configure脚本,使得软件能够检测主机系统的...

    linux开发文档大全(10个文档一起打包共享)

    Automake和Autoconf是GNU项目中的一对自动化构建工具,用于生成跨平台的Makefile。文档将解释如何使用这两者来配置、编译和打包源代码,确保软件在不同的系统上可以正确编译。 7. **automake2.pdf, automake3.pdf,...

    curl-7.50.1.tar.gz

    7. **Makefile.am**和**configure.ac**:这两个文件是用于构建过程的,它们通过automake和autoconf工具自动生成Makefile。 8. **INSTALL**和**README**:提供安装和使用curl的指导。 构建curl-7.50.1的过程通常...

    gcc_first.rar_gcc ja_gcc java_gcc-ja_gdb_makefile

    autoconf automake实例gcc编译java方法.txt,gcc的组件和软件工具 .txt,gcc库.txt,gdb自己总结.txt,linux 下gcc 编程.ppt,linux下JAVA环境设置.pdf,Vi指令大全.htm,跟我一起写 Makefile.pdf

    达内培训unix电子教案

    了解Makefile和构建工具如autoconf、automake可以帮助开发者自动化编译和构建过程。 Unix还提供了强大的调试工具,如gdb(GNU调试器)和valgrind(内存错误检测工具)。此外,性能分析工具如strace(跟踪系统调用)...

    053104源码编译安装1

    `configure`脚本通常是软件自带的,由`automake`或`autoconf`等工具生成。 - `make`:执行`make`命令,根据生成的`makefile`进行编译。 - `make install`:编译完成后,使用`make install`将编译好的软件安装到...

    keepalived1.3.5及其所需依赖包

    9. **automake**: 用于生成Makefile.am的工具,辅助构建过程。 安装这些依赖包通常使用`yum install`命令,例如: ```bash sudo yum install -y ncurses-devel gcc make zlib-devel openssl-devel pcre-devel ...

    UNIX环境高级编程

    同时,了解自动化构建工具如automake和autoconf的使用。 11. **安全性和权限**:理解UNIX的安全模型,包括用户和组的概念,以及chmod、chown和chgrp等命令的使用,以确保系统的安全。 这本书不仅适合有经验的UNIX...

Global site tag (gtag.js) - Google Analytics