sqlite自动生成 Makefile (automake/autoconf 入门)

作为Linux
下的主次开发人士,大家自然都碰到过Makefile ,用make
命令来编译自己写的次第真的是很便利。一般景观下,大家都是手工写一个简易Makefile
,假诺要想写出一个相符自由软件惯例的Makefile 就不那么容易了。

在本文中,将给我们介绍怎么样运用autoconf 和automake
四个工具来援助大家自行地转移符合自由软件惯例的Makefile ,这样就可以象常
见的GNU 程序一样,只要使用“./configure” ,“make” ,“make instal”
就足以把程序安装到Linux
系统中去了。这将特别适合想做开放源代码软件的次第开发人员,又或只要您只是自己写些小的Toy
程序,那么这 个篇章对您也会有很大的提携。

一、Makefile 介绍

Makefile
是用以机动编译和链接的,一个工程有许多文件组成,每一个文书的改变都会导致工程的双重链接,不过不是怀有的文本都急需再度编译,Makefile
中记录有文件的音讯,在make 时会决定在链接的时候需要再行编译哪些文件。

Makefile
的主旨就是:让编译器知道要编译一个文书需要借助其他的什么文件。当那多少个依靠文件有了改动,编译器会自动的发现最终的变化文书已经不合时宜,而再次编译相应的模块。

Makefile 的主导协会不是很复杂,但当一个程序开发人士先导写Makefile
时,日常会猜疑自己写的是否吻合常规,而且自己写的 Makefile
平时和投机的开发条件相关联,当系统环境变量或路径暴发了变更后,Makefile
可能还要随着修改。这样就造成了手工书写 Makefile 的许多题材,automake
恰好能很好地帮忙大家缓解这个问题。

使用automake ,程序开发人士只需要写一些
简单的涵盖预定义宏的文本,由autoconf 依照一个宏文件生成configure
,由automake 依照另一个宏文件生成Makefile.in , 再利用configure
依照Makefile.in 来生成一个相符常规的Makefile
。上面我们将详细介绍Makefile 的automake 生成 方法。

二、使用的环境

本文所涉及的先后是基于Linux 发行版本:Ubuntu 14.04

三、从helloworld 入手

我们从豪门最常使用的例子程序helloworld 最先。

下边的过程假设简单地说来就是:

新建多少个公文:

helloworld.c
configure.in
Makefile.am

下一场实施:

autoscan;
aclocal; autoconf; automake –add-missing; ./configure; make;
./helloworld

就可以看来Makefile 被发生出来,而且可以将helloworld.c 编译通过。

很粗略吗,几条命令就可以做出一个适合常规的Makefile ,感觉什么呀。

前天起始介绍详细的历程:

1 、建目录

在你的工作目录下建一个helloworld 目录,我们用它来存放helloworld
程序及连锁文书,如在/home/my/build 下:

$ mkdir helloword
$ cd helloworld

2 、 helloworld.c

下一场用你协调最欢喜的编辑器写一个hellowrold.c 文件,如命令:vi
helloworld.c 。使用下边的代码作为helloworld.c 的内容。

int main(int argc, char** argv)
{
printf(“Hello, Linux World!\n”);
return 0;
}

形成后保存退出。

近日在helloworld 目录下就活该有一个你协调写的helloworld.c 了。

3 、生成configure

咱俩采纳autoscan 命令来提携我们按照目录下的源代码生成一个configure.in
的沙盘文件。

命令:

$ autoscan
$ ls
configure.scan helloworld.c

举行后在hellowrold 目录下会扭转一个文书:configure.scan
,大家可以拿它看做configure.in 的底本。

现行将configure.scan 改名为configure.in
,并且编辑它,按下边的始末改动,去掉无关的口舌:

============================configure.in
内容开首=========================================
# -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.

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)
============================configure.in
内容停止=========================================

接下来实施命令aclocal 和autoconf ,分别会生出aclocal.m4 及configure
多少个公文:

$ aclocal
$ls
aclocal.m4 configure.in helloworld.c
$ autoconf
$ ls
aclocal.m4 autom4te.cache configure configure.in helloworld.c

世家可以见见configure.in 内容是一些宏定义,这个宏经autoconf
处理后会变成检查系统特性、环境变量、软件必须的参数的shell 脚本。

autoconf 是用来变化自动配置软件源代码脚本(configure )的工具。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
既可以看作编译器的前端,也得以单独作为一个宏处理器。

4 、新建Makefile.am

新建Makefile.am 文件,命令:

$ vi Makefile.am

内容如下:

AUTOMAKE_OPTIONS=foreign
bin_PROGRAMS=helloworld
helloworld_SOURCES=helloworld.c

automake 会按照你写的Makefile.am 来自动生成Makefile.in 。

Makefile.am 中定义的宏和目的, 会引导automake
生成指定的代码。例如,宏bin_PROGRAMS 将导致编译和连接的对象被扭转。

5 、运行automake

命令:

$ automake –add-missing
configure.in: installing `./install-sh’
configure.in: installing `./mkinstalldirs’
configure.in: installing `./missing’
Makefile.am: installing `./depcomp’

automake 会遵照Makefile.am 文件发出部分文件,包含最重点的Makefile.in

6 、执行configure 生成Makefile

$ ./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… a.out
checking whether the C compiler works… yes
checking whether we are cross compiling… no
checking for suffix of executables…
sqlite,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
$ ls -l Makefile
-rw-rw-r– 1 yutao yutao 15035 Oct 15 10:40 Makefile

你可以看看,此时Makefile 已经发生出来了。

7 、使用Makefile 编译代码

$ make

if gcc -DPACKAGE_NAME=”” -DPACKAGE_TARNAME=”” -DPACKAGE_VERSION=””

DPACKAGE_STRING=”” -DPACKAGE_BUGREPORT=”” -DPACKAGE=”helloworld”
-DVERSION=”1.0″

-I. -I. -g -O2 -MT helloworld.o -MD -MP -MF “.deps/helloworld.Tpo” /
-c -o helloworld.o `test -f ‘helloworld.c’ || echo ‘./’`helloworld.c;
/
then mv -f “.deps/helloworld.Tpo” “.deps/helloworld.Po”; /
else rm -f “.deps/helloworld.Tpo”; exit 1; /
fi
gcc -g -O2 -o helloworld helloworld.o

运行helloworld

$ ./helloworld
Hello, Linux World!

这么helloworld
就编译出来了,你一旦按下面的手续来做的话,应该也会很容易地编译出不错的helloworld
文件。你还足以试着使用一些其 他的make 命令,如make clean ,make install
,make dist
,看看它们会给您如何的职能。感觉咋样?自己也能写出这么专业的Makefile
,老董必然会对你刮目相看。

四、深切浅出

针对地方提到的顺序命令,大家再做些详细的牵线。

1 、 autoscan

autoscan 是用来扫描源代码目录生成configure.scan 文件的。autoscan
可以用目录名做为参数,但假诺你不利用参数的话,那么 autoscan
将认为利用的是当前目录。autoscan
将围观你所指定目录中的源文件,并创建configure.scan 文件。

2 、 configure.scan

configure.scan
包含了系统安排的主干选项,里面都是局部宏定义。大家需要将它改名为configure.in

3 、 aclocal

aclocal 是一个perl 脚本程序。aclocal 依据configure.in
文件的情节,自动生成aclocal.m4 文本。aclocal 的定义是:“aclocal – create
aclocal.m4 by scanning configure.ac” 。

4 、 autoconf

autoconf 是用来发出configure 文件的。configure
是一个剧本,它能设置源程序来适应各个不同的操作系统阳台,并且遵照不同的连串来发出合适的Makefile
,从而可以使你的源代码能在不同的操作系统平台上被编译出来。

configure.in 文件的始末是一些宏,这么些宏经过autoconf
处理后会变成检查系统特性、环境变量、软件必须的参数的shell
脚本。configure.in
文件中的宏的顺序并从未规定,不过你不可以不在所有宏的最前方和最终面分别增长AC_INIT
宏和AC_OUTPUT 宏。

在configure.ini 中:

# 号表示注释,那些宏后边的内容将被忽视。

AC_INIT(FILE)

这些宏用来检查源代码所在的路线。

AM_INIT_AUTOMAKE(PACKAGE, VERSION)

其一宏是必须的,它描述了我们将要变化的软件包的名字及其版本号:PACKAGE
是软件包的名字,VERSION 是版本号。当你利用make dist
命令时,它会给您生成一个像样helloworld-1.0.tar.gz
的软件发行包,其中就有相应的软件包的名字和版本号。

AC_PROG_CC

其一宏将检查系统所用的C 编译器。

AC_OUTPUT(FILE)

这个宏是我们要出口的Makefile 的名字。

咱俩在使用automake 时,实际上还索要用到此外的有些宏,但我们可以用aclocal
来帮大家机关发出。执行aclocal 后我们会博得aclocal.m4 文件。

爆发了configure.in 和aclocal.m4 两个宏文件后,我们就足以采纳autoconf
来发出configure 文件了。

5 、 Makefile.am

Makefile.am 是用来生成Makefile.in 的,需要你手工书写。Makefile.am
中定义了一些情节:

AUTOMAKE_OPTIONS

本条是automake 的选项。在执行automake 时,它会检讨目录下是否留存标准GNU
软件包中应具有的各样文件,例如AUTHORS 、ChangeLog 、NEWS
等公事。大家将其设置成foreign 时,automake
会改用一般软件包的正统来检查。

bin_PROGRAMS

本条是指定我们所要发生的可执行文件的文件名。尽管您要发出多少个可执行文件,那么在依次名字间用空格隔开。

helloworld_SOURCES

其一是指定暴发“helloworld”
时所需要的源代码。假若它采纳了多个源文件,那么请使用空格符号将它们隔开。比如需要
helloworld.h ,helloworld.c 那么请写成helloworld_SOURCES= helloworld.h
helloworld.c 。

假定你在bin_PROGRAMS
定义了五个可执行文件,则附和每个可执行文件都要定义绝对的filename_SOURCES

6 、 automake

咱俩应用automake –add-missing 来发出Makefile.in 。

慎选–add-missing 的定义是“add missing standard files to package”
,它会让automake 出席一个专业的软件包所必须的片段文书。

咱俩用automake 爆发出来的Makefile.in 文件是适合GNU Makefile
惯例的,接下去我们只要进行configure 那多少个shell 脚本就可以爆发合适的
Makefile 文件了。

7 、 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” 的公文。PACKAGE
和VERSION ,是大家在configure.in 中定义的AM_INIT_AUTOMAKE(PACKAGE,
VERSION) 。

make distcheck

扭转宣布软件包并对其展开测试自我批评,以确定发布包的科学。那多少个操作将机关把压缩包文件解开,然后实施configure
命令,并且实施make
,来确认编译不出现谬误,最后提示您软件包已经准备好,可以发布了。

===============================================

helloworld-1.0.tar.gz is ready for distribution

make distclean

看似make clean ,但还要也将configure 生成的公文全体剔除掉,包括Makefile

五、结束语

由此地点的牵线,你应该可以很容易地生成一个您自己的适合GNU 惯例的Makefile
文件及相应的品种文件。

假如您想写出更复杂的且符合常规的Makefile
,你可以参考一些开放代码的品类中的configure.in 和Makefile.am
文件,比如:嵌入式数据库sqlite
,单元测试cppunit 。

网站地图xml地图