编译小结(8)巧用脚本做多系统多数据库版本程序的自动化编译

时间:2023-01-31 09:55:59


        在做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

如果把这些脚本再扩展下,可以做一些项目的自动化编译与发布系统。就看有没有需求了。