如何使用autotools工具

 

autotools是系列工具,读者首先要确认系统是否装了以下工具(可以用which命令进行查看)。


  • autoscan
  • aclocal
  • autoheader
  • automake
  • autoconf

使用autotools主要就是利用各个工具的脚本文件以生成最后的Makefile。其总体流程是这样的:

  • 使用aclocal生成一个“aclocal.m4”文件,该文件主要处理本地的宏定义;
  • 改写“configure.scan”文件,并将其重命名为“configure.in”,并使用autoconf文件生成configure文件。

接下来,笔者将通过一个简单的hello.c例子带领读者熟悉autotools生成makefile的过程,由于在这过程中有涉及到较多的脚本文件,为了更清楚地了解相互之间的关系,强烈建议读者实际动手操作以体会其整个过程。

2.autoscan

它会在给定目录及其子目录树中检查源文件,若没有给出目录,就在当前目录及其子目录树中进行检查。它会搜索源文件以寻找一般的移植性问题并创建一个文件“configure.scan”,该文件就是接下来autoconf要用到的“configure.in”原型。如下所示:

[root@localhost automake]# autoscan

autom4te: configure.ac: no such file or directory

autoscan: /usr/bin/autom4te failed with exit status: 1

[root@localhost automake]# ls

autoscan.log configure.scan hello.c

如上所示,autoscan首先会尝试去读入“configure.ac”(同configure.in的配置文件)文件,此时还没有创建该配置文件,于是它会自动生成一个“configure.in”的原型文件“configure.scan”。

接下来首先运行aclocal,生成一个“aclocal.m4”文件,该文件主要处理本地的宏定义。如下所示:

[root@localhost automake]# aclocal

再接着运行autoconf,生成“configure”可执行文件。如下所示:

[root@localhost automake]# autoconf

[root@localhost automake]# ls

aclocal.m4 autom4te.cache autoscan.log configure configure.in hello.c

3.autoheader

接着使用autoheader命令,它负责生成config.h.in文件。该工具通常会从“acconfig.h”文件中复制用户附加的符号定义,因此此处没有附加符号定义,所以不需要创建“acconfig.h”文件。如下所示:

[root@localhost automake]# autoheader

4.automake

这一步是创建Makefile很重要的一步,automake要用的脚本配置文件是Makefile.am,用户需要自己创建相应的文件。之后,automake工具转换成Makefile.in。在该例中,笔者创建的文件为Makefile.am如下所示:

AUTOMAKE_OPTIONS=foreign

bin_PROGRAMS= hello

hello_SOURCES= hello.c

下面对该脚本文件的对应项进行解释。

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

接下来可以使用automake对其生成“configure.in”文件,在这里使用选项“—adding-missing”可以让automake自动添加有一些必需的脚本文件。如下所示:

[root@localhost automake]# automake –add-missing

configure.in: installing ‘./install-sh’

configure.in: installing ‘./missing’

Makefile.am: installing ‘depcomp’

[root@localhost automake]# ls

aclocal.m4      autoscan.log configure.in hello.c     Makefile.am missing

autom4te.cache configure     depcomp    install-sh Makefile.in config.h.in

可以看到,在automake之后就可以生成configure.in文件。


5.autoconf

configure.in是autoconf的脚本配置文件,它的原型文件“configure.scan”如下所示:

#                                               -*- Autoconf -*-

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

AC_PREREQ(2.59)

#The next one is modified by sunq

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

这个巨集用来检查原始码所在的路径,autoscan 会自动产生,我们不必修改它。

AC_INIT(hello,1.0)

# The next one is added by sunq

AM_INIT_AUTOMAKE(hello,1.0)    改行是增加的一定要有,添加宏AM_INIT_AUTOMAKE, 它是automake所必备的宏,也同前面一样,PACKAGE是所要产生软件套件的名称,VERSION是版本编号。最后发布的软件名称由这里决定

这是使用 Automake 所必备的巨集,PACKAGE 是我们所要产生软体套件的名称,VERSION 是版本编号。

AC_CONFIG_SRCDIR([hello.c])     此处说明hello.c的位置,如果是在子目录下,那么得写成 目录/hello.c

                                                       不然automake的时候找不到程序

AC_CONFIG_HEADER([config.h])   此处是方便autoheader调用用的,此处的宏是用来生成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_CONFIG_FILES([Makefile])      此处要改,要加个#注销掉

AC_OUTPUT                                  此处要加makefile,如果makefile不止一个,当前目录和子目录都有,

                                                       则都要写,例如:AC_OUTPUT([makefile   src/makefile])  

下面对这个脚本文件进行解释:

  • 以“#”号开始的行为注释。
  • AC_PREREQ宏声明本文件要求的autoconf版本,如本例使用的版本2.59。
  • · AC_INIT宏用来定义软件的名称和版本等信息,在本例中省略了BUG-REPORT-ADDRESS,一般为作者的e-mail。
  • AM_INIT_AUTOMAKE是笔者另加的,它是automake所必备的宏,也同前面一样,PACKAGE是所要产生软件套件的名称,VERSION是版本编号。
  • AC_CONFIG_SRCDIR宏用来侦测所指定的源码文件是否存在,来确定源码目录的有

效性。在此处为当前目录下的hello.c。

  • AC_CONFIG_HEADER宏用于生成config.h文件,以便autoheader使用。
  • AC_CONFIG_FILES宏用于生成相应的Makefile文件。
  • 中间的注释间可以添加分别用户测试程序、测试函数库、测试头文件等宏定义。

6.运行configure

在这一步中,通过运行自动配置设置文件configure,把Makefile.in变成了最终的Makefile。如下所示:

[root@localhost automake]# ./configure

checking for a BSD-compatible install… /usr/bin/install -c

checking whether build enVironment is sane… yes

checking for gawk… gawk

checking whether make sets $(MAKE)… yes

checking for Gcc… Gcc

checking for C compiler default output file name… a.out

checking whether the C compiler works… yes

checking whether we are cross compiling… no

checking for suffix of executables…

checking for suffix of object files… o

checking whether we are using the GNU C compiler… yes

checking whether Gcc accepts -g… yes

checking for Gcc option to accept ANSI C… none needed

checking for style of include used by make… GNU

checking dependency style of Gcc… Gcc3

configure: creating ./config.status

config.status: creating Makefile

config.status: executing depfiles commands

可以看到,在运行configure时收集了系统的信息,用户可以在configure命令中对其进行方便地配置。在./configure的自定义参数有两种,一种是开关式(–enable-XXX或–disable-XXX),另一种是开放式,即后面要填入一串字符(–with- XXX=yyyy)参数。读者可以自行尝试其使用方法。另外,读者可以查看同一目录下的”config.log”文件,以方便调试之用。

到此为止,makefile就可以自动生成了。


6.make

键入make默认执行”make all”命令,即目标体为all,其执行情况如下所示:

[root@localhost automake]# make

if Gcc -DPACKAGE_NAME=\”\” -DPACKAGE_TARNAME=\”\” -DPACKAGE_VERSION=\”\” -DPACKAGE_STRING=\”\” -DPACKAGE_BUGREPORT=\”\” -DPACKAGE=\”hello\” -DVERSION=\”1.0\” -I. -I.     -g -O2 -MT hello.o -MD -MP -MF “.deps/hello.Tpo” -c -o hello.o hello.c; \

then mv -f “.deps/hello.Tpo” “.deps/hello.Po”; else rm -f “.deps/hello.Tpo”; exit 1; fi

Gcc -g -O2   -o hello hello.o

此时在本目录下就生成了可执行文件“hello”,运行“./hello”能出现正常结果,如下所示:

[root@localhost automake]# ./hello

Hello!Autoconf!

7.make install

如果我们用bin_PROGRAMS 巨集的话,程式会被安装至 /usr/local/bin 这个目录。
(另:关于configure安装

 比如./configure ,那么可执行程序默认安装在/usr/local/bin目录。库是/usr/local/lib/等等。

比如 ./configure  --prefix=/xxx ,那么可执行程序默认是在 /xxx/bin 目录。库是 /xxx/lib/ 等等

此时,会把该程序安装到系统目录中去,如下所示:

[root@localhost automake]# make install

if Gcc -DPACKAGE_NAME=\”\” -DPACKAGE_TARNAME=\”\” -DPACKAGE_VERSION=\”\” -DPACKAGE_STRING=\”\” -DPACKAGE_BUGREPORT=\”\” -DPACKAGE=\”hello\” -DVERSION=\”1.0\” -I. -I.     -g -O2 -MT hello.o -MD -MP -MF “.deps/hello.Tpo” -c -o hello.o hello.c; \

then mv -f “.deps/hello.Tpo” “.deps/hello.Po”; else rm -f “.deps/hello.Tpo”; exit 1; fi

Gcc -g -O2   -o hello hello.o

make[1]: Entering directory ‘/root/workplace/automake’

test -z “/usr/local/bin” || mkdir -p — “/usr/local/bin”

/usr/bin/install -c ‘hello’ ‘/usr/local/bin/hello’

make[1]: Nothing to be done for ‘install-data-am’.

make[1]: LeaVing directory ‘/root/workplace/automake’

此时,若直接运行hello,也能出现正确结果,如下所示:

[root@localhost automake]# hello

Hello!Autoconf!

8.make clean

此时,make会清除之前所编译的可执行文件及目标文件(object file, *.o),如下所示:

[root@localhost automake]# make clean

test -z “hello” || rm -f hello

rm -f *.o

make distclean
除了清除执行档和目的档外,也把 configure 所产生的 Makefile也清除掉。

9.make dist

此时,make将程序和相关的文档打包为一个压缩文档以供发布,如下所示:

[root@localhost automake]# make dist

[root@localhost automake]# ls hello-1.0-tar.gz

hello-1.0-tar.gz

可见该命令生成了一个hello-1.0-tar.gz的压缩文件。

由上面的讲述读者不难看出,autotools确实是软件维护与发布的必备工具,也鉴于此,如今GUN的软件一般都是由automake来制作的。


110. make distcheck
    和 make dist 类似,但是加入检查包装後的压缩档是否正常。这个目标除了把程式和相关档案包装成 tar.gz 档外,还会自动把这个压
缩档解开,执行 configure,并且进行 make all 的动作,确认编译无误後,会显示这个 tar.gz 档已经准备好可供散播了。这个检查非
常有用,检查过关的套件,基本上可以给任何一个具备 GNU 发展境的人去重新编译。就 hello-1.tar.gz 这个范例而言,除了在 Red
Hat Linux 上,在 FreeBSD 2.2.x 版也可以正确地重新编译。

   

   

   

###############################################

以上是一个单纯的autotools的例子,即单纯一个目录,下有一个程序,

如果是一个项目,项目目录,然后下面有子目录,子目录下有一程序,我们看一个例子:


/test/src/helle.c

1, 在test下编写makefil.am

SUBDIRS=这里写hello.c具体放置的目录

2,在src下编写makefile.am

AUTOMAKE_OPTIONS=foreign

bin_PROGRAMS=hello   ( 这是要形成的可知行文件的名字)

定义我们所要产生的执行档档名。如果要产生多个执行档,每个档名用空白字元隔开。

如果我们定义多个执行档,则对每个执行档都要定义相对的filename_SOURCES。

hello_SOURCES=hello.c (这是依赖的文件的名字)

定义 'hello' 这个执行档所需要的原始档。如果 'hello' 这个程式是由多个原始档所产生,必须把它所用到的原始档都列出来,以空白字元隔开。假设 'hello' 这个程式需要 'hello.c'、'main.c'、 'hello.h'
三个档案的话,则定义
hello_SOURCES= hello.c main.c hello.h

3,在test下autoscan

以后的工作同文章前面所讲,只是有一个地方要注意的是:

configure.in文件的这里──

AC_CONFIG_SRCDIR([src/hello.c])     此处说明hello.c的位置,如果是在子目录下,那么得写成 目录/hello.c

                                                       不然automake的时候找不到程序

AC_OUTPUT   改                           此处要加makefile,如果makefile不止一个,当前目录和子目录都有,

                                                       则都要写,例如:AC_OUTPUT([makefile   src/makefile])  

AC_OUTPUT([makefile   src/makefile]) 


后面和文章前面所讲都一样

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/435345.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LSGO软件技术团队2015~2016学年第十五周(1207~1213)总结

团队简述: LSGO软件技术团队成立于2010年10月,主要从事的应用方向为互联网与移动互联网(UI设计,前端开发,后台开发),地理信息系统;研究方向为大数据处理与机器学习。成立几年来为学校…

python代码太长_Python 太糟糕了?开发者总结了 8 大原因

作者对每一项“缺点”都进行了分析,全文洋洋洒洒,概括起来 8 个原因分别是: 1、版本不兼容 Python 3 与 Python 2 不完全兼容。作者以 Perl 语言和创造了世界上早期个人电脑的 Commodore 为例,分析了缺乏向后兼容性和分离版本是如…

Tomca安装

下载 官网: http://tomcat.apache.org/ 2.安装 默认 3.安装成功

知其所以然(续)

查了一下,上篇知其所以然(以学习算法为例) 是08年7月写的,现在已经是10年11月,过去了两年零4个月,这说明了三件事情:1,一个问题其实你可以一直放在脑子里面,利用暗时间 对…

python中的引用怎么理解_Python函数通过引用调用

基本上有三种函数调用:通过价值 通过引用传递 通过对象引用传递 Python是一种PASS-BY-OBJECT-REFERENCE编程语言。 首先,重要的是要理解一个变量,变量(对象)的值是两个独立的东西。变量指向对象。变量不是对象。再次&a…

ELF动态库加载技术

库用于将相似函数打包在一个单元中。Linux支持两种类型的库:静态库(在编译时静态绑定到程序)和动态库(在运行时绑定到程序)。Linux系统使用的动态库是ELF格式,后缀名为so。 1 加载 动态库内部划分为段&a…

geoserver安装(war安装+exe安装)

下载 官网:http://geoserver.org/ 方法一 当前只有war版本的 下载结果 tomcat安装最好不要使用exe版本的,因为会出现问题,页面加载不出来,所以大家只需要下载下来解压即可 然后将geoserver安装包中的war文件放到webappx下 然后…

LSGO软件技术团队2015~2016学年第十六周(1214~1220)总结

团队简述: LSGO软件技术团队成立于2010年10月,主要从事的应用方向为互联网与移动互联网(UI设计,前端开发,后台开发),地理信息系统;研究方向为大数据处理与机器学习。成立几年来为学校…

与大家分享一下2010我的找工作历程!真累啊!不过都已经结束了!

经常看到网上别人把找工作的过程与别人分享,这次俺也写下我的一点经历来与大家分享。 大三结束就准备找工作了,因为感觉在学校待着实在没意思,还是出去混混吧。 记得在暑假,想找份实习的,投了些简历,也不知…

LSGO软件技术团队2015~2016学年第十七周(1221~1227)总结

团队简述: LSGO软件技术团队成立于2010年10月,主要从事的应用方向为互联网与移动互联网(UI设计,前端开发,后台开发),地理信息系统;研究方向为大数据处理与机器学习。成立几年来为学校…

postgresql+postgis安装

下载 官网https://www.postgresql.org/ 作者的电脑为win 下载结果为 postgis要选择下载对应版本的 官网http://www.postgis.org/ 以下安装最好装到除c盘之外的,否则有些安装需要权限,一般为d盘 用户名和密码都设置为postgres postgis安装教程 之前设置过…

话说Python:非主流编程语言

【编者按】Python编程语言广受开发者的喜爱,并被列入LAMP (Linux, Apache, MySQL 以及Python/Perl/PHP)中。尽管它在一段时期曾引领了动态语言,但这门颇受好评的编程语言却又从未大红大紫过。是什么让它在开发领域尤其是Web应用开发方面如此受宠呢&#…

把共享库(SO)加载到指定的内存地址

一位朋友最近遇到一个棘手的问题,希望把共享库(SO)加载到指定的内存地址,目的可能是想通过prelink来加快应用程序的起动速度。他问我有没有什么方法。我知道Windows下是可以的,比如在VC6里设置/base的值就行了,所以相信在linux下也…

aop实现原理_SpringAOP原理分析

目录Spring核心知识SpringAOP原理AOP编程技术什么是AOP编程AOP底层实现原理AOP编程使用Spring核心知识Spring是一个开源框架,Spring是于2003年兴起的一个轻量级的Java开发框架,由Rod Johnson在其著作Expert One-On-One J2EE Development and Design中阐述…

欧盟无条件批准甲骨文收购Sun

北京时间1月21日消息,据国外媒体报道,甲骨文以70亿美元的价格收购Sun的交易今天获得了欧盟无条件批准。 这笔交易将改变科技产业的格局,这意味着全球第二大商用软件提供商甲骨文进入了硬件产业。在规模达170亿美元的高端计算机服务器市场&…

如何高效的访问内存

影响内存访问速度的因素主要有: 1.内存带宽:每秒读写内存的数据量,由硬件配置决定。 2.CACHE高速缓冲:CPU与内存之间的缓冲器,当命中率比较高时能大大提供内存平均访问速度。 3.TLB转换旁视缓冲:系统虚拟地…

初学者怎样看懂python代码_入门编程(初学者怎样看懂代码)

你既然喜欢编程,就应该认认真真的学习一门语言,学习微软的就先从vb开始,vb是比较好的入门语言,可视化的,比较简单,是非常好的入门语言。书籍最少应该准备两. 先认认真真的学习一门语言,学习微软…

MAVEN安装和配置

maven官网下载 https://maven.apache.org/download.cgi

MIPS架构的医院智能导诊系统设计

摘要:通过研究基于MIPS架构的SMP8654芯片的硬件架构,并且利用芯片内部的图形加速引擎GFX的方式实现了具有高清视频显示和图片文字处理功能的播放器。系统以嵌入式Linux和MiniGUI为平台设计了智能导诊系统,提高了医院的导诊就医的服务效率。智…