windows-nt/Source/XPSP1/NT/enduser/speech/lib/perl/spg/buildcabs.pm
2020-09-26 16:20:57 +08:00

194 lines
6 KiB
Perl

if (!$__SPGBUILDPM ) { use spg::build; }
sub BuildCABs($$)
{
# SEDfile (no ext) => dropDirTarget
# keep release and debug separate (order is important, watch the targetnames)
@lCABs =
(
# "voices => ",
# "lexicons => ",
"srd1033 => ".$sDropDir."\\srd1033.exe",
"srd1041 => ".$sDropDir."\\srd1041.exe",
"srd2052 => ".$sDropDir."\\srd2052.exe",
# RELEASE:
# "mscsr5r => ".$sDropDir."\\release\\cab\\".PROC."\\mscsr5.exe",
# "mscsr5rq => ".$sDropDir."\\release\\cab\\".PROC."\\mscsr5q.exe",
# "sapi5_r => ".$sDropDir."\\release\\cab\\".PROC."\\sapi5sym.exe",
# "sapi5sdk_r => ".$sDropDir."\\release\\cab\\".PROC."\\sapi5sdk.exe",
# "sapi5rt => ".$sDropDir."\\release\\cab\\".PROC."\\sapi5.exe",
# "sapi5all_r => ".$sDropDir."\\release\\cab\\".PROC."\\sapi5all.exe",
# "sapi5all_rq => ".$sDropDir."\\release\\cab\\".PROC."\\sapi5allq.exe",
# DEBUG:
# "mscsr5d => ".$sDropDir."\\debug\\cab\\".PROC."\\mscsr5.exe",
# "sapi5_d => ".$sDropDir."\\debug\\cab\\".PROC."\\sapi5sym.exe",
# "sapi5sdk_d => ".$sDropDir."\\debug\\cab\\".PROC."\\sapi5sdk.exe",
# "sapi5all_d => ".$sDropDir."\\debug\\cab\\".PROC."\\sapi5all.exe",
);
local($sIniFile, $sTargetDir) = @_;
my($rc) = 1;
PushD($SAPIROOT);
# ************* formerly precab.cmd ***************
local(%hRenamedCABFiles) = ParseCabIni($sIniFile);
foreach $key (keys(%hRenamedCABFiles))
{
EchoedCopy($SAPIROOT."\\".$key, $SAPIROOT."\\".$hRenamedCABFiles{$key});
SetReadOnly($SAPIROOT."\\".$hRenamedCABFiles{$key}, 0);
}
# ************* formerly bldcabs.cmd ***************
PrintL("\nBuilding SAPI 5 cabpacks\n\n", PL_LARGE | PL_BOLD);
PrintL("\nInitializing...\n\n", PL_BOLD);
Delnode($sTargetDir);
EchoedMkdir($sTargetDir);
PrintL("\nMaking certification ...\n\n", PL_BOLD);
local($sCertFile) = $sTargetDir."\\sapikey.cer";
local($sSpcFile) = $sTargetDir."\\sapikey.spc";
unlink($sCertFile, $sSpcFile);
$rc = Execute($cmdMakeCert.' -u:SAPIKey -n:CN="Microsoft Corporation" '.$sCertFile) && $rc;
$rc = Execute($cmdCert2Spc.' '.$sCertFile.' '.$sSpcFile) && $rc;
PushD($sTargetDir);
PrintL("\nBuilding and Digitally signing cabpacks ...\n\n", PL_BOLD);
local(@lSEDFiles) = ();
foreach $elem (@lCABs)
{
my($sSEDFile, $sDestFile) = split(/\s*=>\s*/, $elem);
my($sCABName) = "";
my($fhIn) = OpenFile($SAPIROOT."\\build\\".$sSEDFile.".sed", "read");
if ($fhIn)
{
my($fhOut) = OpenFile($sTargetDir."\\".$sSEDFile.".sed", "write");
while(!$fhIn->eof())
{
my($text) = $fhIn->getline();
if ($text =~ /^TARGETNAME=/i)
{
$text =~ s/d:\\sapi5\\build/$sTargetDir/i;
my($tmp) = $text;
$tmp =~ s/^TARGETNAME=//i;
chomp($tmp);
$sCABName = $tmp;
}
elsif ($text =~ /^FILE.*\.inf/)
{
my($inf) = $text;
$inf =~ s/^[^\"]*\"([^\"]*)\"(.|\s)*$/$1/;
EchoedCopy($SAPIROOT."\\build\\".$inf, $sTargetDir."\\".$inf);
}
else
{
$text =~ s/d:\\sapi5\\build/$sTargetDir/ig;
$text =~ s/d:\\sapi5\\Src\\SR\\bin\\(\s)/$sTargetDir\\$1/ig;
$text =~ s/d:\\sapi5/$SAPIROOT/ig;
}
$fhOut->print($text);
}
CloseFile($fhIn);
CloseFile($fhOut);
}
else
{
PrintL("Error: could not read ".$sSEDFile.".sed, cannot create cab\n", PL_ERROR);
}
if (Execute($cmdIExpress.' /n /q '.$sTargetDir."\\".$sSEDFile.".sed"))
{
my($pDigSign) = SpawnProcess($cmdSignCode, '-spc "'.$sSpcFile.'" -'.(IsAlpha() ? 'v "'.$sCertFile.'"' : 'pvk "SAPIKey"').
' -prog "'.$sCABName.'" -name "Microsoft SAPI 5.0" -info "http://www.microsoft.com/iit"');
if ($pDigSign)
{
$pDigSign->Wait(60000); #shouldn't take longer than 1 minute
$pDigSign->Kill(1);
}
if (!$bNoCopy)
{
if (($sCABName ne "") && ($sDestFile ne ""))
{
EchoedCopy($sCABName, $sDestFile);
}
}
}
else
{
$rc = 0;
}
}
PopD(); #$sTargetDir
# ************* formerly postcab.cmd ***************
foreach $key (keys(%hRenamedCABFiles))
{
EchoedUnlink($SAPIROOT."\\".$hRenamedCABFiles{$key});
}
PopD(); #$SAPIROOT
return($rc);
}
sub ParseCabIni($)
{
my(%hIniHash) = ();
my($fhIni) = OpenFile($_[0], "read");
if ($fhIni)
{
my($curLine) = 0;
my($curText) = "";
my($dir) = "";
while (!$fhIni->eof())
{
$curText = $fhIni->getline();
++$curLine;
$curText =~ s/^\s*//;
chomp($curText);
if (($curText =~ /^#/) || ($curText eq ""))
{
}
elsif ($curText =~ /^\[.*\]/)
{
$dir = $curText;
$dir =~ s/^\[([^\]]*)\]/$1/;
}
else
{
local(@lFiles) = split(/\-\>/, $curText);
if (scalar(@lFiles) != 2)
{
PrintL("Error parsing ".$_[0].", line ".$curLine.": Invalid syntax\n", PL_BIGERROR);
}
else
{
%hIniHash = (%hIniHash, $dir."\\".$lFiles[0] => $dir."\\".$lFiles[1]);
}
}
}
}
return(%hIniHash);
}
$__BUILDCABSPM = 1;
1;