Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

468 lines
13 KiB

# BuildComponentVC.pm
#
# created: 8/05/99
package main;
use strict 'subs';
if (!$__IITBUILDPM ) { use iit::build; }
sub BuildComponentVC
{
my($rc) = 1;
my($cmdBuild) = "msdev /USEENV ";
my($sTargetName) = "";
my($sIniFile) = "";
my($sBuildFile) = "";
my($sConfig) = "";
my($sMakeTemplate) = "";
my($sWorkspaceName) = "";
my($sBuildProc) = "";
my($bDoClean) = 0;
local(@lProjects) = ();
local(@lBuildTypes) = ();
local(@lBuildConfigs) = ();
if ($DEBUG) { PrintL("BuildComponentVC(".join(", ", @_).")\n", PL_PURPLE); }
# process arguments
foreach $i (@_)
{
if ($i =~ /\.ini$/i)
{
$sIniFile = $i;
}
elsif ($i =~ /^CONFIG=/i)
{
$sConfig = $i;
$sConfig =~ s/^CONFIG=//i;
}
elsif (($i =~ /^(DEBUG|RELEASE|PROFILE)$/i) || IsMemberOf($i, @lAllowedBuilds))
{
push(@lBuildTypes, uc($i));
}
elsif ($i eq PROC)
{
$sBuildProc = $i;
}
elsif ($i eq "")
{
}
elsif ($i =~ /\.(dsp|dsw)$/)
{
$sBuildFile = $i;
$cmdBuild .= $i." ";
}
elsif (lc($i) eq "rebuild")
{
$bDoClean = 1;
}
else
{
push(@lBuildConfigs, $i);
}
}
if ($sIniFile)
{
my($sConfigDash) = (($sConfig eq "" ) ? "" : uc($sConfig)."-");
UpdateProjectsInBuildIni($sIniFile, $sBuildFile);
($sWorkspaceName) = GetFieldFromBuildIni($sIniFile, $sBuildFile, $sConfigDash."NAME");
($sMakeTemplate) = GetFieldFromBuildIni($sIniFile, $sBuildFile, $sConfigDash."MAKESTRING");
@lProjects = GetFieldFromBuildIni($sIniFile, $sBuildFile, $sConfigDash."MAKES");
foreach $project (@lProjects)
{
foreach $build (GetFieldFromBuildIni($sIniFile, $sBuildFile, uc($project)."-BUILDS"))
{
my($config) = $sMakeTemplate;
$config =~ s/\%MAKE\%/$project/i;
$config =~ s/\%BUILD\%/$build/i;
push(@lBuildConfigs, $config);
}
}
}
local(@lTmp) = @lBuildConfigs;
@lBuildConfigs = ();
foreach $config (@lTmp)
{
my($configGood) = 0;
foreach $build (@lBuildTypes)
{
if (($config =~ /$build/i) && ($config =~ /$sBuildProc/i))
{
$configGood = 1;
}
#***** TODO: REMOVE (temporary fix for dsps without x86 in title)
if ($config =~ /alpha/i)
{
$configGood = 0;
}
#*****
}
if ($configGood)
{
push(@lBuildConfigs, $config);
}
}
if ($bDoClean)
{
PrintL("\nCleaning up ...\n\n", PL_SUBHEADER);
local(@lAlreadyCleaned) = ();
foreach $build (@lBuildConfigs)
{
if (!IsMemberOf($build, @lAlreadyCleaned))
{
push(@lAlreadyCleaned, $build);
$_Execute = 1;
Execute($cmdBuild.'/MAKE "'.$build.'" /CLEAN');
my $tmp = $_Execute;
undef $_Execute;
PrintL($tmp);
foreach $line (split("\n", $tmp))
{
$line =~ s/[^']*'([^']*)'.*/$1/;
if ($line ne "")
{
push(@lAlreadyCleaned, $line);
}
}
}
else
{
PrintL(' - Skipping "'.$build.'" (already cleaned)'."\n", PL_BLUE);
}
}
}
foreach $build (@lBuildConfigs)
{
++$nTotalBuilds;
my($sMakeName) = "";
if ($sWorkspaceName eq "")
{
$sMakeName = $sBuildFile.", ".$build;
}
else
{
$sMakeName = $sWorkspaceName.", ".$build;
}
my($cmdBuildProj) = $cmdBuild.'/MAKE "'.$build.'" ';
PrintL("\n"."#" x (39 - ((length($sMakeName) + (length($sMakeName) % 2)) / 2)).
' '.$sMakeName.' '."#" x (39 - ((length($sMakeName) - (length($sMakeName) % 2)) / 2))."\n\n",
PL_GREEN | PL_FLUSH);
BEGIN_DHTML_NODE("(click to expand)");
my($startTime) = time();
my($strMsg) = "";
PrintL($cmdBuildProj."\n");
eval
{
open (MSDEVIN, $cmdBuildProj.' 2>&1 |');
while(<MSDEVIN>)
{
PrintL($_);
if (/: (error|fatal error|info|information|assert)(,| )/i
|| (/: warning(,| )/i
&& !/different attributes \(40000040\)/)
|| /\*\*\* (Error|Warning|Info): /i
|| (/WARNING: /i
&& !/Context switch during time delta calculation/) # icap stuff
|| /failed\./
|| /is not recognized/
|| /^error/i
|| /- (\d+ error\(s\), [^0]+|[^0]+ error\(s\), \d+) warning\(s\)/)
{
$strMsg .= "<dd>".$_;
}
}
$bNothingDone = 0;
if ($bcStatus & BC_NOTHINGDONE)
{
$bcStatus -= BC_NOTHINGDONE;
}
close(MSDEVIN);
};
END_DHTML_NODE();
my($stopTime) = time();
my($sDiff) = FmtDeltaTime($stopTime - $startTime);
if ($CHILD_ERROR)
{
++$nFailedBuilds;
$rc = 0;
PrintLTip($sMakeName." FAILED\n\n", "Build Time: ".$sDiff, PL_BIGERROR);
# @faillist = (@faillist, substr $buildtype, 0, 1);
}
else
{
PrintLTip($sMakeName." Succeeded\n\n", "Build Time: ".$sDiff, PL_NOTAG | PL_MSG | PL_GREEN);
}
if ($strMsg ne "")
{
PrintMsgBlock(split(/\n/, $strMsg));
}
}
PrintL("BuildComponentVC returns ".$rc."\n", $PL_VERBOSE);
if (!$rc && IsCritical())
{
$bBuildFailed = 1;
}
return($rc);
}
sub GetFieldFromBuildIni
{
my($sIniFile, $sBuildFile, $sField) = @_;
my($sBuildFileBase) = RemovePath($sBuildFile);
my(@lResults) = ();
my($fhIni) = OpenFile($sIniFile, "read");
if (!$fhIni)
{
return("");
}
my($bFoundProj) = 0;
my($bFieldPassed) = 0;
my($bFieldFound) = 0;
while (!$fhIni->eof() && !$bFieldPassed && !$bFieldFound)
{
my($text) = $fhIni->getline();
if ($bFoundProj)
{
if ($text =~ /^\[/)
{
$bFoundProj = 0;
$bFieldPassed = 1;
}
elsif ($text =~ /^$sField=/i)
{
$bFieldFound = 1;
$text =~ s/^$sField=//i;
chomp($text);
if ($text =~ /,/)
{
@lResults = split(/\s*,\s*/, $text);
}
else
{
$lResults[0] = $text;
}
}
}
elsif ($text =~ /^\[$sBuildFileBase\]/i)
{
$bFoundProj = 1;
}
}
CloseFile($fhIni);
if (!$bFieldFound && ($sField =~ /-/))
{
my($sParentField) = $sField;
$sParentField =~ s/^[^-]*-//;
return(GetFieldFromBuildIni($sIniFile, $sBuildFile, $sParentField));
}
else
{
return(@lResults);
}
}
sub UpdateProjectsInBuildIni($$)
#TODO: error handling
{
my($sIniFile, $sBuildFile) = @_;
# my($sConfigTemplate) = GetAllTextFromFile($sIniFile);
# $sConfigTemplate =~ s/MAKESTRING=([^\n]*)\n.*/$1/;
local(%hComponentBuilds) = ();
my($fhIni) = OpenFile($sIniFile, "read");
my($fhBuild) = OpenFile($sBuildFile, "read");
my($rc) = 1;
local(@lShipConfigs) = ();
if (!$fhIni || !$fhBuild)
{
return(0);
}
PrintL(" - Checking ".$sBuildFile." for necessary updates to ".$sIniFile." ...\n");
while ($fhBuild && !$fhBuild->eof())
{
my($text) = $fhBuild->getline();
if ($text =~ /^Project: \"/)
{
if ($text =~ /^Project: \"all\"/)
{
my($bAllDone) = 0;
while(!$fhBuild->eof() && !$bAllDone)
{
$text = $fhBuild->getline();
if ($text =~ /^###############################################################################\n$/)
{
$bAllDone = 1;
}
elsif ($text =~ /Project_Dep_Name /)
{
$text =~ s/^\s*//g;
$text =~ s/Project_Dep_Name //;
chomp($text);
push(@lShipConfigs, $text);
}
}
}
else
{
my($name) = $text;
$name =~ s/^Project: \"([^\"]*)\".*/$1/;
chomp($name);
if ($text =~ /="/)
{
$text =~ s/[^=]*="([^"]*)".*/$1/;
}
else
{
$text =~ s/[^=]*=([^\s]*)\s.*/$1/;
}
chomp($text);
my($fhProject) = OpenFile($text, "read");
if ($fhProject)
{
while (!$fhProject->eof())
{
my($text) = $fhProject->getline();
if ($text =~ /^# Begin Target/)
{
local(@lComponentBuilds) = ();
while (!$fhProject->eof() && $text !~ /# End Target/)
{
$text = $fhProject->getline();
if ($text =~ /^# Name "/)
{
$text =~ s/^# Name "([^"]*)".*/$1/;
chomp($text);
# my($tempConfig) = $sConfigTemplate;
# $tempConfig =~ s/%[^%]*%//g;
local(@lElems) = split(" - Win32 ", $text); #TODO: fix
push(@lComponentBuilds, $lElems[1]);
}
}
%hComponentBuilds = (%hComponentBuilds,
$name => join(", ", @lComponentBuilds));
}
}
}
else
{
PrintL("Could not find project file: ".$text."\n", PL_BIGERROR);
}
}
}
}
CloseFile($fhBuild);
if (scalar(keys(%hComponentBuilds)) == 0)
{
return(0); #something's screwed up
}
my($sMakesText) = "MAKES=".join(", ", keys(%hComponentBuilds))."\n";
my($sShipMakesText) = "SHIP-MAKES=".join(", ", @lShipConfigs)."\n";
my($sIniText) = "";
my($sBuildFileBase) = RemovePath($sBuildFile);
my($bFoundProj) = 0;
while (!$fhIni->eof())
{
my($text) = $fhIni->getline();
if ($bFoundProj)
{
if ($text =~ /^\[/)
{
$bFoundProj = 0;
}
elsif ($text =~ /^MAKES=/i)
{
$text = $sMakesText;
}
elsif ((@lShipConfigs != ()) && ($text =~ /^SHIP-MAKES=/i))
{
$text = $sShipMakesText;
}
elsif ($text =~ /-BUILDS=/i)
{
my($compName) = $text;
$compName =~ s/^([^-]*)-BUILDS=.*/$1/i;
chomp($compName);
if (GetKeyCaseInsensitive($compName, %hComponentBuilds) ne "")
{
$text = $compName."-BUILDS=".GetKeyCaseInsensitive($compName, %hComponentBuilds)."\n";
SetKeyCaseInsensitive($compName, "", *hComponentBuilds);
}
}
}
elsif ($text =~ /^\[$sBuildFileBase\]/i)
{
$bFoundProj = 1;
}
$sIniText .= $text;
}
# write the new configs to the ini file
foreach $config (keys(%hComponentBuilds))
{
if ($hComponentBuilds{$config} ne "")
{
$sIniText .= $config."-BUILDS=".$hComponentBuilds{$config}."\n";
}
}
CloseFile($fhIni);
unlink($sIniFile.".tmp");
$fhOut = OpenFile($sIniFile.".tmp", "write");
if (!$fhOut)
{
return(0);
}
$fhOut->print($sIniText);
CloseFile($fhOut);
if (IsReadOnly($sIniFile))
{
$rc = ssrepl($sIniFile.".tmp", $sIniFile);
}
else
{
$rc = EchoedCopy($sIniFile.".tmp", $sIniFile);
}
unlink($sIniFile.".tmp");
return($rc);
}
$__IITBUILDCOMPONENTVCPM = 1;
1;