IncrediBuild工具使用及设置.doc_第1页
IncrediBuild工具使用及设置.doc_第2页
IncrediBuild工具使用及设置.doc_第3页
IncrediBuild工具使用及设置.doc_第4页
IncrediBuild工具使用及设置.doc_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

IncrediBuild工具使用及设置分类:工具说明2011-06-20 11:56663人阅读评论(0)收藏举报虽然现在计算机的运算速度不断提高,但大型软件的编译速度仍然是个漫长的过程,我所在的项目,软件大小约为200K行,在VC6下的编译时间为3分钟(P4 1.8G, 512M),在交叉编译时更慢,提高编译速度将能够直接提高前期调测的效率.本文将介绍提高编译速度的有效方法之一-分布式编译.分布式编译的原理很简单,就是将编译的整个工作量通过分布计算的方法分配到多个计算机上执行,这样可以获得极大的效率提升.由于分布式计算的技术相对成熟,现在可以见到的分布式编译软件也较多.一般来说,一个分布式编译软件不是一个编译器,而是附着在某个编译器上的分布计算管理软件,使得对于特定的编译器可以实现分布式编译.常见的分布式编译器通常是对应于特定的C/C+编译器,如Gcc, Visual C+,因为这些编译器使用相当广泛且开放度高.因而实现分布式编译的意义更大.下面分别以Visual C+和Gcc为例说明两个典型的分布式编译软件:1)IncrediBuild这是一个对应Visual C+的分布式编译软件,通过Visual C+强大的IDE扩展功能,它有着非常友好的界面,可以将整个分布式编译过程直观的展现给用户,并且它通过一个虚拟机的技术,使能编译的参与者可以与编译发起者有着不同的系统配置(Windows操作系统版本,库文件等),甚至无需在参与者机器上安装Visual C+.IncrediBuild需要一个特定的计算机做仲裁者,其他的所有计算机作为客户,有了仲裁者的好处是,可以有它来统一安排所有客户端所发起的编译请求,一旦某个客户发起编译请求,则仲裁者会根据其他客户的CPU空闲情况而安排分布式编译,当多个客户同时发起编译请求时,仲裁者会自动平衡分布计算负担,使得编译参与者不会占用过多的CPU.在我们的项目中,使用IncrediBuild的结果如下:未使用: 3分钟5客户: 40秒10客户: 25秒可见IncrediBuild对编译性能的巨大提升,并且在取得如此性能提升的同时,仲裁者和编译参与者的CPU占用率很低.保持相当高的可用性,这是很难得的.IncridiBuild的缺点是目前仅支持Visual C+ 6编译器和.Net编译器,也仅适用于Windows平台.适用范围相对较窄.2)DistCC这是一个GNU的分布式C+编译器,适用于一切Gcc兼容的C+编译器, DistCC也具有很好的跨平台特性,支持Linux, XFree86, CygWin等平台.使用范围相当广泛.DistCC和IncrediBuild的差别在与DistCC不使用仲裁者,直接由客户端对其他客户端发起编译请求.所以每个客户端都需要知道其他客户端的位置,并且当多个客户发起编译请求时不易做平衡处理.下面说一下怎样利用increbuild实现分布式编译1.make文件夹里面的Gsm2.mak修改make工具的编译项为IncredBuild增加运行参数#echo tools/make.exe -fmake/comp.mak -r -R COMPONENT=$* . $(strip $(COMPLOGDIR)/$*.logif /I %OS% EQU WINDOWS_NT /(if /I $(BM_NEW) EQU TRUE /(XGConsole /command=tools/make.exe -fmake/comp.mak -k -r -R $(strip $(CMD_ARGU) COMPONENT=$* $(strip $(COMPLOGDIR)/$*.log 2&1 /NOLOGO /profile=tools/XGConsole.xml) /else /(XGConsole /command=tools/make.exe -fmake/comp.mak -r -R $(strip $(CMD_ARGU) COMPONENT=$* $(strip $(COMPLOGDIR)/$*.log 2&1 /NOLOGO /profile=tools/XGConsole.xml) /) /else /(if /I $(BM_NEW) EQU TRUE /(tools/make.exe -fmake/comp.mak -k -r -R $(strip $(CMD_ARGU) COMPONENT=$* $(strip $(COMPLOGDIR)/$*.log) /else /(tools/make.exe -fmake/comp.mak -r -R $(strip $(CMD_ARGU) COMPONENT=$* $(strip $(COMPLOGDIR)/$*.log) /)type $(strip $(COMPLOGDIR)/$*.log $(LOG)perl ./tools/chk_lib_err_warn.pl $(strip $(COMPLOGDIR)/$*.log2.tools工具夹里面加入XGConsole.xml内容为 3.tools工具夹里面的make2.pl修改以下几行if ($action eq update) | ($action eq remake) | ($action eq new) | ($action eq bm_new) | ($action eq c,r) | ($action eq c,u) if ($ENVNUMBER_OF_PROCESSORS 1) if ($fullOpts eq ) $fullOpts = CMD_ARGU=-j$ENV/NUMBER_OF_PROCESSORS/; else $fullOpts .= ,-j$ENV/NUMBER_OF_PROCESSORS/; 改为if ($action eq update) | ($action eq remake) | ($action eq new) | ($action eq bm_new) | ($action eq c,r) | ($action eq c,u) if ($ENVNUMBER_OF_PROCESSORS = 1) if ($fullOpts eq ) $fullOpts = CMD_ARGU=-j$ENV/NUMBER_OF_PROCESSORS/.0; else $fullOpts .= ,-j$ENV/NUMBER_OF_PROCESSORS/.0;$ENVNUMBER_OF_PROCESSORS = 10; /修改为你想要的进程数4.把tools里面的make.exe换成多任务的文件联合编译的功能引入分为下面几个要素:1使能或禁止联合编译功能;2检查XGC是否存在;3定义可用的进程数;4中间编译文件;5编译命令;1.1.使能或禁止联合编译的参数设定对于MTK平台,可以通过命令行方式参数“-disable_ib”,“-no_ib”或“-bm”。我们可以通过查看脚本make2.pl确认。 elsif ($ARGV0 = /-disable_ib/i)$disable_ib = 1; elsif ($ARGV0 = /-no_ib/i)$disable_ib = 1; elsif ($ARGV0 = /-bm/i)$disable_ib = 1; 确认联合编译环境接着系统开始检查联合编译器以及系统是否支持联合编译,请看下面脚本的检查。首先,脚本执行命令“$exec_xgc_result = XGConsole /NOLOGO /SILENT /NOWAIT tools/XGC_Test.xml 2&1;”,确认是否存在联合编译器。my $no_of_proc=1;my $exec_xgc_result=999;# $exec_xgc_result = system(XGConsole /NOLOGO /SILENT tools/XGC_Test.xml /n);$exec_xgc_result = XGConsole /NOLOGO /SILENT /NOWAIT tools/XGC_Test.xml 2&1;if ($exec_xgc_result ne )$exec_xgc_result=99;# print XGConsole not found; elseif ($ENV/TERM/ eq ) & ($ENV/USERDOMAIN/ eq DOMAIN_MTK)$disable_ib = 1;print WARNING: XGConsole is supported but its NOT in telnet mode. TERM is not defined! /n;if ($disable_ib=0)$exec_xgc_result=0;# print XGConsole found; else$exec_xgc_result=99;其中,XGC_Test.xml是比较简单的。然后,通过环境变量确认OS是否支持联合编译。下面的脚本是用来确认对VC+的联合编译特性的支持的。my $exec_buildconsole=999;#$exec_buildconsole = system(BuildConsole /n);$exec_buildconsole = BuildConsole 2&1;if ($exec_buildconsole = /IncrediBuild/)if ( $ENV/TERM/ eq )$disable_ib = 1;print WARNING: BuildConsole is supported but its NOT in telnet mode. TERM is not defined! /n;if ($disable_ib=0)$exec_buildconsole=0;#print /nBuildConsole found; else$exec_buildconsole=99; else$exec_buildconsole=99;#print /nBuildConsole not found;if ( $exec_buildconsole=0 ) # support BuildConsolesystem perl tools/RunMsdev.pl;$msdev = BuildConsole msdev; else # not support BuildConsole$msdev = msdev;1.3.定义进程数根据CPU个数设定编译可创建的进程数,一般双核CPU的进程数设为4各基本均衡了。if ($action eq update) | ($action eq remake) | ($action eq new) | ($action eq bm_new) |($action eq c,r) | ($action eq c,u) | ($action eq scan)if ($ENVNUMBER_OF_PROCESSORS 1)if ( $exec_xgc_result=0 )$no_of_proc = $ENVNUMBER_OF_PROCESSORS*2;if ($fullOpts eq )$fullOpts = CMD_ARGU=-j$no_of_proc; else$fullOpts .= ,-j$no_of_proc; elseif ($fullOpts eq )$fullOpts = CMD_ARGU=-j$ENV/NUMBER_OF_PROCESSORS/; else$fullOpts .= ,-j$ENV/NUMBER_OF_PROCESSORS/;MTK还提供了通过“-o|-op|opt”来设定进程数。if ($fullOpts ne ) # Fix build errors when parallel jobs processing fuction enabled by argument -o|-op|-opt in command line my temp = mOpts; mOpts = (); foreach (temp) if ($_ = /s*(-j|-jobs)/) $fullOpts .= ,$_; else push(mOpts,$_); # End $fullOpts = s/g; $fullOpts = /$fullOpts/; $fullOpts = s/,/ /g; $makeCmd .= . join( , mOpts) . $fullOpts ;1.4.中间编译文件中间编译文件intermed.mak包括了需要编译各个模块的依赖关系和编译方法。1.5.编译命令(if /I $(BM_NEW) EQU TRUE /(XGConsole /command=tools/make.exe -fmake/intermed.mak -k -r -R $(strip $(CMD_ARGU) /NOLOGO /profile=tools/XGConsole.xml ) /else /(XGConsole /command=tools/make.exe -fmake/intermed.mak -r -R $(strip $(CMD_ARGU) /NOLOGO /profile=tools/XGConsole.xml ) /) /其中,XGConsole.xml规定了各种编译工具的是否支持远程工作和是否允许分段处理的特性。 按照Xoreax IncrediBuild的说明我们可以在用GNUMAKE等语言的编译器使用联合编译。IncrediBuild试用时间推迟的算法EXTERN_CvoidGetIncrediBuildLicKey(DATEdate,LPTSTRlpszKey,UINTcchMax)BYTE*pByte=(BYTE*)&date;BYTE*T1=(BYTE*)(pByte);BYTE*T2=(BYTE*)(pByte+2);DWORDdwM1=(DWORD)*pByte;dwM1*=(DWORD)*(pByte+1);dwM1*=(DWORD)*(pByte+2);dwM1*=(DWORD)*(pByte+3);WORDwM2=(WORD)*(pByte+4);wM2*=(WORD)*(pByte+5);WORDwM3=(WORD)*(pByte+6);wM3*=(WORD)*(pByte+7);TCHARszOutMAX_PATH=0;wsprintf(szOut,_T(%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X),dwM1,wM2,wM3,*T1,*(T1+1),*T2,*(T2+1),*(T2+2),*(T2+3),*(T2+4),*(T2+5);lstrcpyn(lpszKey,szOut,cchMax);以上代码调用方法:void CCrackibDlg:OnButton1() COleDateTime destTime = COleDateTime:GetCurrentTime(); COleDateTime dateTime(destTime.GetYear(), destTime.GetMonth()+1, destTime.GetDay()-1, 23, 59, 59); DATE Date = (DATE)dateTime; TCHAR szOutMAX_PATH = 0 ; GetIncrediBuildLicKey(DATE)Date, szOut, MAX_PATH); SetDlgItemText(IDC_EDIT1, szOut);-这些天对IncrediBuild进一步研究了其软件安全保护措施,发现3.40版本与前几个版本很相似,只是对于试用版有效期限保护的密文更换了在注册表中的位置。下面我详细解释我这两天的研究过程,希望对大家有帮助。1.打开注册表监督程序,查看已安装IncrediBuild的“关于”对话框,发现它会去取注册表的键值:HKEY_CLASSES_ROOT/Interface/48C6296A-4F4C-4238-A9E1-60E9A544A863FieldHKEY_CLASSES_ROOT/Interface/48C6296A-4F4C-4238-A9E1-60E9A544A863/NumMethods4HKEY_CLASSES_ROOT/Interface/48C6296A-4F4C-4238-A9E1-60E9A544A863/ProxyStubClsid32M1-M2-M3-T1-T22.当我把ProxyStubClsid32的键值修改为“0”,查看IncrediBuild的“关于”对话框,提示我过期时间为1899-12-30;3.删除HKEY_CLASSES_ROOT/Interface/48C6296A-4F4C-4238-A9E1-60E9A544A863整个项目,查看IncrediBuild的“关于”对话框,提示我证书无效;4.卸载IncrediBuild后,并将电脑时间设置到2100年,再安装软件,安装完成后,提示我过期时间为2100年某年某月,但软件仍为过期不能使用。5.通过上面的实验可以肯定的是在试用版授权模式下,试用期确定为30天,当前时间与过期时间相差大于30天,都认为过期。可过期时间的密文的位置已经让我们发现,我们可以在不改变授权模式的情况下,总取更新过期时间也能达到延长软件使用的效果。看过网上一些文章说,其证书是RSA签出的证书,要么修改软件中的公钥去更换加密密钥,这样影响颇大。幸好,网上有高手给出了3.31的过期时间密文的加密算法,那让我们来冲浪一下吧。破解方案确定为重置试用期时间。编码,测试,单调却有那么点诱惑的成就感:整个破解程序的流程为:1.调用GetLocalTime获取当前时间;2.做计算当前日期后若干天数的算法:unsigned char month_days12 = 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31;days = curday + offset;for(months = curmonth -1; ; months+) years = curyear + months/12; if(curyear%4) month_days1 = 28; else month_days1 = 29; if(days &1;”,确认是否存在联合编译器。my $no_of_proc=1;my $exec_xgc_result=999;# $exec_xgc_result= system(XGConsole /NOLOGO /SILENT tools/XGC_Test.xml /n);$exec_xgc_result= XGConsole /NOLOGO /SILENT /NOWAIT tools/XGC_Test.xml2&1;if($exec_xgc_result ne )$exec_xgc_result=99;# print XGConsole not found; elseif ($ENV/TERM/ eq ) & ($ENV/USERDOMAIN/ eq DOMAIN_MTK)$disable_ib = 1;print WARNING: XGConsole is supported but its NOT in telnet mode.TERM is not defined! /n;if ($disable_ib=0)$exec_xgc_result=0;# print XGConsole found; else$exec_xgc_result=99;其中,XGC_Test.xml是比较简单的。然后,通过环境变量确认OS是否支持联合编译。下面的脚本是用来确认对VC+的联合编译特性的支持的。my $exec_buildconsole=999;#$exec_buildconsole= system(BuildConsole /n);$exec_buildconsole= BuildConsole2&1;if ($exec_buildconsole= /IncrediBuild/)if ( $ENV/TERM/ eq )$disable_ib = 1;print WARNING: BuildConsole is supported but its NOT in telnet mode.TERM is not defined! /n;if ($disable_ib=0)$exec_buildconsole=0;#print /nBuildConsole found; else$exec_buildconsole=99; else$exec_buildconsole=99;#print /nBuildConsole not found;if ( $exec_buildconsole=0 ) # support BuildConsolesystem perl tools/RunMsdev.pl;$msdev = BuildConsole msdev; else# not support BuildConsole$msdev = msdev;1.3.定义进程数根据CPU个数设定编译可创建的进程数,一般双核CPU的进程数设为4各基本均衡了。if ($action eq update) | ($action eq remake) | ($action eq new) | ($action eq bm_new) |($action eq c,r) | ($action eq c,u) | ($action eq scan) if ($ENVNUMBER_OF_PROCESSORS 1) if ( $exec_xgc_result=0 )$no_of_proc = $ENVNUMBER_OF_PROCESSORS*2;if ($fullOpts eq ) $fullOpts = CMD_ARGU=-j$no_of_proc; else $fullOpts .= ,-j$no_of_proc; else if ($fullOpts eq ) $fullOpts = CMD_ARGU=-j$ENV/NUMBER_OF_PROCESSORS/; else $fullOpts .= ,-j$ENV/NUMBER_OF_PROCESSORS/;MTK还提供了通过“-o|-op|opt”来设定进程数。if ($fullOpts ne ) # Fix build errors when parallel jobs processing fuction enabled by argument -o|-op|-opt in command linemy temp = mOpts;mOpts = ();foreach (temp)if ($_ = /s*(-j|-jobs)/)$fullOpts .= ,$_;elsepush(mOpts,$_);# End$fullOpts = s/g;$fullOpts = /$fullOpts/;$fullOpts = s/,/ /g;$makeCmd .= . join( , mOpts) . $fullOpts ;1.4.中间编译文件中间编译文件intermed.mak包括了需要编译各个模块的依赖关系和编译方法。1.5.编译命令(if /I $(BM_NEW) EQU TRUE /(XGConsole /command=tools/make.exe-fmake/intermed.mak -k -r -R $(strip $(CMD_ARGU) /NOLOGO /profile=tools/XGConsole.xml )/else /(XGConsole /command=tools/make.exe-fmake/intermed.mak -r -R $(strip $(CMD_ARGU) /NOLOGO /profile=tools/XGConsole.xml )/) /其中,XGConsole.xml规定了各种编译工具的是否支持远程工作和是否允许分段处理的特性。按照Xoreax IncrediBuild的说明我们可以在用GNUMAKE等语言的编译器使用联合编译。分享到:小宝 加博友 关注他 他的网易微博最新日志 Windows 中 FS 段寄存器 V2( Using SignTool to Sign a F NSIS的卸载出现 nsis error 深入浅出C/C+中的正则表达 VC manifest Enabling Visual Styles该作者的其他文章博主推荐相关日志随机阅读 暗中影响人类寿命的八个原因 这个世界上有多少种“痛”(原创) 男人也有可爱面 细数男星卖萌瞬间!(高清大图) 期待南科大改革在合法渠道内走得更快

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论