Automake 学习笔记之一:The Introduction / Example Of GNU Autoconf, Automake And Libtool

1.本文章遵从” 署名-非商业性使用 2.5 中国大陆 (CC BY-NC 2.5 CN)”

2.  转载或引用本文档中的内容须注明 “资料来源:HB@ Technical Document” 字样





Autoconf/automake/libtool是GNU Autotools家族里用来自动生成makefile 和 configure的工具, 有了它, 

我们就不用去写那么繁琐的各种角本文件,用它我们就可以自动生成各个角本文件,来管理和组织我们的代码项目。

Autotools不但是一个工程建设系统,也可以用来做一些系统环境兼容性检测。正因为有了它, 我们可以用

1.  ./configure

2.  Make

3.  make install

这三步曲去编译我们的项目。下面来用一个很简单的helloautoconf 例子来说明怎么使用它。

Step 1: Install autoconf、automake、libtool

和其它GNU工具一样,使用它之前我们要在自己的系统环境中安装。

sudo apt-get install autoconf automake libtool

这里我们看到我们一起安装了三个工具,其中,autoconf是在你编译之前,用来做一些测试,检测你的各个配制是不是正确,环境变量设置是不是符合项目的要求。

Automake是来用生成Makefile,同时它也完成各个文件之间依赖性检测。

Libtool是一个命令行接口,用来完成静态或者共享库的连接。

完成上面的安装之后,我们可以用下面的命令去检测你是否安装成功:

dpkg -l autoconf

dpkg -l automake

dpkg -l libtool

你也可以用 apt list [tool name] 来检测。

Step 2: program testing C file

创建一个测试目录:

mkdir my-autoconf

这里我们用一个很简单的C语言文件my-autoconf.c来作为我们的测试文件,如下:

#include<stdio.h>                                                                                                               
 int main()                                                                                       
  {                                                                                                
          printf("Hello autoconf! \n");                                                            
          return 0;                                                                                
  }                                                                                                     

Step 3: runautoscan

直接在my-autoconf目录下运行:

Autoscan

autoscan可以用目录名做为参数,但如果你不使用参数的话,那么autoscan将认为使用的是当前目录下。autoscan将扫描你所指定目录中的源文件,并创建configure.scan和autoscan.log两个文件。

其中autoscan.log只是一个记录文件,里面是空。

Step 4: modify configure.scan

configure.scan包含了系统配置的基本选项,里面都是一些宏定义。这里我们要做一些修改,以符合我们自己的工作要求。自动生成的configure.scan如下,非常简单。


#                                            -*- Autoconf -*-

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

AC_PREREQ([2.69])// 确保是新的Autoconf

AC_INIT([FULL-PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS]) //初始化,定义软件的基本信息,包括设置包的全称,版本号以及报告BUG时需要用的邮箱地址

AC_CONFIG_SRCDIR([my-autconf.c]) //用来侦测所指定的源码文件是否存在,来确定源码目录的有效性

AC_CONFIG_HEADERS([config.h]) //用于生成config.h文件,以便autoheader使用

# 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


经过修改:

#                                               -*- Autoconf -*-                                                                    
# Process this file with autoconf to produce a configure script.
AC_PREREQ([2.69])
AC_INIT(autoconf-test, 1.0, jackyard88@gmail.com) //工程或者项目的名称,版本号和维护者的联系方式。
AC_CONFIG_SRCDIR([my-autoconf.c]) 
AC_CONFIG_HEADERS([config.h])
AM_INIT_AUTOMAKE(main,1.0)  //添加AM_INIT_AUTOMAKE,这里的名
# 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]) //增加输出makefile, 如果有了目录要生成makefile, 也要在这里指定,可以用AC_CONFIG_FILES,之间用空格隔开。如:AC_CONFIG_FILES([ Makefile src/Makefile])  

完成上面的修改之后,重命名configure.scanconfigure.ac.

注意在老的版本的autotool,可能是要求重命名为configure.in,但configure.in也可以在新的版本的autotool上通过,只是会有一个提示warning.

Step 5: Generate configure

1.  run aclocal

aclocal是一个perl脚本程序。aclocal根据configure.ac文件的内容,自动生成aclocal.m4文件和一个autom4te.cache缓冲文件夹

aclocal的定义是:“Generate'aclocal.m4' by scanning 'configure.ac' or 'configure.in'”.

2.   run autconf

这时我们就可以在当录下多了一个configure文件。

Step 6: generate config.h.in

Config.h.in是一个临时的C#define文件,也就是config.h的模版。它可以通过autoheader工具来自动生成,它主要是通过查找在configure中的AC_CONFIG_HEADERS定义,来决定要不要在config.h.in中增加相关的#define宏定义。也可以从“acconfig.h”文件中复制用户附加的符号定义,因为我们这里没有复杂的用例,也没有附加符号定义,所以我们就不需要创建acconfig.h详解可以查看下面的链接:

https://www.gnu.org/software/autoconf/manual/autoconf-2.66/html_node/autoheader-Invocation.html

这里我们就直接运行autoheader在当前目录下:

autoheader

完成上面的命令,你就可以看到又多了一个文件:config.h.in,其实里面就是一些宏定义。

Step 7: generate makefile.in

Makefile.in是生成makefile的关键文件,但它是automake工具通过读取makefile.am文件的定义来生成的。Makefile.am通常由我们用户开发者自己根据你的项目的组织结构来编写.这里的.am代表的是automake。

对我们的这里的例子,makefile.am非常简单,只要有三个代码就可以了,如下:


AUTOMAKE_OPTIONS=foreign
bin_PROGRAMS=autoconf
autoconf_SOURCES=my-autoconf.c

AUTOMAKE_OPTIONS是automake的选项,在远行automake时,它会去检测目录下是否有GNU的软件包应该具备的各种文件,通常情况下,我们拿到一个GNU开源的软件包,里面一般会一些非常熟习的文件,如README,Changelog, INSTALL 等等。这个宏就是用来查看这些文件的。我们这里指定的选项是foreign, automake提供了三种软件等级,foreign、gnu和gnits,让用户选择采用,默认等级为gnu。

bin_PROGRAMS用来指定要产生的执行文件名。如果要产生多个执行文件,每个文件名用空格隔开。我们这里只有一个。

autoconf_SOURCES定义“autoconf”这个执行目标文件所需要的原文件。如果它是由多个原文件生成,我们要把它们都列在这里,并用空格隔开。

注意,这里的执行文件的名称可以是随意指定,但是名称中不能有“-”。

在运行automake时,我们要用到—add-missing选项,它是“add missing standard files to package”

Automake --add-missing

通过上面的命令后,我们就可以在当前目录下,看到有一个makefile.in和一些链接文件。

注:对于有子目录的,顶层的Makefile.am只是指定目录名,如下:

Makefile.am


SUBDIRS = src
dist_doc_DATA = README.md

src/Makefile.am

bin_PROGRAMS = autotools_hello_world
autotools_hello_world_SOURCES = main.c

Step 8: generate Makefile

OK,终于到了最后, 我们可以通过configure去生成makefile文件,再通过make去编译,最后通过make install 去安装到相应的目录下。


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值