在MTK项目中试用分布式编译系统IncrediBuild

之前搞过一段时间的MTK开发,大概是要在某型号的MTK手机上加一个小硬件设备,并提供相应的软件界面,开机后直接进入自定的界面。我在MTK开发上和之前搞君正开发一样,也是搞了一段时间就转其它项目了。不过这中间用到一个比较有意思的技术——分布式编译,用了之后感觉很爽,值得单独拿出来写一下。

话说一年前的某天,我拿到了一台MTK手机,一份MTK的源码和一堆文档。时隔太久,只记得手机牌子是huayu的,具体型号CPU之类的忘了。按照文档说明,安装好ADS、PERL,补丁、USB驱动后就开始编译ROM和模拟器了。可能有人会问,为何有真机还要模拟器呢?因为烧录一次真机有点麻烦,开机关机烧录要半天,也无法直接下断点跟踪调试,相比之下模拟器启动速度快能直接调试还是有一点优势的。编译ROM是在命令行下完成,编译模拟器默认要求VC6,不过经过一番试验修改我在VS2008下也编译运行通过了。

一切都很正常,我在VS2008下写代码,创建新应用目录,添加新的MMI界面,编写菜单图标资源,编译通过后在模拟器上调试,调试完成后在DOS命令行下编译ROM,通过USB烧录到手机运行。但有一点很不正常:编译速度奇慢无比。

MTK项目有好几千个C源文件,我双核1.9GHz的机器MAKE一次需要大半个小时。这还仅仅是REMAKE,不是REBUILD,REBUILD大概要一个多小时,具体多久我不太确定,因为REBUILD时我实在等不下去就出去转了一圈,回来时已经编译完成了。然后它的模拟器需要在VC下运行,编译一次又需要大半个小时。随便改个资源ID或代码变更,都要编译半天。因此决定搞分布式编译,把公司一些空闲的机器用起来。

选择的分布编译工具是IncrediBuild,xoreax的产品,它的好处是同时支持VC项目和MAKE命令。在跟同事折腾一通之后,终于配置编译成功,过程如下:

1.安装服务端和客户端Agent。

安装程序:incredibuild3_40.exe。局域网上只需要一个服务器,其它机器可选择只安装客户端。

2.连接:安装完后,会自动启动并连接,任务栏上有一个托盘图标,可随时查看状态:

在MTK项目中试用分布式编译系统IncrediBuild_第1张图片

在MTK项目中试用分布式编译系统IncrediBuild_第2张图片

编译过程需要主机分解任务并在网络间传输文件,因此编译机器也不是越多越好,大概三四台机合作就好了。从上图知我在局域网上已经有2台6核的编译机器,基本上已经够用了。

3.编译VC工程:直接执行BUILD|OPEN菜单命令,打开VC工程,选择BUILD或REBUILD即可。

在MTK项目中试用分布式编译系统IncrediBuild_第3张图片

在MTK项目中试用分布式编译系统IncrediBuild_第4张图片

或者直接用VC中的命令菜单:

在MTK项目中试用分布式编译系统IncrediBuild_第5张图片

分布式编译开始工作,只要有需要,在线空闲的机器都会用起来:

在MTK项目中试用分布式编译系统IncrediBuild_第6张图片

像我这个MTK模拟器的VC工程,原本要大半小时编译的,现在只需要1分10秒。

4.MTK MAKE命令行的分布编译。这个稍为复杂一点,步骤如下:

4.1 替换make/Gsm2.mak文件中所有的make.exe命令,改为支持分布式编译的命令,例如

原命令:

tools/make.exe -fmake/comp.mak -k -r -R $(strip $(CMD_ARGU)) COMPONENT=$* > $(strip $(COMPLOGDIR))/$*.log 2>&1
替换为: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" /openmonitor

4.2 修改make2.pl中的CPU进程数及相关参数:

原文中:
if ($fullOpts eq "") {
$fullOpts = "CMD_ARGU=-j$NOP";
} else {
$fullOpts .= ",-j$NOP";
}
修改为:
if ($fullOpts eq "") {
$fullOpts = "CMD_ARGU=-j$ENV{/"NUMBER_OF_PROCESSORS/"}"."0";
} else {
$fullOpts .= ",-j$ENV{/"NUMBER_OF_PROCESSORS/"}"."0";
}

原文中:$ENV{"NUMBER_OF_PROCESSORS"} = 1;
修改为:$ENV{"NUMBER_OF_PROCESSORS"} = 12;

4.3 如果tools/make.exe不支持多任务,也需要将它替换,同时将XGConsole.xml文件也放到tools/make下。

4.4 最后执行原编译命令(如“make remake”),编译过程中弹出分布编译监控窗口:

在MTK项目中试用分布式编译系统IncrediBuild_第7张图片

实测结果:在DOS下对ROM执行REMAKE一次需要4分钟,UPDATE一次要7分钟。不是很理想,但已经比原来大半小时好很多了。编程时大部分时间在VC中,而VC只需要1分多钟,已经很满足了。

你可能感兴趣的:(Build)