autotools使用(自动生成Makefile)

使用Autotools自动生成Makefile的步骤 使用GNU Autotools创建Makefile的过程可以分为如下步骤: 1. 编写元文件configure.ac 2. 执行aclocal。aclocal将扫描configure.ac中使用的M4宏,并到系统中收集这些宏的定义,然后将这些宏定义 复制到源码顶层目录下的aclocal.m4中。 3. 调用autoconf,将configure.ac中的宏展开为shell脚本形式的configure。 4. 编写元文件Makefile.am。 5. 调用automake。automake.. 阅读详情
Makefile固然可以帮助make完成它的使命,但要承认的是,编写Makefile确实不是一件轻松的事,尤其对于一个较大的项目而言更是如此。那么,有没有一种轻松的手段生成Makefile而同时又能让我们享受make的优越性呢?本节要讲autotools系列工具正是为此而设的,它只需用户输入简单的目标文件、依赖文件、文件目录等就可以轻松地生成Makefile了,这无疑是广大用户的所希望的。另外,这些工具还可以完成系统配置信息的收集,从而可以方便地处理各种移植性的问题。也正是基于此,现在Linux上的软件开发一般都用autotools来制作Makefile

   autotools使用流程

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

·  aclocal

·  autoscan

·  autoconf

·  autoheader

·  automake

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

·  使用aclocal生成一个“aclocal.m4”文件,该文件主要处理本地的宏定义;

·  改写“configure.scan”文件,并将其重命名为“configure.in”,并使用autoconf文件生成configure文件。

接下来,将通过一个简单的hello.c例子来熟悉autotools生成makefile的过程.

1autoscan

它会在给定目录及其子目录树中检查源文件,若没有给出目录,就在当前目录及其子目录树中进行检查。它会搜索源文件以寻找一般的移植性问题并创建一个文件“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”。

2autoconf

configure.inautoconf的脚本配置文件,它的原型文件“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)

AC_INIT(hello,1.0)

# The next one is added by sunq

AM_INIT_AUTOMAKE(hello,1.0)

AC_CONFIG_SRCDIR([hello.c])

AC_CONFIG_HEADER([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

 

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

·  以“#”号开始的行为注释。

·  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文件。

·中间的注释间可以添加分别用户测试程序、测试函数库、测试头文件等宏定义。

接下来首先运行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

3autoheader

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

 [root@localhost automake]# autoheader

4automake

这一步是创建Makefile很重要的一步,automake要用的脚本配置文件是Makefile.am,用户需要自己创建这个文件。之后,automake工具将其转换成Makefile.in

在该例中,创建的文件为Makefile.am如下所示:

AUTOMAKE_OPTIONS=foreign

bin_PROGRAMS= hello

hello_SOURCES= hello.c hello.h

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

·  其中的AUTOMAKE_OPTIONS为设置automake的选项。由于GNU(在第1章中已经有所介绍)对自己发布的软件有严格的规范,比如必须附带许可证声明文件COPYING等,否则automake执行时会报错。automake提供了三种软件等级:foreigngnugnits,让用户选择采用,默认等级为gnu。在本例使用foreign等级,它只检测必须的文件。

·  bin_PROGRAMS定义要产生的执行文件名。如果要产生多个执行文件,每个文件名用空格隔开。

·  hello_SOURCES定义“hello”这个执行程序所需要的原始文件。如果”hello”这个程序是由多个原始文件所产生的,则必须把它所用到的所有原始文件都列出来,并用空格隔开。例如:若目标体“hello”需要“hello.c”、“sunq.c”、“hello.h”三个依赖文件,则定义hello_SOURCES=hello.c sunq.c hello.h

 接下来可以使用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.运行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就可以自动生成了。回忆整个步骤,用户不再需要定制不同的规则,而只需要输入简单的文件及目录名即可,这样就大大方便了用户的使用。

 

autotools生成的Makefile除具有普通的编译功能外,还具有以下主要功能:

1make

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

 

[root@localhost automake]# make

if Gcc -D PACKAGE_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 everyone!

2make install

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

 [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 everyone!

3make clean

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

 [root@localhost automake]# make clean

test -z "hello" || rm -f hello

rm -f *.o

4make 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 -- A Practioner‘s Guide to GNU Autoconf, Automake, and Libtool 立即下载

相关推荐

autotools系列工具—-自动生成Makefile

autotools系列工具—-自动生成Makefile

autotools_autotools_交叉编译_

Linux的交叉编译安装包。用来不同系统下的开发

使用autotools制作makefile

使用autotools系列工具只需要用户简单输入目标文件、依赖文件、文件目录等就可以轻松地生成makefile文件,本文介绍了如何使用autotools工具生成makefile文件

Linux c 开发 - Autotools使用详细解读

我们前面的章节中已经讲到了Makefile使用(点击进入查看文章)。我们知道在Linux下面如果编译一个比较大型的项目,我们可以通过Makefile的方式来完成。 但是,我们又蛋疼了,Makefile拥有复杂的语法结构,甚至让人难以领会,当我们项目非常大的时候,维护Makefile会成为一件非常头疼的事情。于是我们就有了autotools工具,专门用来生成Makefile,这个工具让我们很大程

自娱自乐的代码人 1万+

jenkins上部署vue项目执行npm run build 进行打包报错就报错

想要前端项目的QA环境能使用Jenkins进行一键部署,进行了一系列的配置,到最后进行构建的适合,只要运行到打包命令时,就报以下错误: 查了半天才发现是cross-env(如下图)在window环境和Linux系统使用方式不一致造成的,cross-env只是用在windows系统上的,在Mac和Linux系统上没用,所以为了能在Jenkins上打包成功,将package.json里的命令方式进行了...

进击的冉冉的博客 1万+

【Linux】——GNU autotools 下载和安装

前言:做PTP实验,需要先准备好GNU autotools 。 1.安装 任意位置打开终端,输入命令 sudo apt-get install autoconf 自动安装automake autotools-dev libsigsegv2 m4 建议安装autoconf-archive gnu-standards autoconf-doc libtool 这个时候再使用apt安装建议安装包,发现无效。 然后采用下面的办法 2.下载.tar.gz,在GNU安装包中找到自己想要下载的安装包

Yang_XiaoYang的博客 4562

autotools的基本使用

autotools是个系列工具,主要由autoconf、automake、perl语言环境和m4等组成,所包含的命令有5个: 下图是autotools使用的流程图: autotools的安装:apt-get install autoconf automake autotools-dev m4 autotools使用简单实例如下: 准备程序源代码mkdir

Gino的专栏 2105

Autotools使用教程

autotools入门教程

OneGit 6888

[Linux]使用autotools自动生成Makefile

Make工程管理器的使用。 (1)为什么要Make工具? 面对数十数百的源文件,一个个编译太麻烦了,Make工具最主要也是最基本的功能就是通过makefile文件来描述源程序之间的相互关系并自动维护编译工作,Makefile通过定义整个软件项目的编译规则,make工具就可以基于Makefile实现整个项目的完全自动编译,从而显著提高软件开发的效率。 (2)自动生成工具自动生成Makefile的过程。 使用autotools自动生成工具自动生成Makefile ①将准备好的源代码执行autosc

dangoxiba的博客 3041

Makefile文件自动生成,ubuntu系统autotools使用

多目录项目用automake和autoconf自动生成Makefile方法 /* src.h */ #ifndef __SRC_H__ #define __SRC_H__ int add(int num1, int num2); int sub(int num1, int num2); #endif /* src1.h */ #ifndef __SRC1_H__ #define __SRC1_H__ int mul(int num1, int num2); int my_div(int num1.

在水一[钫] 1662

使用autotools来进行Makefile自动生成

下文参考自http://os.51cto.com/art/201003/185539.htm,结合自己的实验数据而成 在向大家详细介绍Linux Makefile之前,首先让大家了解下Linux Makefile,然后全面介绍Linux Makefile,希望对大家有用。由于毕业设计开发的平台是Linux, 为了在Linux进行,Linux Makefile的编写是必不可少的,为偷懒,我想使用a

369

使用autotools自动生成makefile

转自:http://blog.csdn.net/scucj/article/details/6079052 手工写Makefile是一件很有趣的事情,对于比较大型的项目,如果有工具可以代劳,自然是一件好事。在Linux系统开发环境中,GNU Autotools 无疑就充当了这个重要角色。(在Windows系统的开发环境中,IDE工具,诸如Visual Studio,来管理项目也很方便。)

u011756766的博客 1332

autotools入门.pdf

简单介绍autotools工具集的用法,linux编程常使用自动生成规范的configure文件的资料

autotools使用自动生成makefile

Makefile固然可以帮助make完成它的使命,但要承认的是,编写Makefile确实不是一件轻松的事,尤其对于一个较大的项目而言更是如此。那么,有没有一种轻松的手段生成Makefile而同时又能让我们享受make的优越性呢?本节要讲autotools系列工具正是为此而设的,它只需用户输入简单的目标文件、依赖文件、文件目录等就可以轻松地生成Makefile了,这无疑是广大用户的所希望的。另外,这些

felicity_one的博客 457

10.使用autotools自动生成Makefile

autotools是系列工具,包括aclocal,autoscan,autoconf,autoheader,automake,可以使用“whereis”或者“which”命令查看这些工具是否存在,不过系统默认这些工具是存在的。就上一节的例子,使用autotools自动生成Makefile。 1.autoscan    他会在给定目录及子目录树中检查源文件,若没有给出目录,就在当前目录及子目录下

liuzheng1的博客 528

使用autotools工具自动生成makefile文件

1. autosacn    该命令会根据源文件产生一个名为configure.scan的文件2. 改写第一步生成的configure.scan文件,并重命名为configure.in   1 # -*- Autoconf -*- 2 # Process this file with

gogor的专栏 1181

linux下使用autotools自动生成Makefile文件

linux下使用autotools自动生成Makefile文件 自己最近开始照着北航出版社的《嵌入式linux操作系统原理与应用》学linux,到了自动生成Makefile文件这里,实操发现教材有点错,查找资料后解决问题,简单地记录一下吧。 linux下对于多个.c文件的管理和编译一般使用Makefile工具。除了自己纯写入Makefile文件外,还可以通过autotools工具,只需要简单地输入...

qq_38181811的博客 447

ubuntu12.04使用autotools自动生成makefile

Linux下编程时的Makefile是个令人头疼的问题,而且编译环境不同,需要不同的Makefile,这个不可能由用户来自己编写,好在我们有自动生成Makefile的工具autotools。。。但是百度上的很多方法其实并不完全适用与ubuntu系统,所以今天我就跟大家分享一下在ubuntu12.04下使用autotools自动生成Makefile的方法。。。 1、autotool是一个系

This Is Why We Coding 1166
上一篇: sourceInsight使用技巧
下一篇: 程序员的emacs配置大全(cedet+ecb+cscope+gdb-ui)-jzj
nancygreen
博客等级 码龄22年 45粉丝 1原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值