mirror of
https://github.com/rn10950/RetroZilla.git
synced 2024-11-16 20:40:11 +01:00
366 lines
14 KiB
Perl
366 lines
14 KiB
Perl
|
# Windows implementation of platform-specific installer functions:
|
||
|
#
|
||
|
# BuildPlatformInstaller()
|
||
|
|
||
|
# Define wizard file locations
|
||
|
$exe_suffix = '.exe';
|
||
|
@wizard_files = (
|
||
|
"setup.exe",
|
||
|
"setuprsc.dll"
|
||
|
);
|
||
|
|
||
|
sub BuildPlatformInstaller
|
||
|
{
|
||
|
# copy the lean installer to stub\ dir
|
||
|
print "\n****************************\n";
|
||
|
print "* *\n";
|
||
|
print "* creating Stub files... *\n";
|
||
|
print "* *\n";
|
||
|
print "****************************\n";
|
||
|
print "\n $gDirDistInstall/stub/$seiFileNameSpecificStub\n";
|
||
|
|
||
|
# build the self-extracting .exe (installer) file.
|
||
|
copy("$gDirDistInstall/$seiFileNameGeneric", "$gDirDistInstall/$seiFileNameSpecificStub") ||
|
||
|
die "copy $gDirDistInstall/$seiFileNameGeneric $gDirDistInstall/$seiFileNameSpecificStub: $!\n";
|
||
|
|
||
|
$origCwd = cwd();
|
||
|
chdir($gDirDistInstall);
|
||
|
system("./nsztool.exe $seiFileNameSpecificStub setup/*.*") && die "Error creating self-extracting installer";
|
||
|
chdir($origCwd);
|
||
|
|
||
|
if(-d "$gDirDistInstall/stub")
|
||
|
{
|
||
|
unlink <$gDirDistInstall/stub/*>;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
mkdir ("$gDirDistInstall/stub",0775);
|
||
|
}
|
||
|
copy("$gDirDistInstall/$seiFileNameSpecificStub", "$gDirDistInstall/stub") ||
|
||
|
die "copy $gDirDistInstall/$seiFileNameSpecificStub $gDirDistInstall/stub: $!\n";
|
||
|
|
||
|
|
||
|
# create the xpi for launching the stub installer
|
||
|
print "\n************************************\n";
|
||
|
print "* *\n";
|
||
|
print "* creating stub installer xpi... *\n";
|
||
|
print "* *\n";
|
||
|
print "************************************\n";
|
||
|
print "\n $gDirDistInstall/$seiStubRootName.xpi\n\n";
|
||
|
|
||
|
if(-d "$gDirStageProduct/$seiStubRootName")
|
||
|
{
|
||
|
unlink <$gDirStageProduct/$seiStubRootName/*>;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
mkdir ("$gDirStageProduct/$seiStubRootName",0775);
|
||
|
}
|
||
|
copy("$gDirDistInstall/stub/$seiFileNameSpecificStub", "$gDirStageProduct/$seiStubRootName") ||
|
||
|
die "copy $gDirDistInstall/stub/$seiFileNameSpecificStub $gDirStageProduct/$seiStubRootName: $!\n";
|
||
|
|
||
|
# Make .js files
|
||
|
if(MakeJsFile($seiStubRootName))
|
||
|
{
|
||
|
return(1);
|
||
|
}
|
||
|
|
||
|
# Make .xpi file
|
||
|
if(system("perl $gNGAppsScriptsDir/makexpi.pl $seiStubRootName $gDirStageProduct $gDirDistInstall"))
|
||
|
{
|
||
|
print "\n Error: perl $gNGAppsScriptsDir/makexpi.pl $seiStubRootName $gDirStageProduct $gDirDistInstall\n";
|
||
|
return(1);
|
||
|
}
|
||
|
|
||
|
# group files for CD
|
||
|
print "\n************************************\n";
|
||
|
print "* *\n";
|
||
|
print "* creating Compact Disk files... *\n";
|
||
|
print "* *\n";
|
||
|
print "************************************\n";
|
||
|
print "\n $gDirDistInstall/cd\n";
|
||
|
|
||
|
if(-d "$gDirDistInstall/cd")
|
||
|
{
|
||
|
unlink <$gDirDistInstall/cd/*>;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
mkdir ("$gDirDistInstall/cd",0775);
|
||
|
}
|
||
|
|
||
|
copy("$gDirDistInstall/$seiFileNameSpecificStub", "$gDirDistInstall/cd") ||
|
||
|
die "copy $gDirDistInstall/$seiFileNameSpecificStub $gDirDistInstall/cd: $!\n";
|
||
|
|
||
|
StageUtils::CopyFiles("$gDirDistInstall/xpi", "$gDirDistInstall/cd");
|
||
|
|
||
|
# create the big self extracting .exe installer
|
||
|
print "\n**************************************************************\n";
|
||
|
print "* *\n";
|
||
|
print "* creating Self Extracting Executable Full Install file... *\n";
|
||
|
print "* *\n";
|
||
|
print "**************************************************************\n";
|
||
|
print "\n $gDirDistInstall/$seiFileNameSpecific\n";
|
||
|
|
||
|
if(-d "$gDirDistInstall/sea")
|
||
|
{
|
||
|
unlink <$gDirDistInstall/sea/*>;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
mkdir ("$gDirDistInstall/sea",0775);
|
||
|
}
|
||
|
|
||
|
copy("$gDirDistInstall/$seiFileNameGeneric", "$gDirDistInstall/$seiFileNameSpecific") ||
|
||
|
die "copy $gDirDistInstall/$seiFileNameGeneric $gDirDistInstall/$seiFileNameSpecific: $!\n";
|
||
|
|
||
|
$origCwd = cwd();
|
||
|
chdir($gDirDistInstall);
|
||
|
|
||
|
system("./nsztool.exe $seiFileNameSpecific setup/*.* xpi/*.*") &&
|
||
|
die "\n Error: ./nsztool.exe $seiFileNameSpecific setup/*.* xpi/*.*\n";
|
||
|
chdir($origCwd);
|
||
|
|
||
|
copy("$gDirDistInstall/$seiFileNameSpecific", "$gDirDistInstall/sea") ||
|
||
|
die "copy $gDirDistInstall/$seiFileNameSpecific $gDirDistInstall/sea: $!\n";
|
||
|
|
||
|
unlink <$gDirDistInstall/$seiFileNameSpecificStub>;
|
||
|
|
||
|
if ($ENV{MOZ_INSTALLER_USE_7ZIP})
|
||
|
{
|
||
|
# 7-Zip Self Extracting Archive
|
||
|
print "\n********************************************************************\n";
|
||
|
print "* *\n";
|
||
|
print "* creating 7-Zip Self Extracting Executable Full Install File... *\n";
|
||
|
print "* *\n";
|
||
|
print "********************************************************************\n";
|
||
|
print "\n $gDirDistInstall/7-zip\n";
|
||
|
|
||
|
if(-d "$gDirDistInstall/7z")
|
||
|
{
|
||
|
unlink <$gDirDistInstall/7z/*>;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
mkdir ("$gDirDistInstall/7z",0775);
|
||
|
}
|
||
|
|
||
|
# Set up the 7-Zip stage
|
||
|
if(-d "$gDirDistInstall/7zstage")
|
||
|
{
|
||
|
unlink <$gDirDistInstall/7zstage/*>;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
mkdir ("$gDirDistInstall/7zstage",0775);
|
||
|
}
|
||
|
|
||
|
# Copy the files into the stage
|
||
|
chdir("$gDirDistInstall/setup");
|
||
|
`cp *.* $gDirDistInstall/7zstage`;
|
||
|
chdir("$gDirDistInstall/xpi");
|
||
|
`cp *.* $gDirDistInstall/7zstage`;
|
||
|
chdir("$gDirDistInstall");
|
||
|
|
||
|
# Copy the 7zSD SFX launcher to dist/install/7z
|
||
|
copy("$topsrcdir/$ENV{WIZ_sfxModule}", "$gDirDistInstall/7z") ||
|
||
|
die "copy $topsrcdir/$ENV{WIZ_sfxModule} $gDirDistInstall/7z\n";
|
||
|
|
||
|
# Copy the SEA manifest to dist/install/7z
|
||
|
copy("$inConfigFiles/app.tag", "$gDirDistInstall/7z") ||
|
||
|
die "copy $inConfigFiles/app.tag $gDirDistInstall/7z";
|
||
|
|
||
|
# Copy the generation batch file to dist/install
|
||
|
copy("$inConfigFiles/7zip.bat", "$gDirDistInstall") ||
|
||
|
die "copy $inConfigFiles/7zip.bat $gDirDistInstall";
|
||
|
|
||
|
chdir($gDirDistInstall);
|
||
|
system("cmd /C 7zip.bat");
|
||
|
move("$gDirDistInstall/7z/SetupGeneric.exe", "$gDirDistInstall/sea/$seiFileNameSpecific") ||
|
||
|
die "move $gDirDistInstall/SetupGeneric.exe $gDirDistInstall/sea/$seiFileNameSpecific";
|
||
|
}
|
||
|
|
||
|
# post-mozilla-rel.pl unsets MOZ_INSTALLER_USE_7ZIP so it can make the xpi
|
||
|
# files so we only run when MOZ_INSTALLER_USE_7ZIP is set until
|
||
|
# post-mozilla-rel.pl is fixed
|
||
|
if ($ENV{MOZ_PACKAGE_NSIS} && $ENV{MOZ_INSTALLER_USE_7ZIP})
|
||
|
{
|
||
|
# NSIS Installer - requires 7-Zip Self Extracting Archive
|
||
|
print "\n********************************\n";
|
||
|
print "* *\n";
|
||
|
print "* creating NSIS Installer... *\n";
|
||
|
print "* *\n";
|
||
|
print "********************************\n";
|
||
|
print "\n $gDirDistInstall/nsis\n";
|
||
|
|
||
|
# Make sure this is compiling on a win32 system
|
||
|
$win32 = ($^O =~ / ((MS)?win32)|cygwin|os2/i) ? 1 : 0;
|
||
|
if (!$win32) {
|
||
|
die "ERROR: NSIS installers can currently only be made on the Windows platforms\n";
|
||
|
}
|
||
|
|
||
|
# Make sure makensis.exe is available
|
||
|
$makensis = `which makensis.exe`;
|
||
|
if (!defined($makensis) or length($makensis) lt 1) {
|
||
|
die "ERROR: makensis.exe not found. Is NSIS installed and in your $PATH?\n";
|
||
|
}
|
||
|
|
||
|
# Make sure 7z.exe is available
|
||
|
$zip = `which 7z.exe`;
|
||
|
if (!defined($zip) or length($zip) lt 1) {
|
||
|
die "ERROR: 7z.exe not found. Is 7-Zip installed and in your $PATH?\n";
|
||
|
}
|
||
|
|
||
|
# Make sure installer-stage is available
|
||
|
if (!(-d "$topobjdir/installer-stage")) {
|
||
|
die "ERROR: $topobjdir/installer-stage not found.\n ".
|
||
|
"First make installer-stage in the application's installer ".
|
||
|
"directory to stage the files.\n";
|
||
|
}
|
||
|
|
||
|
# Set up the NSIS stage
|
||
|
if(-d "$gDirDistInstall/nsis")
|
||
|
{
|
||
|
unlink <$gDirDistInstall/nsis/*>;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
mkdir ("$gDirDistInstall/nsis",0775);
|
||
|
}
|
||
|
|
||
|
# Set up the NSIS config directory for inclusion in the SEA
|
||
|
if(-d "$topobjdir/installer-stage/config")
|
||
|
{
|
||
|
die "installer-stage/config shouldn't exist!";
|
||
|
}
|
||
|
|
||
|
mkdir ("$topobjdir/installer-stage/config",0775);
|
||
|
|
||
|
# Copy application NSIS installer files
|
||
|
copy("$inConfigFiles/instfiles-extra.nsi", "$gDirDistInstall/nsis") ||
|
||
|
die "copy $inConfigFiles/instfiles-extra.nsi $gDirDistInstall/nsis: $!\n";
|
||
|
copy("$inConfigFiles/SetProgramAccess.nsi", "$gDirDistInstall/nsis") ||
|
||
|
die "copy $inConfigFiles/SetProgramAccess.nsi $gDirDistInstall/nsis: $!\n";
|
||
|
copy("$inConfigFiles/appLocale.nsi", "$gDirDistInstall/nsis") ||
|
||
|
die "copy $inConfigFiles/appLocale.nsi $gDirDistInstall/nsis: $!\n";
|
||
|
copy("$gDirDistInstall/license.txt", "$gDirDistInstall/nsis") ||
|
||
|
die "copy $gDirDistInstall/license.txt $gDirDistInstall/nsis: $!\n";
|
||
|
copy("$inDistPath/branding/wizHeader.bmp", "$gDirDistInstall/nsis") ||
|
||
|
die "copy $inDistPath/branding/wizHeader.bmp $gDirDistInstall/nsis: $!\n";
|
||
|
copy("$inDistPath/branding/wizWatermark.bmp", "$gDirDistInstall/nsis") ||
|
||
|
die "copy $inDistPath/branding/wizWatermark.bmp $gDirDistInstall/nsis: $!\n";
|
||
|
|
||
|
# Copy config files used during setip when the installer runs
|
||
|
copy("$inConfigFiles/defines.nsi", "$gDirDistInstall/nsis") ||
|
||
|
die "copy $inConfigFiles/defines.nsi $gDirDistInstall/nsis: $!\n";
|
||
|
|
||
|
# Copy toolkit NSIS installer files
|
||
|
copy("$gNGAppsScriptsDir/windows/nsis/common.nsh", "$gDirDistInstall/nsis") ||
|
||
|
die "copy $gNGAppsScriptsDir/windows/nsis/common.nsh $gDirDistInstall/nsis: $!\n";
|
||
|
copy("$gNGAppsScriptsDir/windows/nsis/installer.nsi", "$gDirDistInstall/nsis") ||
|
||
|
die "copy $gNGAppsScriptsDir/windows/nsis/installer.nsi $gDirDistInstall/nsis: $!\n";
|
||
|
copy("$gNGAppsScriptsDir/windows/nsis/options.ini", "$gDirDistInstall/nsis") ||
|
||
|
die "copy $gNGAppsScriptsDir/windows/nsis/options.ini $gDirDistInstall/nsis: $!\n";
|
||
|
copy("$gNGAppsScriptsDir/windows/nsis/shortcuts.ini", "$gDirDistInstall/nsis") ||
|
||
|
die "copy $gNGAppsScriptsDir/windows/nsis/shortcuts.ini $gDirDistInstall/nsis: $!\n";
|
||
|
copy("$gNGAppsScriptsDir/windows/nsis/ShellLink.dll", "$gDirDistInstall/nsis") ||
|
||
|
die "copy $gNGAppsScriptsDir/windows/nsis/ShellLink.dll $gDirDistInstall/nsis: $!\n";
|
||
|
copy("$gNGAppsScriptsDir/windows/nsis/version.nsh", "$gDirDistInstall/nsis") ||
|
||
|
die "copy $gNGAppsScriptsDir/windows/nsis/version.nsh $gDirDistInstall/nsis: $!\n";
|
||
|
copy("$gNGAppsScriptsDir/windows/wizard/setuprsc/setup.ico", "$gDirDistInstall/nsis") ||
|
||
|
die "copy $gNGAppsScriptsDir/windows/wizard/setuprsc/setup.ico $gDirDistInstall/nsis: $!\n";
|
||
|
|
||
|
# Copy toolkit NSIS installer locale files
|
||
|
copy("$topsrcdir/toolkit/locales/en-US/installer/windows/commonLocale.nsh", "$gDirDistInstall/nsis") ||
|
||
|
die "copy $topsrcdir/toolkit/locales/en-US/installer/windows/commonLocale.nsh $gDirDistInstall/nsis: $!\n";
|
||
|
|
||
|
# Create the NSIS installer
|
||
|
# makensis.exe commandline options that affect stdout logging
|
||
|
# /Vx verbosity where x is 4=all,3=no script,2=no info,1=no warnings,0=none
|
||
|
# /Ofile specifies a text file to log compiler output (default is stdout)
|
||
|
chdir("$gDirDistInstall/nsis");
|
||
|
system("makensis.exe installer.nsi") &&
|
||
|
die "Error creating NSIS installer";
|
||
|
|
||
|
copy("$inConfigFiles/app.tag", "$gDirDistInstall/nsis") ||
|
||
|
die "copy $inConfigFiles/app.tag $gDirDistInstall/nsis";
|
||
|
|
||
|
# Stage files to installer-stage
|
||
|
copy("$gDirDistInstall/nsis/setup.exe", "$topobjdir/installer-stage") ||
|
||
|
die "copy $gDirDistInstall/nsis $topobjdir/installer-stage: $!";
|
||
|
copy("$inConfigFiles/removed-files.log", "$topobjdir/installer-stage/config") ||
|
||
|
die "copy $inConfigFiles/removed-files.log $topobjdir/installer-stage/config: $!";
|
||
|
|
||
|
my $dostopsrcdir = $topsrcdir;
|
||
|
my $dosDistInstall = $gDirDistInstall;
|
||
|
if ($^O =~ /cygwin/) {
|
||
|
$dostopsrcdir = `cygpath --mixed --short-name $topsrcdir`;
|
||
|
$dosDistInstall = `cygpath --mixed --short-name $gDirDistInstall`;
|
||
|
chomp ($dostopsrcdir, $dosDistInstall);
|
||
|
}
|
||
|
|
||
|
chdir "$topobjdir/installer-stage";
|
||
|
system("7z a -r -t7z $dosDistInstall/nsis/app.7z -mx -m0=BCJ2 -m1=LZMA:d24 -m2=LZMA:d19 -m3=LZMA:d19 -mb0:1 -mb0s1:2 -mb0s2:3") &&
|
||
|
die "7z failed: $!";
|
||
|
|
||
|
system("upx --best -o $dosDistInstall/nsis/7zSD.sfx $dostopsrcdir/$ENV{WIZ_sfxModule}") &&
|
||
|
die "'upx --best -o $dosDistInstall/nsis/7zSD.sfx $dostopsrcdir/$ENV{WIZ_sfxModule}' failed: $!";
|
||
|
|
||
|
# Temporary name change to include -nsis before .exe
|
||
|
$nsisFileNameSpecific = $seiFileNameSpecific;
|
||
|
$nsisFileNameSpecific =~ s/\.exe$/-nsis\.exe/;
|
||
|
|
||
|
chdir("$gDirDistInstall/nsis");
|
||
|
|
||
|
# Since we are using a unique temp name for the NSIS installer it is safe
|
||
|
# to copy it alongside the xpinstall based installer.
|
||
|
print ("cmd /C copy /b 7zSD.sfx+app.tag+app.7z ..\\\\sea\\\\$nsisFileNameSpecific\n");
|
||
|
|
||
|
system("cmd /C copy /b 7zSD.sfx+app.tag+app.7z ..\\\\sea\\\\$nsisFileNameSpecific") &&
|
||
|
die "Final concatenation failed.";
|
||
|
}
|
||
|
print " done!\n\n";
|
||
|
|
||
|
if((!(-e "$topsrcdir/../redist/microsoft/system/msvcrt.dll")) ||
|
||
|
(!(-e "$topsrcdir/../redist/microsoft/system/msvcirt.dll")))
|
||
|
{
|
||
|
print "***\n";
|
||
|
print "**\n";
|
||
|
print "** The following required Microsoft redistributable system files were not found\n";
|
||
|
print "** in $topsrcdir/../redist/microsoft/system:\n";
|
||
|
print "**\n";
|
||
|
if(!(-e "$topsrcdir/../redist/microsoft/system/msvcrt.dll"))
|
||
|
{
|
||
|
print "** msvcrt.dll\n";
|
||
|
}
|
||
|
if(!(-e "$topsrcdir/../redist/microsoft/system/msvcirt.dll"))
|
||
|
{
|
||
|
print "** msvcirt.dll\n";
|
||
|
}
|
||
|
print "**\n";
|
||
|
print "** The above files are required by the installer and the browser. If you attempt\n";
|
||
|
print "** to run the installer, you may encounter the following bug:\n";
|
||
|
print "**\n";
|
||
|
print "** http://bugzilla.mozilla.org/show_bug.cgi?id=27601\n";
|
||
|
print "**\n";
|
||
|
print "***\n\n";
|
||
|
}
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
sub MakeExeZip
|
||
|
{
|
||
|
my($aSrcDir, $aExeFile, $aZipFile) = @_;
|
||
|
my($saveCwdir);
|
||
|
|
||
|
$saveCwdir = cwd();
|
||
|
chdir($aSrcDir);
|
||
|
if(system("zip $gDirDistInstall/xpi/$aZipFile $aExeFile"))
|
||
|
{
|
||
|
chdir($saveCwdir);
|
||
|
die "\n Error: zip $gDirDistInstall/xpi/$aZipFile $aExeFile";
|
||
|
}
|
||
|
chdir($saveCwdir);
|
||
|
}
|
||
|
|