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

来源:互联网 发布:萤火虫壁纸软件手机 编辑:程序博客网 时间:2024/06/03 22:07
        在做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_OracleAppecho "" #清除原来的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

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

MAIL: xcl_168@aliyun.com
BLOG:http://blog.csdn.net/xcl168



0 0
原创粉丝点击