联合编译的意义在于充分利用网格中的闲置电脑资源提高我们的编译效率。它主要由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 ( $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等语言的编译器使用联合编译。
本文来源于无声无息 http://www.imeans.net/ , 原文地址:http://www.imeans.net/post/200911/4.html