IncrediBuild工具使用及设置.doc
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- IncrediBuild 工具 使用 设置
- 资源描述:
-
IncrediBuild工具使用及设置 分类: 工具说明2011-06-20 11:56 663人阅读 评论(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))/$*.log @if /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))/$*.log 2.tools工具夹里面加入 XGConsole.xml 内容为 <?xml version="1.0" encoding="UTF-8" standalone="no" ?> <Profile FormatVersion="1"> <Tools> <Tool Filename="perl" AllowRemote="true" /> <Tool Filename="make" AllowIntercept="true" /> <Tool Filename="tcc" AllowRemote="true" /> <Tool Filename="tcpp" AllowRemote="true" /> <Tool Filename="armcc" AllowRemote="true" /> <Tool Filename="armcpp" AllowRemote="true" /> <Tool Filename="strcmpex" AllowRemote="true" /> <Tool Filename="warp" AllowRemote="true" /> <Tool Filename="armar" AllowRemote="false" /> <Tool Filename="formelf" AllowRemote="false" /> </Tools> </Profile> 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 ($ENV{"NUMBER_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 ($ENV{"NUMBER_OF_PROCESSORS"} >= 1) { if ($fullOpts eq "") { $fullOpts = "CMD_ARGU=-j$ENV{/"NUMBER_OF_PROCESSORS/"}"."0"; } else { $fullOpts .= ",-j$ENV{/"NUMBER_OF_PROCESSORS/"}"."0"; } } } $ENV{"NUMBER_OF_PROCESSORS"} = 10; //修改为你想要的进程数 4.把tools里面的make.exe换成多任务的文件 联合编译的功能引入分为下面几个要素: 1. 使能或禁止联合编译功能; 2. 检查XGC是否存在; 3. 定义可用的进程数; 4. 中间编译文件; 5. 编译命令; 1.1. 使能或禁止联合编译的参数设定 对于MTK平台,可以通过命令行方式参数“-disable_ib”,“-no_ib”或“-bm”。我们可以通过查看脚本make2.pl确认。 }elsif ($ARGV[0] =~ /-disable_ib/i) { $disable_ib = 1; }elsif ($ARGV[0] =~ /-no_ib/i) { $disable_ib = 1; } elsif ($ARGV[0] =~ /-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"; } else { if (("$ENV{/"TERM/"}" eq "") && ("$ENV{/"USERDOMAIN/"}" eq "DOMAIN_MTK")) { $disable_ib = 1; print " WARNING: XGConsole is supported but it's 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是否支持联合编译。 <?xml version="1.0" encoding="UTF-8" standalone="no" ?> <BuildSet> <Environments> </Environments> </BuildSet> 下面的脚本是用来确认对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 it's 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 BuildConsole { system "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 ($ENV{"NUMBER_OF_PROCESSORS"} > 1) { if ( $exec_xgc_result==0 ) { $no_of_proc = $ENV{"NUMBER_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 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规定了各种编译工具的是否支持远程工作和是否允许分段处理的特性。 <?xml version="1.0" encoding="UTF-8" standalone="no" ?> <Profile FormatVersion="1"> <Tools> <Tool Filename="perl" AllowRemote="true" /> <Tool Filename="make" AllowIntercept="true" /> <Tool Filename="tcc" AllowRemote="true" /> <Tool Filename="tcpp" AllowRemote="true" /> <Tool Filename="armasm" AllowRemote="true" /> <Tool Filename="armcc" AllowRemote="true" /> <Tool Filename="armcpp" AllowRemote="true" /> <Tool Filename="strcmpex" AllowRemote="true" /> <Tool Filename="warp" AllowRemote="true" /> <Tool Filename="armar" AllowRemote="false" /> <Tool Filename="fromelf" AllowRemote="false" /> </Tools> </Profile> 按照Xoreax IncrediBuild的说明我们可以在用GNUMAKE等语言的编译器使用联合编译。 IncrediBuild 试用时间推迟的算法 EXTERN_C void GetIncrediBuildLicKey(DATE date, LPTSTR lpszKey, UINT cchMax) { BYTE * pByte = (BYTE *)&date; BYTE * T1 = (BYTE *) (pByte); BYTE * T2 = (BYTE *) (pByte + 2); DWORD dwM1 = (DWORD) *pByte; dwM1 *= (DWORD) *(pByte + 1); dwM1 *= (DWORD) *(pByte + 2); dwM1 *= (DWORD) *(pByte + 3); WORD wM2 = (WORD) *(pByte + 4); wM2 *= (WORD) *(pByte + 5); WORD wM3 = (WORD) *(pByte + 6); wM3 *= (WORD) *(pByte + 7); TCHAR szOut[MAX_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 szOut[MAX_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-60E9A544A863} "Field" HKEY_CLASSES_ROOT/Interface/{48C6296A-4F4C-4238-A9E1-60E9A544A863}/NumMethods "4" HKEY_CLASSES_ROOT/Interface/{48C6296A-4F4C-4238-A9E1-60E9A544A863}/ProxyStubClsid32 "{M1-M2-M3-T1-T2}" 2.当我把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_days[12] = {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_days[1] = 28; else month_days[1] = 29; if(days <= month_days[months%12]) break; days -= month_days[months%12]; } curyear = years; curmonth = months%12 + 1; curday = days; 3.过期时间密文算法: COleDateTime Date(curyear, curmonth, curday, curhour, curmin, cursec); DATE Date = (DATE)DateTime; memcpy(buf, &Date, sizeof(Date)); memcpy(&T1, &buf[0], 2); memcpy(&T2, &buf[2], 6); //注意T2应该用LONG64声明 M1 = buf[0] * buf[1] * buf[2] * buf[3]; M2 = buf[4] * buf[5]; M3 = buf[6] * buf[7]; 在字符转换的时候需要注意一些小细节,特别是T2。大家验证该算法的时候可以拿这个数据做验算. 2008-5-30-23-59-59 T1 = 0x37BA T2 = 0xE7FFDF55E340 M1 = 0x23EAE06 M2 = 0x4A0B M3 = 0x38C0 4.操作注册表 RegCreateKey, RegSetValue, RegCloseKey 5.重启IncrediBuild服务: 服务名:IncrediBuild_Agent 服务显示名:IncrediBuild Agent OpenSCManager, OpenService, ControlService, QueryServiceStatus, StartService, CloseServiceHandle IncrediBuild破解+3.51版本下载: IncrediBuild联合编译的使用 分类: incredibuild3_302009-06-15 17:32 1612人阅读 评论(0) 收藏 举报 联合编译的意义在于充分利用网格中的闲置电脑资源提高我们的编译效率。它主要由Agents和Coordinator Server组成。Agents主要作为工作机,分配出来的计算工作在这些电脑上完成。Coordinator Server负责分配工作,协调网络中的各个电脑的性能均衡。 联合编译的功能引入分为下面几个要素: 1. 使能或禁止联合编译功能; 2. 检查XGC是否存在; 3. 定义可用的进程数; 4. 中间编译文件; 5. 编译命令; 1.1. 使能或禁止联合编译的参数设定 对于MTK平台,可以通过命令行方式参数“-disable_ib”,“-no_ib”或“-bm”。我们可以通过查看脚本make2.pl确认。 } elsif ($ARGV[0] =~ /-disable_ib/i) { $disable_ib = 1; } elsif ($ARGV[0] =~ /-no_ib/i) { $disable_ib = 1; } elsif ($ARGV[0] =~ /-bm/i) { $disable_ib = 1; } 1.2. 确认联合编译环境 接着系统开始检查联合编译器以及系统是否支持联合编译,请看下面脚本的检查。首先,脚本执行命令“$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"; } else { if (("$ENV{/"TERM/"}" eq "") && ("$ENV{/"USERDOMAIN/"}" eq "DOMAIN_MTK")) { $disable_ib = 1; print " WARNING: XGConsole is supported but it's 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是否支持联合编译。 <?xml version="1.0" encoding="UTF-8" standalone="no" ?> <BuildSet> <Environments> </Environments> </BuildSet> 下面的脚本是用来确认对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 it's 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 (展开阅读全文
咨信网温馨提示:1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前可先查看【教您几个在下载文档中可以更好的避免被坑】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时联系平台进行协调解决,联系【微信客服】、【QQ客服】,若有其他问题请点击或扫码反馈【服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【版权申诉】”,意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:0574-28810668;投诉电话:18658249818。




IncrediBuild工具使用及设置.doc



实名认证













自信AI助手
















微信客服
客服QQ
发送邮件
意见反馈



链接地址:https://www.zixin.com.cn/doc/7040557.html