automake - 使用 autotools 工具集

一般而言,对于小项目或玩具程序,手动编写 Makefile 即可。但对于大型项目,手动编写维护 Makefile 成为一件费时费力的无聊工作。

本文介绍 autotools 工具集自动生成符合 Linux 规范的 Makefile 文件。

如果读者没有安装 autotools 工具集,安装命令如下,

$ sudo apt-get install automake

安装完成之后,会有如下工具可用,

aclocal
     autoscan
     autoconf
     autoheader
     automake

一般大型项目,代码组织结构分为两种,一种是所有文件都在一个目录下的 flat 结构,另一种是按层次组织的多文件夹形式。先来看第一种,

flat 结构的项目使用 autotools 工具集

本篇测试代码如下,

入口代码  int_arithmetic.c

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include "sum.h"
#include "sub.h"
#include "mul.h"
#include "div.h"

int main()
{
    printf("======== < Integer Arithmethic > ========\n");
    int x, y;
    printf("Enter two integer: ");
    scanf("%d%d", &x, &y);

    int sm = sum(x, y);
    printf("sum is: %d\n", sm);
    int sb = sub(x, y);
    printf("sub is: %d\n", sb);
    int ml = mul(x, y);
    printf("mul is: %d\n", ml);
    int dv = divide(x, y);
    printf("div is: %d\n", dv);

    return 0;
}

辅助代码,头文件,

sum.h

#ifndef SUM_H_
#define SUM_H_

int sum(int x, int y);

#endif

sub.h

#ifndef SUB_H_
#define SUB_H_

int sub(int x, int y);

#endif

mul.h

#ifndef MUL_H_
#define MUL_H_

int mul(int x, int y);

#endif

div.h

#ifndef DIV_H_
#define DIV_H_

int divide(int x, int y);

#endif

辅助代码,实现文件,

sum.c

#include "sum.h"

int sum(int x, int y)
{
    return x + y;
}

sub.c

#include "sub.h"

int sub(int x, int y)
{
    return x - y;
}

mul.c

#include "mul.h"

int mul(int x, int y)
{
    return x * y;
}

div.c

#include "div.h"
#include <stdio.h>

int divide(int x, int y)
{
    if(x % y != 0)
        printf("\nWarning: Integer Division May Have Accuracy Loss.\n");

    return x / y;
}

1) 在项目文件夹下,运行 autoscan 命令,扫描项目目录,生成 configure.scan 文件,内容如下,

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

AC_PREREQ([2.69])
AC_INIT([FULL-PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS])
AC_CONFIG_SRCDIR([int_arithmetic.c])
AC_CONFIG_HEADERS([config.h])

# Checks for programs.
AC_PROG_CC

# Checks for libraries.

# Checks for header files.
AC_CHECK_HEADERS([stdlib.h unistd.h])

# Checks for typedefs, structures, and compiler characteristics.

# Checks for library functions.
AC_OUTPUT

重命名 configure.scan 为 configure.ac ,并修改其内容为,

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

AC_PREREQ([2.69])
#AC_INIT([FULL-PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS])
AC_INIT(int_arithmetic, 0.1, [email protected])
AM_INIT_AUTOMAKE(int_arithmetic, 0.1)
AC_CONFIG_SRCDIR([int_arithmetic.c])
AC_CONFIG_HEADERS([config.h])

# Checks for programs.
AC_PROG_CC

# Checks for libraries.

# Checks for header files.
AC_CHECK_HEADERS([stdlib.h unistd.h])

# Checks for typedefs, structures, and compiler characteristics.

# Checks for library functions.
AC_CONFIG_FILES([Makefile])
AC_OUTPUT

上述 configure.ac 中宏定义意义如下,

AC_PREREQ         : 声明 autoconf 的版本号AC_INIT           : 声明软件名称,版本号及 bug report 地址AM_INIT_AUTOMAKE  : automake 需要的信息,参数为软件名和版本号AC_CONFIG_SRCDIR  : autoscan 侦测的源文件名,用来确定目录的有效性AC_CONFIG_HEADERS : autoscan 定义要生成的头文件,后续 autoheader 要使用AC_PROG_CC        : 指定编译器,默认为 gccAC_CHECK_HEADERS  : autoscan 侦测到的头文件AC_CONFIG_FILES   : 指定生成 Makefile,如果是多目录结构,可指定生成多个Makefile,以空格分隔,例如,AC_CONFIG_FILES([Makefile src/Makefile])AC_OUTPUT         : autoscan 输出

2) 运行 aclocal,根据 configure.ac 生成 aclocal.m4 文件,该文件主要处理各种宏定义

3) 运行 autoconf,将 configure.ac 中的宏展开,生成 configure 脚本,这过程中可能会用到 aclocal.m4

4) 执行 autoheader,生成 config.h.in 文件,该命令通常会从 "acconfig.h” 文件中复制用户附加的符号定义。该例子中没有附加的符号定义, 所以不需要创建 "acconfig.h” 文件

5) 创建 Makefile.am 文件,automake工具会根据 configure.in 中的参量把 Makefile.am 转换成 Makefile.in 文件,最终通过 Makefile.in 生成 Makefile

AUTOMAKE_OPTIONS=foreign
bin_PROGRAMS=int_arithmetic
int_arithmetic_SOURCES=int_arithmetic.c sum.c sub.c mul.c div.c

对上述 makefile.am 中各标签的解释,

AUTOMAKE_OPTIONS       : 由于 GNU 对自己发布的软件有严格的规范, 比如必须附带许可证声明文件 COPYING 等,否则 automake 执行时会报错。                        automake 提供了3中软件等级: foreign, gnu, gnits, 默认级别是gnu, 在本例中,使用 foreign 等级,它只检测必须的文件。bin_PROGRAMS           : 要生成的可执行文件名称,如果要生成多个可执行文件,用空格隔开。int_arithmetic_SOURCES : 可执行文件依赖的所有源文件。

6) 手动添加必要的文件 NEWS,README,AUTHORS,ChangeLog

7) 执行 automake --add-missing ,该命令生成 Makefile.in 文件。使用选项 "--add-missing" 可以让 automake 自动添加一些必需的脚本文件。

8) 执行 ./configure 生成 Makefile

====>>> 至此 Makefile 生成完毕。

如果要继续安装,

9) $ make

10) $ sudo make install  即可将可执行文件安装在 /usr/local/bin/ 目录下,以后就可以直接使用啦

11)  $ sudo make uninstall 即可将安装的可执行文件从 /usr/local/bin 目录下移除

如果要发布你的软件,

12) $ make dist  即可打包生成 xxx-version.tar.gz 文件

如果要清理中间文件,

13) make clean

14) make distclean

多文件夹层次结构的项目使用 autotools 工具集

====>>> 感谢原创作者的分享  http://blog.csdn.net/initphp/article/details/43705765

完。

时间: 2025-01-01 21:24:22

automake - 使用 autotools 工具集的相关文章

(6)autotools工具的使用

   autotools是专门用来生成Makefile的一系列工具,包括autoscan.aclocal.autoheader.autoconf.automake等.     (1)autotools解决了什么问题 在大型项目中,使用手写Makefile时,可能会很复杂并难以维护: 在不同的编译环境,由于参数不同,需要手写不同的Makefile,增加了工作量:由于Makefile有一些复杂的参数,手写Makefil可能会不符合规范: autotools工具能够帮助开发人员简单而快捷地生成Make

IBM Rational-完整的软件工程解决方案工具集

IBM,即国际商业机器公司,1911年创立于美国,是全球最大的信息技术和业务解决方案公司,其业务遍及全球170多个国家和地区.IBM软件分为五个部分,其中Rational系列是专门针对软件工程的软件工具系列.IBM提供业内最佳工具集,使整个软件开发生命周期管理自动化并支持最佳实践.IBM Rational系列不但有工具的支持,更有理论方法的支持,通过优化开发过程的每个阶段,IBM的工具充分提高数据透明度.协同工作和验证能力,确保客户更快.更好地开发出软件和系统. 产品介绍 1. IBM Rati

解决 vs2010问题 error MSB8008: 指定的平台工具集(v110)未安装或无效

在VC++编译程序时,出现如下图所示的问题: >------ 已启动生成: 项目: PhotoStore, 配置: Debug Win32 ------ 1>生成启动时间为 2013-01-15 18:10:34. 1>C:\Program Files\MSBuild\Microsoft.Cpp\v4.0\Platforms\Win32\Microsoft.Cpp.Win32.Targets(511,5): error MSB8008: 指定的平台工具集(v110)未安装或无效.请确保选

binutils工具集之---addr2line

addr2line用于得到程序指令地址所对应的函数,以及函数所在的源文件名和行号. 在不少嵌入式开发环境中,编译器的名称往往不是gcc,而是想arm-rtems-gcc这样的,对于这种命名形式的编译器,读者通常可以找到arm-rtems-addr2line ,arm-rtems-objdump等相应名称的工具,这是GNU工具集的一种命名惯例. 本文并不是binutils工具集的完整参考手册,当需要得到更为详细的帮助信息时,可以参照对应工具的man和info信息.另一个更为简单的方法时运行相应的工

工具集

好用的工具集 转:http://www.yimingzhi.com/2015/03/lao-yi-de-kai-fa-gong-ju-he-lei-ku-ji-2014-ban Visual Studio 2013 扩展 Visual Studio 2013 Update 4:是目前微软发布的最新版开发工具升级包,高效而且强大.下面的扩展都是该版本的Visual Studio下的,老版本可以根据名字自行查找安装. CodeMaid: 可快速整理代码文件,清理不必要的代码和杂乱的格式.并在开发时实

Apache Commons 工具集

一.Commons BeanUtils http://jakarta.apache.org/commons/beanutils/index.html 说明:针对Bean的一个工具集.由于Bean往往是有一堆get和set组成,所以BeanUtils也是在此基础上进行一些包装. 使用示例:功能有很多,网站上有详细介绍.一个比较常用的功能是Bean Copy,也就是copy bean的属性.如果做分层架构开发的话就会用到,比如从PO(Persistent Object)拷贝数据到VO(Value O

[原创译书] JS函数式编程 2.3 函数式程序员的工具集

?? Functional Programming in Javascript 主目录第二章 函数式编程基础上一节 与函数共舞 函数式程序员的工具集 如果你仔细看了到目前为止出现过的示例代码,你会发现这里面的一些方法不太熟悉. 它们是map().filter()和reduce()函数,它们对任何语言的函数式编程都至关重要. 它们可以让你不必使用循环和语句,写出更简洁的代码. map().filter()和reduce()函数组成了函数式程序员工具集的核心部分,这个工具集包括一系列纯的. 高阶的函

Linux开发工具集

最近工作学了不少linux下的新东西,下面这些工具主要针对c/c++,以后慢慢补充一些好用的工具. 编辑器 vim emacs kate(KDE下一个功能强大的编辑器) IDE(集成开发环境) eclipse+cdt clion qt cteator 编译器 gcc g++ clang 调试器 gdb 构建工具 cmake make 内存工具 Purify Valgrind工具集 KCachegrind 剖析工具 gprof开源剖析工具,通常作为gcc编译器的一部分. Quantify是IBM的

vs2010问题 error MSB8008: 指定的平台工具集(v110)未安装或无效

vs2012上的项目导入到vs2010中,编译出现 1>------ 已启动生成: 项目: HelloGame.win32, 配置: Debug Win32 ------ 1>生成启动时间为 2014/10/8 17:53:45. 1>C:\Program Files\MSBuild\Microsoft.Cpp\v4.0\Platforms\Win32\Microsoft.Cpp.Win32.Targets(511,5): error MSB8008: 指定的平台工具集(v110)未安装