在做C/C++与数据库相关开发时,编译时会用到数据库的include与lib文件,而因为数据库在同一系统会有多个版本都需要编译,如Oracle有9i,10g,11g等。不同数据库版本在不同操作系统上都要编译,是件很烦的事。
因为代码都一样,仅仅因为引用不同,就要编译这么多次。为了有更多的时间做更有意义的事,写个脚本来实现自动化编译是很自然的事。
因为代码都一样,仅仅因为引用不同,就要编译这么多次。为了有更多的时间做更有意义的事,写个脚本来实现自动化编译是很自然的事。
如果项目是直接手写Makefile文件那还比较好写,可惜这个项目用的是Automake. 这个东东弄时步骤就要多点。
用Automake时,关键文件我认为只有两个configure.in 与Makefile.am. 其中后者定义了编译参数,其中自然就包括了每次编译要引用的include与lib路径。只要用脚本搞定这个文件就行了。
步骤如下:1. 新增一个目录,将用于存放脚本及编译模板mkdir -p /xcl/template2. 在所需的每个操作系统中,按正常流程把数据库每个版本跑一遍Automake的编译。并将每次编译时的Makefile.am复制到 /xcl/template 目录下,并按脚本规则命名。具体规则在后面有说明 。
cp Makefile.am /xcl/template/Makefile.am_lib_LX_ORA10Gcp Makefile.am /xcl/template/Makefile.am_lib_LX_DB2V9
这些按规则排列的Makefile.am文件,将作为以后编译的模板文件。
3. 然后运行脚本,进行编译大至过程如下:
[root@O11g64 agent]# sh *.shDBAgent Compiler Systemplease choice[1,2,3]:1)Oracle Application2)DB2 Application3) Exit2********DB2 Version**********1)DB2 V92)DB2 V103)ALL4)Exit******************************Enter option[1,2,3,4]:1DB2 V9********Operating System**********1)Linux(64bit)2)AIX3)HP-UX4)SUN5)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
如果把这些脚本再扩展下,可以做一些项目的自动化编译与发布系统。就看有没有需求了。
MAIL: xcl_168@aliyun.com
BLOG:http://blog.csdn.net/xcl168