Automake环境的搭建
【服务器环境】
LINUX版本:Ubuntu 9.10
Automake版本: (GNU automake) 1.11
Autoconf版本: (GNU Autoconf) 2.64
【介绍】
虽然上面只提到了automake和autoconf工具,但是在实际使用过程中,还需要autoscan,aclocal工具。也就是说我们一共需要用到
autoscan,aclocal,autoconf,automake这几个工具。在ubuntu中,我们通过apt-get install命令,系统会自动为我们安装所有工具,不需要手动去下载。在执行完这些命令之后,编译目录下才会生成configure文件,之后我们可以通过熟悉的"./configure","make","make install"命令进行代码的编译和安装。
下面是这些工具的一些简单介绍,网上都有,下面有部分是从网上摘录,其实刚开始学习automake没有必要去完全弄清楚这些工具是干什么的,可以略过。
autoscan是用来扫描源代码目录生成configure.scan文件的。autoscan可以用目录名做为参数,但如果你不使用参数的话,那么autoscan将认为使用的是当前目录。autoscan将扫描你所指定目录中的源文件,并创建configure.scan文件。configure.scan包含了系统配置的基本选项,里面都是一些宏定义。我们在实际使用过程中,往往把configure.scan文件改成configure.in或者configure.ac文件。
注:- note: configure.in was the name used for autoconf files, now deprecated.(出自:http://mij.oltrelinux.com/devel/autoconf-automake/)虽然手册中不推荐改成configure.in,但是我们可以不去理会。
aclocal是一个perl 脚本程序。aclocal根据configure.in文件的内容,自动生成aclocal.m4文件。aclocal的定义是:“aclocal - create aclocal.m4 by scanning configure.ac”。
注:aclocal.m4文件。当时在学习的时候,非常纠结于这个m4后缀到底是什么意思,虽说是个无关痛痒的问题,但是每次看到这个文件,总会去琢磨这个后缀到底代表了一个什么东东。其实非常简单,m4就是代表macro的意思,也就是说m后面有4个字母,大牛的思维果然和普通人不一致。:)
autoconf是用来产生configure文件的。configure是一个脚本,它能设置源程序来适应各种不同的操作系统平台,并且根据不同的系统来产生合适的Makefile,从而可以使你的源代码能在不同的操作系统平台上被编译出来。configure.in文件的内容是一些宏,这些宏经过autoconf 处理后会变成检查系统特性、环境变量、软件必须的参数的shell脚本。configure.in文件中的宏的顺序并没有规定,但是你必须在所有宏的最前面和最后面分别加上AC_INIT宏和AC_OUTPUT宏。
automake用来生成Makefile.in文件。Those .in files will be used by autoconf scripts to produce the final Makefiles(是用来生成Makefile文件的,所以是比较重要的文件)
总的说来,流程关系图是这样的
(转自http://blog.zquan.me/?tag=aclocal-m4)
只要能把图看明白,生成makefile也就不会搞不清楚顺序了。
下面的工程目录,是我新建的一个目录,我根据这个目录来讲解一下如何搭建编译工程。
【工程目录】
模块注释:
driver:驱动代码
software:模块代码根目录
-alarm 告警模块
-common 公共模块
-config 配置模块
-ctrl 主控模块
-lib 存放编译好之后的so动态库
-lib_source 第三方库的源代码
-ptz 云台控制模块
-rtp RTP流媒体模块
-sdkserver sdk服务模块
-server 消息通信服务模块
-storage 存储模块
-webclient CGI模块
-xml 存放XML配置文件
【执行过程】
步骤1:在software目录下,使用autoscan扫描当前目录(它会自动扫描子目录,所以你只需要在根目录下执行一次即可),会在software下面生成configure.scan文件,如前面说过的,我们需要把configure.scan文件改名为configure.in,否则无法被其他工具识别
1.autoscan
2.mv configure.scan configure.in
改名后,我们还需要根据自己的实际情况,对configure.in文件进行修改。工具的版本不同,生成的configure.in文件也可能不同,不过我们只需要关注极少部分即可。
注:实际使用过程中,你只需要关注我用红色箭头所标识的几个宏命令就可以了,其他的宏命令还有很多,需要你自己根据实际情况查阅手册获取使用方法。
步骤2.
在software下面执行aclocal命令,生成aclocal.m4文件。(若autoscan.in文件缺少了AC_INIT_AUTOMAKE宏,就无法生成aclocal.m4文件)
步骤3.
在software下面执行autoconf命令,生成configure文件。
注:autoconf 是用来生成自动配置软件源代码脚本(configure)的工具。configure脚本能独立于autoconf运行,且在运行的过程中,不需要用户的干预,要生成configure,必须用到aclocal.m4。
步骤4.
configure脚本已创建,若这时候执行./configure命令,会提示出错,如下
config.status: error: cannot find input file: `Makefile.in'
因为到目前为止,我们还没有把Makefile.in文件生成出来,那么如何生成Makefile.in呢?我们首先需要编写Makefile.am文件,看看后缀名.am,我们就可以知道,这个Makefile.am是给automake工具使用的,通过Makefile.am文件,我们把Makefile.in生成出来,然后通过./configure命令读取执行Makefile.in,把makefile生成出来。最后才是我们的"make"和“make install"
应该说,automake只要按部就班,依照顺序敲几个命令是非常容易的,唯一麻烦的就是写Makefile.am文件,我们需要在每个参与编译的子目录下都创建一个Makefile.am文件。虽说在整个创建流程中,Makefile.am是最繁琐的一步(考虑到子目录可能比较多的情况),但是相对比起自己写每一个makefile文件,还是要轻松许多的。
1.我们首先创建software/Makefile.am文件,怎么写呢?
可以看到,我在里面设了两个变量,SUBDIRS和AUTOMAKE_OPTIONS. 这两个是系统自带的变量,类似于这种系统自带的变量后面还会看到。
SUBDIRS变量,顾名思义,就是子目录的意思,应为software是工程根目录,所以,我们只需要在这个Makefile.am中指明子目录有哪些就可以了,在执行过程中,会自动到子目录下面去寻找对应的Makefile.am,所以说还是相当简单的。
AUTOMAKE_OPTIONS变量,看图就知道了,不解释。
2.创建好根目录下的Makefile.am,那么子目录即子模块的Makefile.am又该如何写呢?一起看!
我选择software/rtp模块作为讲解目录,它的Makefile.am是这样写的。假设RTP模块下面的文件只有一个stream.cpp,那么我们就这样写,如图
关于bin_PROGRAMS还要说一点的就是,我们在make install后,生成的bin文件会把它拷到/usr/local/bin之类的系统目录下,若你不想拷贝,防止原来的文件被覆盖,你可以用noinst_PROGRAMS替换bin_PROGRAMS(noinst即not install的缩写嘛,你懂得)
OK,其他目录的下面的Makefile.am,你都可以参照我上面举的例子,依样画葫芦,非常简单。
步骤5.
等你逐个的把所有Makefile.am整好后,你就可以在software目录下执行automake --add-missing命令了,执行完成之后,会在每个目录下面自动生成Makefile.in文件。最后执行linux安装文件三部曲,"configure","make","make install",你可以随便执行了。
这里面所讲到知识点,只是涉及到了automake里面很少的一部分,想要知道更多,建议多看看别人写的技术文章或者看看官方手册。
还有一个比较好的方法是,下几个开源的代码,自己去琢磨它们的写法。