在做C/C++与数据库相关开发时,编译时会用到数据库的include与lib文件,而因为数据库在同一系统会有多个版本都需要编译,如Oracle有9i,10g,11g等。不同数据库版本在不同操作系统上都要编译,是件很烦的事。
因为代码都一样,仅仅因为引用不同,就要编译这么多次。为了有更多的时间做更有意义的事,写个脚本来实现自动化编译是很自然的事。
如果项目是直接手写Makefile文件那还比较好写,可惜这个项目用的是Automake. 这个东东弄时步骤就要多点。
用Automake时,关键文件我认为只有两个configure.in 与Makefile.am. 其中后者定义了编译参数,其中自然就包括了每次编译要引用的include与lib路径。只要用脚本搞定这个文件就行了。
步骤如下:
1. 新增一个目录,将用于存放脚本及编译模板
mkdir -p /xcl/template
2. 在所需的每个操作系统中,按正常流程把数据库每个版本跑一遍Automake的编译。并将每次编译时的Makefile.am
复制到 /xcl/template 目录下,并按脚本规则命名。具体规则在后面有说明 。
cp Makefile.am /xcl/template/Makefile.am_lib_LX_ORA10G
cp Makefile.am /xcl/template/Makefile.am_lib_LX_DB2V9
这些按规则排列的Makefile.am文件,将作为以后编译的模板文件。
3. 然后运行脚本,进行编译
大至过程如下:
[root@O11g64 agent]# sh *.sh
DBAgent Compiler System
please choice[1,2,3]:
1)Oracle Application
2)DB2 Application
3) Exit
2
********DB2 Version**********
1)DB2 V9
2)DB2 V10
3)ALL
4)Exit
******************************
Enter option[1,2,3,4]:
1
DB2 V9
********Operating System**********
1)Linux(64bit)
2)AIX
3)HP-UX
4)SUN
5)Exit
******************************
Enter option[1,2,3]:
2
。。。。。。
原理也很简单,在代码目录下,用make distclean清掉原来的,再依条件将template目录下的模板Makefile.am替换到代码所在目录下。运行.configure 与 make 即编译出来了,再编译出来的文件依规则命名后复制到指定目录下即可。
附上部份代码
#! /bin/sh
############################
#开始部份代码
#定义代码目录及所引用的头文件与动态库所在目录
lib_DB2Path="/xcl/work/app/DB2App"
lib_LX_DB2V9=${lib_DB2Path}"v9_Lx64/"
lib_LX_DB2V10=${lib_DB2Path}"v10_Lx64/"
lib_AIX__DB2V9=${lib_DB2Path}"v9_AIX/"
lib_AIX__DB2V10=${lib_DB2Path}"v10_AIX/"
#编译脚本当前路径
ShPath=`pwd`
echo $ShPath
......
#部份中间代码
#进入代码所在目录
cd $Path_OracleApp
echo ""
#清除原来的Makefile及相关文件
make distclean
#清除旧的Makefile.am文件
rm -f Makefile.am
#将模板文件目录下指定操作系统,指定数据库版本的Makefile.am复制到代码编译目录
cp ${ShPath}/template/${cur_mkam} Makefile.am
#下面三个Automake命令生成新的链接库或可执行文件
automake -a
./configure
make
#删除脚本目录下的子目录release中原来的.so文件
rm -f ${ShPath}"/release/"${cur_soname}".so"
#将Automake编译出来.so文件,将其复制脚本目录下的子目录release
cp .libs/*.so ${ShPath}"/release/"${cur_soname}".so"
.......
#最后部份
#返回代码目录,查看编译结果
cd $ShPath
如果把这些脚本再扩展下,可以做一些项目的自动化编译与发布系统。就看有没有需求了。