gtkradiant/setup/win32/setup.pl

498 lines
16 KiB
Perl
Raw Normal View History

#!/usr/bin/env perl
# see ./setup.pl for usage info
# the templated source
$TEMPLATE_DIR='template';
# the 'meta' directory (no longer a template, not a final setup dir yet)
$WORK_DIR='WorkDir';
# Source common perl functions
BEGIN {
push @INC, "../common";
}
use setup;
$common = new setup();
# replace in file
sub replace {
# only wrap setup::replace() for now
$common->replace(@_);
}
sub svn_cleanup {
$CLEAN = shift(@_);
# take out .svn/ directories
print "SVN file cleanup in $CLEAN...\n";
my $findscan;
open($findscan, "find $CLEAN -name .svn | ");
my $line = <$findscan>;
do
{
chop($line);
system("rm -rf '$line'");
} until (!($line = <$findscan>));
close($findscan);
}
# make a work version from the template
# for IS developer use, and for custom setups generation
sub build_work_tree()
{
print "Building a work tree in $WORK_DIR/ from $TEMPLATE_DIR/\n";
# make a clean copy
print "File copy...\n";
system("rm -rf $WORK_DIR");
system("cp -R $TEMPLATE_DIR $WORK_DIR");
svn_cleanup( "$WORK_DIR" );
my $ESCAPED_GTKRAD_DIR = $GTKRAD_DIR;
$ESCAPED_GTKRAD_DIR =~ s/\\/\\\\/g;
# proceed to replace <<GTKRAD_DIR>> in .fgl files
print "search/replace for base dir...\n";
open($findscan, "find $WORK_DIR -name '*.fgl' | ");
my $line = <$findscan>;
do
{
chop($line);
replace($line, '<<GTKRAD_DIR>>', $ESCAPED_GTKRAD_DIR);
} until (!($line = <$findscan>));
close($findscan);
}
# finalize from a work tree version
# this sets some common settings, but doesn't set customizable stuff (like game packs selection)
# as we customize more things, this should shrink
sub finalize_tree
{
my $DIR = shift(@_);
# what is the version?
# NOTE: I've had countless shit getting this extracted correctly
my $GTKRAD_VERSION=`cat ../../include/version.default | tr -d \\\\n\\\\r\\\\f`;
# what is the name of the binary?
my $GTKRAD_BIN="GtkRadiant-$GTKRAD_VERSION.exe";
print " Finalizing $DIR/...\n";
# copy the Radiant binary to a generated file with the right name
#print "the thing: cp ../../radiant/Release/GtkRadiant.exe ./bin/$GTKRAD_BIN\n";
system("cp ../../radiant/Release/GtkRadiant.exe ./bin/$GTKRAD_BIN");
# copy the splash screen - ET version
system("cp ../setup.bmp '$DIR/Setup Files/Uncompressed Files/Language Independent/OS Independent'");
# PRODUCT_VERSION
print " Product version $GTKRAD_VERSION...\n";
replace("$DIR/String Tables/0009-English/value.shl", '<<GTKRAD_VERSION>>', "$GTKRAD_VERSION ");
# set the binary name
print " Binary name $GTKRAD_BIN...\n";
replace("$DIR/File Groups/Program Executable Files.fgl", '<<GTKRAD_BIN>>', "$GTKRAD_BIN");
replace("$DIR/String Tables/0009-English/value.shl", '<<GTKRAD_BIN>>', "$GTKRAD_BIN");
replace("$DIR/Shell Objects/Default.shl", '<<GTKRAD_BIN>>', "$GTKRAD_BIN");
# install path prompt
replace("$SETUP_DIR/String Tables/0009-English/value.shl", '<<GTKRAD_FOLDER>>', "GtkRadiant $GTKRAD_VERSION");
# uuid
my $MAIN_GUID=`uuidgen`;
chop($MAIN_GUID);
chop($MAIN_GUID);
print " $SETUP_DIR/ has uuid: $MAIN_GUID...\n";
replace("$SETUP_DIR/GtkRadiant.ipr", '<<GTKRAD_ISGUID>>', "$MAIN_GUID");
replace("$SETUP_DIR/String Tables/0009-English/value.shl", '<<GTKRAD_ISGUID>>', "$MAIN_GUID");
}
# configure a tree:
# - what is included in the media (core, game packs)
# - full/nightly
# TODO: this could be cleaner
# the variable names could be generated from DO_CORE DO_GAME_Q3 DO_GAME_WOLF
sub configure_tree
{
my $DIR = $SETUP_DIR;
print " Configuring $DIR/...\n";
# get the major and minor
my $RADIANT_MAJOR=`cat ../../include/RADIANT_MAJOR`;
chomp($RADIANT_MAJOR);
chomp($RADIANT_MAJOR);
my $RADIANT_MINOR=`cat ../../include/RADIANT_MINOR`;
chomp($RADIANT_MINOR);
chomp($RADIANT_MINOR);
print " version 1.$RADIANT_MAJOR.$RADIANT_MINOR\n";
replace("$DIR/Script Files/Setup.rul", '<<RADIANT_MAJOR>>', "$RADIANT_MAJOR");
replace("$DIR/Script Files/Setup.rul", '<<RADIANT_MINOR>>', "$RADIANT_MINOR");
if ($DO_CORE == 1)
{
replace("$DIR/Script Files/Setup.rul", '<<DO_CORE_BOOL>>', '1');
replace("$DIR/Component Definitions/Default.cdf", '<<DO_CORE_BOOL_YESNO>>', 'Yes');
if ($DO_NIGHTLY == 1)
{
replace("$DIR/Component Definitions/Default.cdf", '<<DO_CORE_BOOL_FULL_YESNO>>', 'No');
replace("$DIR/Script Files/Setup.rul", '<<DO_NIGHTLY_BOOL>>', '1');
}
else
{
replace("$DIR/Component Definitions/Default.cdf", '<<DO_CORE_BOOL_FULL_YESNO>>', 'Yes');
replace("$DIR/Script Files/Setup.rul", '<<DO_NIGHTLY_BOOL>>', '0');
}
}
else
{
replace("$DIR/Script Files/Setup.rul", '<<DO_CORE_BOOL>>', '0');
replace("$DIR/Component Definitions/Default.cdf", '<<DO_CORE_BOOL_YESNO>>', 'No');
replace("$DIR/Component Definitions/Default.cdf", '<<DO_CORE_BOOL_FULL_YESNO>>', 'No');
}
if ($DO_GAME_Q3 == 1)
{
replace("$DIR/Script Files/Setup.rul", '<<DO_GAME_Q3_BOOL>>', '1');
replace("$DIR/Component Definitions/Default.cdf", '<<DO_GAME_Q3_BOOL_YESNO>>', 'Yes');
if ($DO_NIGHTLY == 1)
{
replace("$DIR/Component Definitions/Default.cdf", '<<DO_GAME_Q3_BOOL_FULL_YESNO>>', 'No');
}
else
{
replace("$DIR/Component Definitions/Default.cdf", '<<DO_GAME_Q3_BOOL_FULL_YESNO>>', 'Yes');
}
}
else
{
replace("$DIR/Script Files/Setup.rul", '<<DO_GAME_Q3_BOOL>>', '0');
replace("$DIR/Component Definitions/Default.cdf", '<<DO_GAME_Q3_BOOL_YESNO>>', 'No');
replace("$DIR/Component Definitions/Default.cdf", '<<DO_GAME_Q3_BOOL_FULL_YESNO>>', 'No');
}
if ($DO_GAME_WOLF == 1)
{
replace("$DIR/Script Files/Setup.rul", '<<DO_GAME_WOLF_BOOL>>', '1');
replace("$DIR/Component Definitions/Default.cdf", '<<DO_GAME_WOLF_BOOL_YESNO>>', 'Yes');
if ($DO_NIGHTLY == 1)
{
replace("$DIR/Component Definitions/Default.cdf", '<<DO_GAME_WOLF_BOOL_FULL_YESNO>>', 'No');
}
else
{
replace("$DIR/Component Definitions/Default.cdf", '<<DO_GAME_WOLF_BOOL_FULL_YESNO>>', 'Yes');
}
}
else
{
replace("$DIR/Script Files/Setup.rul", '<<DO_GAME_WOLF_BOOL>>', '0');
replace("$DIR/Component Definitions/Default.cdf", '<<DO_GAME_WOLF_BOOL_YESNO>>', 'No');
replace("$DIR/Component Definitions/Default.cdf", '<<DO_GAME_WOLF_BOOL_FULL_YESNO>>', 'No');
}
if ($DO_GAME_JKII == 1)
{
replace("$DIR/Script Files/Setup.rul", '<<DO_GAME_JKII_BOOL>>', '1');
replace("$DIR/Component Definitions/Default.cdf", '<<DO_GAME_JKII_BOOL_YESNO>>', 'Yes');
if ($DO_NIGHTLY == 1)
{
replace("$DIR/Component Definitions/Default.cdf", '<<DO_GAME_JKII_BOOL_FULL_YESNO>>', 'No');
}
else
{
replace("$DIR/Component Definitions/Default.cdf", '<<DO_GAME_JKII_BOOL_FULL_YESNO>>', 'Yes');
}
}
else
{
replace("$DIR/Script Files/Setup.rul", '<<DO_GAME_JKII_BOOL>>', '0');
replace("$DIR/Component Definitions/Default.cdf", '<<DO_GAME_JKII_BOOL_YESNO>>', 'No');
replace("$DIR/Component Definitions/Default.cdf", '<<DO_GAME_JKII_BOOL_FULL_YESNO>>', 'No');
}
if ($DO_GAME_STVEF == 1)
{
replace("$DIR/Script Files/Setup.rul", '<<DO_GAME_STVEF_BOOL>>', '1');
replace("$DIR/Component Definitions/Default.cdf", '<<DO_GAME_STVEF_BOOL_YESNO>>', 'Yes');
if ($DO_NIGHTLY == 1)
{
replace("$DIR/Component Definitions/Default.cdf", '<<DO_GAME_STVEF_BOOL_FULL_YESNO>>', 'No');
}
else
{
replace("$DIR/Component Definitions/Default.cdf", '<<DO_GAME_STVEF_BOOL_FULL_YESNO>>', 'Yes');
}
}
else
{
replace("$DIR/Script Files/Setup.rul", '<<DO_GAME_STVEF_BOOL>>', '0');
replace("$DIR/Component Definitions/Default.cdf", '<<DO_GAME_STVEF_BOOL_YESNO>>', 'No');
replace("$DIR/Component Definitions/Default.cdf", '<<DO_GAME_STVEF_BOOL_FULL_YESNO>>', 'No');
}
if ($DO_GAME_HALFLIFE == 1)
{
replace("$DIR/Script Files/Setup.rul", '<<DO_GAME_HALFLIFE_BOOL>>', '1');
replace("$DIR/Component Definitions/Default.cdf", '<<DO_GAME_HALFLIFE_BOOL_YESNO>>', 'Yes');
if ($DO_NIGHTLY == 1)
{
replace("$DIR/Component Definitions/Default.cdf", '<<DO_GAME_HALFLIFE_BOOL_FULL_YESNO>>', 'No');
}
else
{
replace("$DIR/Component Definitions/Default.cdf", '<<DO_GAME_HALFLIFE_BOOL_FULL_YESNO>>', 'Yes');
}
}
else
{
replace("$DIR/Script Files/Setup.rul", '<<DO_GAME_HALFLIFE_BOOL>>', '0');
replace("$DIR/Component Definitions/Default.cdf", '<<DO_GAME_HALFLIFE_BOOL_YESNO>>', 'No');
replace("$DIR/Component Definitions/Default.cdf", '<<DO_GAME_HALFLIFE_BOOL_FULL_YESNO>>', 'No');
}
if ($DO_GAME_SOF2 == 1)
{
replace("$DIR/Script Files/Setup.rul", '<<DO_GAME_SOF2_BOOL>>', '1');
replace("$DIR/Component Definitions/Default.cdf", '<<DO_GAME_SOF2_BOOL_YESNO>>', 'Yes');
if ($DO_NIGHTLY == 1)
{
replace("$DIR/Component Definitions/Default.cdf", '<<DO_GAME_SOF2_BOOL_FULL_YESNO>>', 'No');
}
else
{
replace("$DIR/Component Definitions/Default.cdf", '<<DO_GAME_SOF2_BOOL_FULL_YESNO>>', 'Yes');
}
}
else
{
replace("$DIR/Script Files/Setup.rul", '<<DO_GAME_SOF2_BOOL>>', '0');
replace("$DIR/Component Definitions/Default.cdf", '<<DO_GAME_SOF2_BOOL_YESNO>>', 'No');
replace("$DIR/Component Definitions/Default.cdf", '<<DO_GAME_SOF2_BOOL_FULL_YESNO>>', 'No');
}
if ($DO_GAME_ET == 1)
{
replace("$DIR/Script Files/Setup.rul", '<<DO_GAME_ET_BOOL>>', '1');
replace("$DIR/Component Definitions/Default.cdf", '<<DO_GAME_ET_BOOL_YESNO>>', 'Yes');
if ($DO_NIGHTLY == 1)
{
replace("$DIR/Component Definitions/Default.cdf", '<<DO_GAME_ET_BOOL_FULL_YESNO>>', 'No');
}
else
{
replace("$DIR/Component Definitions/Default.cdf", '<<DO_GAME_ET_BOOL_FULL_YESNO>>', 'Yes');
}
}
else
{
replace("$DIR/Script Files/Setup.rul", '<<DO_GAME_ET_BOOL>>', '0');
replace("$DIR/Component Definitions/Default.cdf", '<<DO_GAME_ET_BOOL_YESNO>>', 'No');
replace("$DIR/Component Definitions/Default.cdf", '<<DO_GAME_ET_BOOL_FULL_YESNO>>', 'No');
}
if ($DO_GAME_Q1 == 1)
{
replace("$DIR/Script Files/Setup.rul", '<<DO_GAME_Q1_BOOL>>', '1');
replace("$DIR/Component Definitions/Default.cdf", '<<DO_GAME_Q1_BOOL_YESNO>>', 'Yes');
if ($DO_NIGHTLY == 1)
{
replace("$DIR/Component Definitions/Default.cdf", '<<DO_GAME_Q1_BOOL_FULL_YESNO>>', 'No');
}
else
{
replace("$DIR/Component Definitions/Default.cdf", '<<DO_GAME_Q1_BOOL_FULL_YESNO>>', 'Yes');
}
}
else
{
replace("$DIR/Script Files/Setup.rul", '<<DO_GAME_Q1_BOOL>>', '0');
replace("$DIR/Component Definitions/Default.cdf", '<<DO_GAME_Q1_BOOL_YESNO>>', 'No');
replace("$DIR/Component Definitions/Default.cdf", '<<DO_GAME_Q1_BOOL_FULL_YESNO>>', 'No');
}
if ($DO_GAME_JA == 1)
{
# prepare the dynamic JA media file group
print " Prepare JA media file group..\n";
# would go faster by copying only the right files in the first place
# rsync might even go faster - if we use it on a toplevel JAPack copy
system( "cp -R ../../../JAPack/base $DIR/JAPack" );
svn_cleanup( "$DIR/JAPack" );
replace( "$DIR/File Groups/JA Media Files.fgl", '<<JA_MEDIA_PATH>>', "$GTKRAD_DIR/GtkRadiant/setup/win32/$DIR/JAPack" );
replace("$DIR/Script Files/Setup.rul", '<<DO_GAME_JA_BOOL>>', '1');
replace("$DIR/Component Definitions/Default.cdf", '<<DO_GAME_JA_BOOL_YESNO>>', 'Yes');
if ($DO_NIGHTLY == 1)
{
replace("$DIR/Component Definitions/Default.cdf", '<<DO_GAME_JA_BOOL_FULL_YESNO>>', 'No');
}
else
{
replace("$DIR/Component Definitions/Default.cdf", '<<DO_GAME_JA_BOOL_FULL_YESNO>>', 'Yes');
}
}
else
{
replace("$DIR/Script Files/Setup.rul", '<<DO_GAME_JA_BOOL>>', '0');
replace("$DIR/Component Definitions/Default.cdf", '<<DO_GAME_JA_BOOL_YESNO>>', 'No');
replace("$DIR/Component Definitions/Default.cdf", '<<DO_GAME_JA_BOOL_FULL_YESNO>>', 'No');
}
if ($DO_GAME_Q2 == 1)
{
replace("$DIR/Script Files/Setup.rul", '<<DO_GAME_Q2_BOOL>>', '1');
replace("$DIR/Component Definitions/Default.cdf", '<<DO_GAME_Q2_BOOL_YESNO>>', 'Yes');
if ($DO_NIGHTLY == 1)
{
replace("$DIR/Component Definitions/Default.cdf", '<<DO_GAME_Q2_BOOL_FULL_YESNO>>', 'No');
}
else
{
replace("$DIR/Component Definitions/Default.cdf", '<<DO_GAME_Q2_BOOL_FULL_YESNO>>', 'Yes');
}
}
else
{
replace("$DIR/Script Files/Setup.rul", '<<DO_GAME_Q2_BOOL>>', '0');
replace("$DIR/Component Definitions/Default.cdf", '<<DO_GAME_Q2_BOOL_YESNO>>', 'No');
replace("$DIR/Component Definitions/Default.cdf", '<<DO_GAME_Q2_BOOL_FULL_YESNO>>', 'No');
}
if ($DO_GAME_HER2 == 1)
{
replace("$DIR/Script Files/Setup.rul", '<<DO_GAME_HER2_BOOL>>', '1');
replace("$DIR/Component Definitions/Default.cdf", '<<DO_GAME_HER2_BOOL_YESNO>>', 'Yes');
if ($DO_NIGHTLY == 1)
{
replace("$DIR/Component Definitions/Default.cdf", '<<DO_GAME_HER2_BOOL_FULL_YESNO>>', 'No');
}
else
{
replace("$DIR/Component Definitions/Default.cdf", '<<DO_GAME_HER2_BOOL_FULL_YESNO>>', 'Yes');
}
}
else
{
replace("$DIR/Script Files/Setup.rul", '<<DO_GAME_HER2_BOOL>>', '0');
replace("$DIR/Component Definitions/Default.cdf", '<<DO_GAME_HER2_BOOL_YESNO>>', 'No');
replace("$DIR/Component Definitions/Default.cdf", '<<DO_GAME_HER2_BOOL_FULL_YESNO>>', 'No');
}
# and now the nightly only stuff (i.e. media upgrade)
if ($DO_NIGHTLY == 1)
{
replace("$DIR/Component Definitions/Default.cdf", '<<DO_NIGHTLY_BOOL_YESNO>>', 'Yes');
}
else
{
replace("$DIR/Component Definitions/Default.cdf", '<<DO_NIGHTLY_BOOL_YESNO>>', 'No');
}
}
# command line options, default to generating the setups
# optional, build a template from a work version
# usage instructions
sub usage {
print <<eof;
Usage:
Builds IS script trees
setup.pl <gtkrad_dir> <config_file>
ex: setup.pl 'C:\\\\home\\\\Id' q3.cf
where q3.cf holds Q3 only game pack config
or
Takes a work tree and turns it back into a template tree
setup.pl <gtkrad_dir> -template <template_dir>
ex: setup.pl 'C:\\\\home\\\\Id' -template template-gen
eof
};
# main
# configure some shit
$UUIDGEN=`which uuidgen.exe 2>/dev/null`;
chop($UUIDGEN);
if (!-e $UUIDGEN)
{
print "uuidgen not found\n";
exit;
}
if (scalar(@ARGV)<2)
{
usage();
exit;
};
$GTKRAD_DIR=$ARGV[0];
print "Configured for base GtkRadiant directory: '$GTKRAD_DIR'\n";
if (@ARGV>2 && $ARGV[1] eq '-template')
{
# building a template from a work dir
$TEMPLATE_GEN_DIR=$ARGV[2];
print "Building a template version of $WORK_DIR/ into $TEMPLATE_GEN_DIR/\n";
print "Copy files...\n";
system("rm -rf $TEMPLATE_GEN_DIR");
system("cp -R $WORK_DIR $TEMPLATE_GEN_DIR\n");
# replace UUID
print "Templating UUID...\n";
system("cat $TEMPLATE_GEN_DIR/GtkRadiant.ipr | sed -e 's/InstallationGUID.*/InstallationGUID=<<GTKRAD_ISGUID>>/' > $TEMPLATE_GEN_DIR/GtkRadiant.ipr.tmp");
system("cp $TEMPLATE_GEN_DIR/GtkRadiant.ipr.tmp $TEMPLATE_GEN_DIR/GtkRadiant.ipr; rm $TEMPLATE_GEN_DIR/GtkRadiant.ipr.tmp");
# base dir
print "Processing '$GTKRAD_DIR' into '<<GTKRAD_DIR>>'\n";
open($findscan, "find $TEMPLATE_GEN_DIR -name '*.fgl' | ");
my $line = <$findscan>;
do
{
chop($line);
replace($line, $GTKRAD_DIR, '<<GTKRAD_DIR>>');
} until (!($line = <$findscan>));
close($findscan);
exit;
}
# set default config
$SETUP_DIR = 'SetupOutput';
$DO_CORE = 1;
$DO_GAME_Q3 = 0;
$DO_GAME_WOLF = 0;
$DO_GAME_JKII = 0;
$DO_GAME_STVEF = 0;
$DO_GAME_HALFLIFE = 0;
$DO_GAME_SOF2 = 0;
$DO_GAME_ET = 0;
$DO_GAME_Q1 = 0;
$DO_GAME_JA = 0;
$DO_GAME_Q2 = 0;
$DO_GAME_HER2 = 0;
$DO_NIGHTLY = 0;
# load config
my $config_file = $ARGV[1];
print "Reading config from $config_file\n";
eval "require \"$config_file\"";
if ($SETUP_DIR eq $WORK_DIR)
{
die "Error: $WORK_DIR is reserved\n";
}
print "Config:\n";
print " Output directory : $SETUP_DIR\n";
print " DO_CORE : $DO_CORE\n";
print " DO_GAME_Q3 : $DO_GAME_Q3\n";
print " DO_GAME_WOLF : $DO_GAME_WOLF\n";
print " DO_GAME_JKII : $DO_GAME_JKII\n";
print " DO_GAME_STVEF : $DO_GAME_STVEF\n";
print " DO_GAME_HALFLIFE : $DO_GAME_HALFLIFE\n";
print " DO_GAME_SOF2 : $DO_GAME_SOF2\n";
print " DO_GAME_ET : $DO_GAME_ET\n";
print " DO_GAME_Q1 : $DO_GAME_Q1\n";
print " DO_GAME_JA : $DO_GAME_JA\n";
print " DO_GAME_Q2 : $DO_GAME_Q2\n";
print " DO_GAME_HER2 : $DO_GAME_HER2\n";
if ($DO_NIGHTLY == 1)
{
print " Configured for nightly setup\n";
}
else
{
print " Configured for full setup\n";
}
build_work_tree();
print "Preparing $SETUP_DIR/...\n";
system("rm -rf $SETUP_DIR");
system("cp -R $WORK_DIR $SETUP_DIR");
finalize_tree("$SETUP_DIR");
configure_tree();