automake:hello automake

1059 篇文章 280 订阅

实践

$ mkdir helloword
$ cd helloworld
$ gedit helloworld.c

内容为:
#include <stdio.h>
int main(int argc, char** argv){
    printf("%s", "Hello, Linux World!\n");
    return 0;
}

保存退出

$ ls
helloworld.c

然后我们使用autoscan命令:

$ autoscan
$ ls
autoscan.log  configure.scan  helloworld.c
  • autoscan是 用来扫描源代码目录生成configure.scan文件的 .autoscan可以用目录名做为参数,但如果你不使用参数的 话,那么autoscan将认为使用的是当前目录.
  • autoscan将扫描你所指定目录中的 源文件,并创建configure.scan文件.
  • configure.scan包含了系统配置的 基本选项,里面都是 一些宏定义

执行autoscan之后,可以看出生成了两个东东autoscan.logconfigure.scan.

  • configure.scan就是我们要的模板文件的蓝本,里面全部是一些宏定义(这些宏定义经过autoconf处理之后会变成检测系统特性、环境变量、软件必修的参数的shell脚本):
    • AC_PREREQ 宏声明本文件要求的autoconf版本,本例使用的版本为2.69
    • AC_INIT 宏用来定义软件的名称和版本等信息:
      • ”FULL-PACKAGE-NAME”为软件包名称
      • ”VERSION”为软件版本号
      • ”BUG-REPORT-ADDRESS”为BUG报告地址(一般为软件作者邮件地址)。
    • AC_CONFIG_SRCDIR 宏用来侦测所指定的源码文件是否存在,来确定源码目录的有效性。此处为当前目录下的helloworld.c
    • AC_CONFIG_HEADER 宏用于生成config.h文件,以便autoheader使用
    • AC_PROG_CC 用来指定编译器,如果不指定,选用默认gcc
    • AC_OUTPUT 用来设定configure所要产生的文件,如果是makefile,configure会把它检查出来的结果带入makefile.ac文件产生合适的makefile。使用Automake时,还需要一些其他的参数,这些额外的宏用aclocal工具产生。
$ cat 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([helloworld.c])
AC_CONFIG_HEADERS([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

每个configure.scan文件都是以AC_INIT开头,以AC_OUTPUT结束。我们不难从文件中看出confiugre.scan文件的一般布局:

AC_INIT

 测试程序

 测试函数库

 测试头文件

 测试类型定义

 测试结构

 测试编译器特性

 测试库函数

 测试系统调用

AC_OUTPUT

上面的调用次序只是建议性质的,但我们还是强烈建议不要随意改变对宏调用的次序。

接下来要做的事情是将configure.scan重命名为configure.ac,然后修改它

$ mv configure.scan  configure.ac  // aclocal: warning: autoconf input should be named 'configure.ac', not 'configure.in'
$ gedit  configure.ac  

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

AC_PREREQ([2.69])
AC_INIT(helloworld.c)
AM_INIT_AUTOMAKE(helloworld, 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)
  • AM_INIT_AUTOMAKE初始化automake。传到这个宏里的参数是要编译的应用程序的名称和版本号(这些参数成为config.h中定义的PACKAGE和VERSION值)。 这个宏是 必须的 ,它描述了我们将要生成的 软件包的 名字及其版本号。当你使用make dist命令时,它会给你生成一个类似helloworld-1.0.tar.gz的 软件发行包,其中就有对应的 软件包的 名字和版本号.

然后接着执行下面命令

$ aclocal
$ ls
aclocal.m4  autom4te.cache  autoscan.log  configure.ac  helloworld.c
$ autoconf 
$ ls
aclocal.m4  autom4te.cache  autoscan.log   configure.ac  helloworld.c configure

执行autoconf之后,可以看到生成了一个configure工具, .configure是 一个脚本,它能设置源程序来适应各种不同的操作系统平台,并且根据不同的 系统来产生合适的 Makefile,从而可以使源代码能在不同的操作系统平台上被编译出来.

  • configure脚本能独立于autoconf运行,且在 运行的 过程中,不需要用户的 干预.
  • 要生成configure文件,你必须告诉autoconf如何找到你所用的宏。方式是使用aclocal程序来生成你的 aclocal.m4.
  • aclocal根据configure.in文件的 内容,自动生成aclocal.m4文件。aclocal是 一个perl 脚本程序,它的 定义是 :“aclocal - create aclocal.m4 by scanning configure.ac”.
  • autoconf从configure.in这个列举编译软件时所需要各种参数的 模板文件中创建configure.
  • autoconf需要GNU m4宏处理器来处理aclocal.m4,生成configure脚本.
  • m4是 一个宏处理器.将输入拷贝到输出,同时将宏展开.宏可以是 内嵌的 ,也可以是 用户定义的 .除了可以展开宏,m4还有一些内建的 函数,用来引用文件,执行命令,整数运算,文本操作,循环等.m4既可以作为编译器的 前端,也可以单独作为一个宏处理器.

新建Makefile.am文件,命令:

$ gedit Makefile.am

内容如下:
AUTOMAKE_OPTIONS=foreign
bin_PROGRAMS=helloworld
helloworld_SOURCES=helloworld.c

automake会根据你写的 Makefile.am来自动生成Makefile.in。Makefile.am中定义的 宏和目标,会指导automake生成指定的 代码

  • AUTOMAKE_OPTIONS 为设置Automake的选项。由于GNU对自己发布的软件有严格的规范,比如必须附带许可证声明文件COPYING等,否则Automake执行时会报错。Automake提供了3种软件等级:foreign、gnu和gnits,供用户选择,默认等级为gnu。本例使需用foreign等级,它只检测必须的文件。
  • bin_PROGRAMS 定义要产生的执行文件名。如果要产生多个执行文件,每个文件名用空格隔开。
  • hello_SOURCES 定义”hello”这个执行程序所需要的原始文件。如果”hello”这个程序是由多个原始文件所产生的,则必须把它所用到的所有原始文件都列出来,并用空格隔开。例如:若目标体”hello”需要”hello.c”、”hello.h”两个依赖文件,则定义hello_SOURCES=hello.c hello.h。

运行automake:

$ automake --add-missing
configure.ac:6: warning: AM_INIT_AUTOMAKE: two- and three-arguments forms are deprecated.  For more info, see:
configure.ac:6: http://www.gnu.org/software/automake/manual/automake.html#Modernize-AM_005fINIT_005fAUTOMAKE-invocation
configure.ac:6: installing './install-sh'
configure.ac:6: installing './missing'
Makefile.am: installing './depcomp'

$ ls
aclocal.m4    autom4te.cache  autoscan.log  configure.ac  helloworld.c   configure 
      Makefile.am  missing  depcomp       install-sh    Makefile.in


automake会根据Makefile.am文件产生一些文件,包含最重要的 Makefile.in.

选项–add-missing的 定义是 “add missing standard files
to package”,它会让automake加入一个标准的 软件包所必须的 一些文件.
  
我们用automake产生出来的 Makefile.in文件是 符合GNU Makefile惯例
的 ,接下来我们只要执行configure这个shell 脚本就可以产生合适的 Makefile 文
件了.

执行configure生成Makefile:

在 符合GNU Makefiel惯例的 Makefile中,包含了一些基本的 预先定义的 操作:

  • make
      根据Makefile编译源代码,连接,生成目标文件,可执行文件.
  • make clean
      清除上次的 make命令所产生的 object文件(后缀为".o"的 文件)及可执行文件.
  • make install
      将编译成功的 可执行文件安装到系统目录中,一般为/usr/local/bin目录.
  • make dist
      产生发布软件包文件(即distribution package).这个命令将会将可执行文件及相关文件打包成一个tar.gz压缩的 文件用来作为发布软件的 软件包.
      它会在 当前目录下生成一个名字类似"PACKAGE-VERSION.tar.gz"的 文件.PA
    CKAGE和VERSION,是 我们在 configure.in中定义的 AM_INIT_AUTOM
    AKE(PACKAGE, VERSION).
  • make distcheck
      生成发布软件包并对其进行测试检查,以确定发布包的正确性.
$./configure
$ ls
aclocal.m4     autom4te.cache  autoscan.log     configure.ac config.log   helloworld.c     configure  Makefile.am  missing   depcomp  install-sh   Makefile.in   config.status        Makefile    

使用Makefile编译代码

$ make
$ ./helloworld

总结

1、第一步:编写源代码
2、执行: autoscan 生成configure.scan,然后将configure.scan重命名为configure.ac,安装需要修改它

宏定义软件示例
AC_PREREQ声明要求的autoconf版本AC_PREREQ([2.69])
AC_INIT定义软件的名称和版本等信息 (”FULL-PACKAGE-NAME”为软件包名称),( ”VERSION”为软件版本号)(”BUG-REPORT-ADDRESS”为BUG报告地址(一般为软件作者邮件地址))
AC_CONFIG_SRCDIR用来侦测所指定的源码文件是否存在
AC_CONFIG_HEADER用于生成config.h文件,以便autoheader使用
AC_PROG_CC用来指定编译器,如果不指定,选用默认gcc
AC_OUTPUTAC_OUTPUT 用来设定configure所要产生的文件,如果是makefile,configure会把它检查出来的结果带入makefile.ac文件产生合适的makefile。

3、执行: aclocalautoconf, 生成configure工具,configure是 一个脚本,它能设置源程序来适应各种不同的操作系统平台

4、编写Makefile.am文件。 Makefile.am是 用来生成Makefile.in的

  • AUTOMAKE_OPTIONS 为设置Automake的选项。由于GNU对自己发布的软件有严格的规范,比如必须附带许可证声明文件COPYING等,否则Automake执行时会报错。Automake提供了3种软件等级:foreign、gnu和gnits,供用户选择,默认等级为gnu:
    • foreign:只检测必须的文件
    • subdir-objects:指的是编译生成的.o文件可以放在子路径(跟源文件放一起),没有这个选项的话,所有.o文件都会放在工程根目录下;
  • SUBDIRS:指定需要递归automake的子文件夹,即存在Makefile.am的子文件夹
  • bin_PROGRAMS: 定义要产生的执行文件名。
    • 如果要产生多个执行文件,每个文件名用空格隔开。
    • 可以有多个 bin_PROGRAMS ,但每个 bin_PROGRAMS 都需要有相对应的xxx_SOURCES
  • XX_SOURCES:编译可执行文件所需的源文件 。比如hello_SOURCES 定义”hello”这个执行程序所需要的原始文件。如果”hello”这个程序是由多个原始文件所产生的,则必须把它所用到的所有原始文件都列出来,并用空格隔开。例如:若目标体”hello”需要”hello.c”、”hello.h”两个依赖文件,则定义hello_SOURCES=hello.c hello.h。
  • XX_LIBADD:链接参数,即pkg-config --libs的结果
  • XX_CFLAGS:编译参数,即pkg-config --cflags的结果和-D之类的宏定义
  • nodist_XX_SOURCES:执行make dist时不需要被打包的源文件,一般是根据其他源文件通过脚本临时生成的中间源文件,比如使用glib-genmarshal生成的文件
  • MAINTAINERCLEANFILES:执行make maintainer-clean时候需要删除的文件,即执行autoreconf -vfi、intltoolize --force以及configure或执行autogen.sh后能够重新生成的文件都要放入其中
  • DISTCLEAN_FILES:执行make distclean时候需要删除的文件,一般是EXTRA_DIST中的.in文件生成的不需要打包的中间文件
  • EXTRA_DIST:指定要被打包的额外文件,即执行make dist时需要被放入压缩包的文件,一般是不需要参与编译但是又需要被使用的文件,比如图片目录里的图片
  • LDADD: 无法被configure找到但是又需要链接的库或资源文件,例如临时生成的windows下使用的rc文件
  • dist-hook:执行make dist时需要执行的脚本
  • dist_XX_DATA:程序运行需要的数据文件,比如图标、配置文件等
  • dist_bin_SCRIPTS:程序的脚本文件,将被安装到bin目录

5、执行:automake --add-missing。automake会根据你写的 Makefile.am来自动生成Makefile.in。–add-missing让automake加入一个标准的 软件包所必须的 一些文件

6、执行./configure生成Makefile:

autotools官网
Automake使用说明

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值