2 # see ./setup.pl for usage info
5 $TEMPLATE_DIR='template';
6 # the 'meta' directory (no longer a template, not a final setup dir yet)
9 # Source common perl functions
11 push @INC, "../common";
14 $common = new setup();
18 # only wrap setup::replace() for now
24 # take out .svn/ directories
25 print "SVN file cleanup in $CLEAN...\n";
27 open($findscan, "find $CLEAN -name .svn | ");
28 my $line = <$findscan>;
32 system("rm -rf '$line'");
33 } until (!($line = <$findscan>));
37 # make a work version from the template
38 # for IS developer use, and for custom setups generation
41 print "Building a work tree in $WORK_DIR/ from $TEMPLATE_DIR/\n";
44 print "File copy...\n";
45 system("rm -rf $WORK_DIR");
46 system("cp -R $TEMPLATE_DIR $WORK_DIR");
48 svn_cleanup( "$WORK_DIR" );
50 my $ESCAPED_GTKRAD_DIR = $GTKRAD_DIR;
51 $ESCAPED_GTKRAD_DIR =~ s/\\/\\\\/g;
53 # proceed to replace <<GTKRAD_DIR>> in .fgl files
54 print "search/replace for base dir...\n";
55 open($findscan, "find $WORK_DIR -name '*.fgl' | ");
56 my $line = <$findscan>;
60 replace($line, '<<GTKRAD_DIR>>', $ESCAPED_GTKRAD_DIR);
61 } until (!($line = <$findscan>));
65 # finalize from a work tree version
66 # this sets some common settings, but doesn't set customizable stuff (like game packs selection)
67 # as we customize more things, this should shrink
71 # what is the version?
72 # NOTE: I've had countless shit getting this extracted correctly
73 my $GTKRAD_VERSION=`cat ../../include/version.default | tr -d \\\\n\\\\r\\\\f`;
75 # what is the name of the binary?
76 my $GTKRAD_BIN="GtkRadiant-$GTKRAD_VERSION.exe";
78 print " Finalizing $DIR/...\n";
80 # copy the Radiant binary to a generated file with the right name
81 #print "the thing: cp ../../radiant/Release/GtkRadiant.exe ./bin/$GTKRAD_BIN\n";
82 system("cp ../../radiant/Release/GtkRadiant.exe ./bin/$GTKRAD_BIN");
84 # copy the splash screen - ET version
85 system("cp ../setup.bmp '$DIR/Setup Files/Uncompressed Files/Language Independent/OS Independent'");
88 print " Product version $GTKRAD_VERSION...\n";
89 replace("$DIR/String Tables/0009-English/value.shl", '<<GTKRAD_VERSION>>', "$GTKRAD_VERSION ");
92 print " Binary name $GTKRAD_BIN...\n";
93 replace("$DIR/File Groups/Program Executable Files.fgl", '<<GTKRAD_BIN>>', "$GTKRAD_BIN");
94 replace("$DIR/String Tables/0009-English/value.shl", '<<GTKRAD_BIN>>', "$GTKRAD_BIN");
95 replace("$DIR/Shell Objects/Default.shl", '<<GTKRAD_BIN>>', "$GTKRAD_BIN");
98 replace("$SETUP_DIR/String Tables/0009-English/value.shl", '<<GTKRAD_FOLDER>>', "GtkRadiant $GTKRAD_VERSION");
101 my $MAIN_GUID=`uuidgen`;
104 print " $SETUP_DIR/ has uuid: $MAIN_GUID...\n";
105 replace("$SETUP_DIR/GtkRadiant.ipr", '<<GTKRAD_ISGUID>>', "$MAIN_GUID");
106 replace("$SETUP_DIR/String Tables/0009-English/value.shl", '<<GTKRAD_ISGUID>>', "$MAIN_GUID");
111 # - what is included in the media (core, game packs)
113 # TODO: this could be cleaner
114 # the variable names could be generated from DO_CORE DO_GAME_Q3 DO_GAME_WOLF
117 my $DIR = $SETUP_DIR;
118 print " Configuring $DIR/...\n";
119 # get the major and minor
120 my $RADIANT_MAJOR=`cat ../../include/RADIANT_MAJOR`;
121 chomp($RADIANT_MAJOR);
122 chomp($RADIANT_MAJOR);
123 my $RADIANT_MINOR=`cat ../../include/RADIANT_MINOR`;
124 chomp($RADIANT_MINOR);
125 chomp($RADIANT_MINOR);
126 print " version 1.$RADIANT_MAJOR.$RADIANT_MINOR\n";
127 replace("$DIR/Script Files/Setup.rul", '<<RADIANT_MAJOR>>', "$RADIANT_MAJOR");
128 replace("$DIR/Script Files/Setup.rul", '<<RADIANT_MINOR>>', "$RADIANT_MINOR");
131 replace("$DIR/Script Files/Setup.rul", '<<DO_CORE_BOOL>>', '1');
132 replace("$DIR/Component Definitions/Default.cdf", '<<DO_CORE_BOOL_YESNO>>', 'Yes');
133 if ($DO_NIGHTLY == 1)
135 replace("$DIR/Component Definitions/Default.cdf", '<<DO_CORE_BOOL_FULL_YESNO>>', 'No');
136 replace("$DIR/Script Files/Setup.rul", '<<DO_NIGHTLY_BOOL>>', '1');
140 replace("$DIR/Component Definitions/Default.cdf", '<<DO_CORE_BOOL_FULL_YESNO>>', 'Yes');
141 replace("$DIR/Script Files/Setup.rul", '<<DO_NIGHTLY_BOOL>>', '0');
146 replace("$DIR/Script Files/Setup.rul", '<<DO_CORE_BOOL>>', '0');
147 replace("$DIR/Component Definitions/Default.cdf", '<<DO_CORE_BOOL_YESNO>>', 'No');
148 replace("$DIR/Component Definitions/Default.cdf", '<<DO_CORE_BOOL_FULL_YESNO>>', 'No');
150 if ($DO_GAME_Q3 == 1)
152 replace("$DIR/Script Files/Setup.rul", '<<DO_GAME_Q3_BOOL>>', '1');
153 replace("$DIR/Component Definitions/Default.cdf", '<<DO_GAME_Q3_BOOL_YESNO>>', 'Yes');
154 if ($DO_NIGHTLY == 1)
156 replace("$DIR/Component Definitions/Default.cdf", '<<DO_GAME_Q3_BOOL_FULL_YESNO>>', 'No');
160 replace("$DIR/Component Definitions/Default.cdf", '<<DO_GAME_Q3_BOOL_FULL_YESNO>>', 'Yes');
165 replace("$DIR/Script Files/Setup.rul", '<<DO_GAME_Q3_BOOL>>', '0');
166 replace("$DIR/Component Definitions/Default.cdf", '<<DO_GAME_Q3_BOOL_YESNO>>', 'No');
167 replace("$DIR/Component Definitions/Default.cdf", '<<DO_GAME_Q3_BOOL_FULL_YESNO>>', 'No');
169 if ($DO_GAME_WOLF == 1)
171 replace("$DIR/Script Files/Setup.rul", '<<DO_GAME_WOLF_BOOL>>', '1');
172 replace("$DIR/Component Definitions/Default.cdf", '<<DO_GAME_WOLF_BOOL_YESNO>>', 'Yes');
173 if ($DO_NIGHTLY == 1)
175 replace("$DIR/Component Definitions/Default.cdf", '<<DO_GAME_WOLF_BOOL_FULL_YESNO>>', 'No');
179 replace("$DIR/Component Definitions/Default.cdf", '<<DO_GAME_WOLF_BOOL_FULL_YESNO>>', 'Yes');
184 replace("$DIR/Script Files/Setup.rul", '<<DO_GAME_WOLF_BOOL>>', '0');
185 replace("$DIR/Component Definitions/Default.cdf", '<<DO_GAME_WOLF_BOOL_YESNO>>', 'No');
186 replace("$DIR/Component Definitions/Default.cdf", '<<DO_GAME_WOLF_BOOL_FULL_YESNO>>', 'No');
188 if ($DO_GAME_JKII == 1)
190 replace("$DIR/Script Files/Setup.rul", '<<DO_GAME_JKII_BOOL>>', '1');
191 replace("$DIR/Component Definitions/Default.cdf", '<<DO_GAME_JKII_BOOL_YESNO>>', 'Yes');
192 if ($DO_NIGHTLY == 1)
194 replace("$DIR/Component Definitions/Default.cdf", '<<DO_GAME_JKII_BOOL_FULL_YESNO>>', 'No');
198 replace("$DIR/Component Definitions/Default.cdf", '<<DO_GAME_JKII_BOOL_FULL_YESNO>>', 'Yes');
203 replace("$DIR/Script Files/Setup.rul", '<<DO_GAME_JKII_BOOL>>', '0');
204 replace("$DIR/Component Definitions/Default.cdf", '<<DO_GAME_JKII_BOOL_YESNO>>', 'No');
205 replace("$DIR/Component Definitions/Default.cdf", '<<DO_GAME_JKII_BOOL_FULL_YESNO>>', 'No');
207 if ($DO_GAME_STVEF == 1)
209 replace("$DIR/Script Files/Setup.rul", '<<DO_GAME_STVEF_BOOL>>', '1');
210 replace("$DIR/Component Definitions/Default.cdf", '<<DO_GAME_STVEF_BOOL_YESNO>>', 'Yes');
211 if ($DO_NIGHTLY == 1)
213 replace("$DIR/Component Definitions/Default.cdf", '<<DO_GAME_STVEF_BOOL_FULL_YESNO>>', 'No');
217 replace("$DIR/Component Definitions/Default.cdf", '<<DO_GAME_STVEF_BOOL_FULL_YESNO>>', 'Yes');
222 replace("$DIR/Script Files/Setup.rul", '<<DO_GAME_STVEF_BOOL>>', '0');
223 replace("$DIR/Component Definitions/Default.cdf", '<<DO_GAME_STVEF_BOOL_YESNO>>', 'No');
224 replace("$DIR/Component Definitions/Default.cdf", '<<DO_GAME_STVEF_BOOL_FULL_YESNO>>', 'No');
226 if ($DO_GAME_HALFLIFE == 1)
228 replace("$DIR/Script Files/Setup.rul", '<<DO_GAME_HALFLIFE_BOOL>>', '1');
229 replace("$DIR/Component Definitions/Default.cdf", '<<DO_GAME_HALFLIFE_BOOL_YESNO>>', 'Yes');
230 if ($DO_NIGHTLY == 1)
232 replace("$DIR/Component Definitions/Default.cdf", '<<DO_GAME_HALFLIFE_BOOL_FULL_YESNO>>', 'No');
236 replace("$DIR/Component Definitions/Default.cdf", '<<DO_GAME_HALFLIFE_BOOL_FULL_YESNO>>', 'Yes');
241 replace("$DIR/Script Files/Setup.rul", '<<DO_GAME_HALFLIFE_BOOL>>', '0');
242 replace("$DIR/Component Definitions/Default.cdf", '<<DO_GAME_HALFLIFE_BOOL_YESNO>>', 'No');
243 replace("$DIR/Component Definitions/Default.cdf", '<<DO_GAME_HALFLIFE_BOOL_FULL_YESNO>>', 'No');
245 if ($DO_GAME_SOF2 == 1)
247 replace("$DIR/Script Files/Setup.rul", '<<DO_GAME_SOF2_BOOL>>', '1');
248 replace("$DIR/Component Definitions/Default.cdf", '<<DO_GAME_SOF2_BOOL_YESNO>>', 'Yes');
249 if ($DO_NIGHTLY == 1)
251 replace("$DIR/Component Definitions/Default.cdf", '<<DO_GAME_SOF2_BOOL_FULL_YESNO>>', 'No');
255 replace("$DIR/Component Definitions/Default.cdf", '<<DO_GAME_SOF2_BOOL_FULL_YESNO>>', 'Yes');
260 replace("$DIR/Script Files/Setup.rul", '<<DO_GAME_SOF2_BOOL>>', '0');
261 replace("$DIR/Component Definitions/Default.cdf", '<<DO_GAME_SOF2_BOOL_YESNO>>', 'No');
262 replace("$DIR/Component Definitions/Default.cdf", '<<DO_GAME_SOF2_BOOL_FULL_YESNO>>', 'No');
264 if ($DO_GAME_ET == 1)
266 replace("$DIR/Script Files/Setup.rul", '<<DO_GAME_ET_BOOL>>', '1');
267 replace("$DIR/Component Definitions/Default.cdf", '<<DO_GAME_ET_BOOL_YESNO>>', 'Yes');
268 if ($DO_NIGHTLY == 1)
270 replace("$DIR/Component Definitions/Default.cdf", '<<DO_GAME_ET_BOOL_FULL_YESNO>>', 'No');
274 replace("$DIR/Component Definitions/Default.cdf", '<<DO_GAME_ET_BOOL_FULL_YESNO>>', 'Yes');
279 replace("$DIR/Script Files/Setup.rul", '<<DO_GAME_ET_BOOL>>', '0');
280 replace("$DIR/Component Definitions/Default.cdf", '<<DO_GAME_ET_BOOL_YESNO>>', 'No');
281 replace("$DIR/Component Definitions/Default.cdf", '<<DO_GAME_ET_BOOL_FULL_YESNO>>', 'No');
283 if ($DO_GAME_Q1 == 1)
285 replace("$DIR/Script Files/Setup.rul", '<<DO_GAME_Q1_BOOL>>', '1');
286 replace("$DIR/Component Definitions/Default.cdf", '<<DO_GAME_Q1_BOOL_YESNO>>', 'Yes');
287 if ($DO_NIGHTLY == 1)
289 replace("$DIR/Component Definitions/Default.cdf", '<<DO_GAME_Q1_BOOL_FULL_YESNO>>', 'No');
293 replace("$DIR/Component Definitions/Default.cdf", '<<DO_GAME_Q1_BOOL_FULL_YESNO>>', 'Yes');
298 replace("$DIR/Script Files/Setup.rul", '<<DO_GAME_Q1_BOOL>>', '0');
299 replace("$DIR/Component Definitions/Default.cdf", '<<DO_GAME_Q1_BOOL_YESNO>>', 'No');
300 replace("$DIR/Component Definitions/Default.cdf", '<<DO_GAME_Q1_BOOL_FULL_YESNO>>', 'No');
302 if ($DO_GAME_JA == 1)
304 # prepare the dynamic JA media file group
305 print " Prepare JA media file group..\n";
306 # would go faster by copying only the right files in the first place
307 # rsync might even go faster - if we use it on a toplevel JAPack copy
308 system( "cp -R ../../../JAPack/base $DIR/JAPack" );
309 svn_cleanup( "$DIR/JAPack" );
310 replace( "$DIR/File Groups/JA Media Files.fgl", '<<JA_MEDIA_PATH>>', "$GTKRAD_DIR/GtkRadiant/setup/win32/$DIR/JAPack" );
312 replace("$DIR/Script Files/Setup.rul", '<<DO_GAME_JA_BOOL>>', '1');
313 replace("$DIR/Component Definitions/Default.cdf", '<<DO_GAME_JA_BOOL_YESNO>>', 'Yes');
314 if ($DO_NIGHTLY == 1)
316 replace("$DIR/Component Definitions/Default.cdf", '<<DO_GAME_JA_BOOL_FULL_YESNO>>', 'No');
320 replace("$DIR/Component Definitions/Default.cdf", '<<DO_GAME_JA_BOOL_FULL_YESNO>>', 'Yes');
325 replace("$DIR/Script Files/Setup.rul", '<<DO_GAME_JA_BOOL>>', '0');
326 replace("$DIR/Component Definitions/Default.cdf", '<<DO_GAME_JA_BOOL_YESNO>>', 'No');
327 replace("$DIR/Component Definitions/Default.cdf", '<<DO_GAME_JA_BOOL_FULL_YESNO>>', 'No');
329 if ($DO_GAME_Q2 == 1)
331 replace("$DIR/Script Files/Setup.rul", '<<DO_GAME_Q2_BOOL>>', '1');
332 replace("$DIR/Component Definitions/Default.cdf", '<<DO_GAME_Q2_BOOL_YESNO>>', 'Yes');
333 if ($DO_NIGHTLY == 1)
335 replace("$DIR/Component Definitions/Default.cdf", '<<DO_GAME_Q2_BOOL_FULL_YESNO>>', 'No');
339 replace("$DIR/Component Definitions/Default.cdf", '<<DO_GAME_Q2_BOOL_FULL_YESNO>>', 'Yes');
344 replace("$DIR/Script Files/Setup.rul", '<<DO_GAME_Q2_BOOL>>', '0');
345 replace("$DIR/Component Definitions/Default.cdf", '<<DO_GAME_Q2_BOOL_YESNO>>', 'No');
346 replace("$DIR/Component Definitions/Default.cdf", '<<DO_GAME_Q2_BOOL_FULL_YESNO>>', 'No');
348 if ($DO_GAME_HER2 == 1)
350 replace("$DIR/Script Files/Setup.rul", '<<DO_GAME_HER2_BOOL>>', '1');
351 replace("$DIR/Component Definitions/Default.cdf", '<<DO_GAME_HER2_BOOL_YESNO>>', 'Yes');
352 if ($DO_NIGHTLY == 1)
354 replace("$DIR/Component Definitions/Default.cdf", '<<DO_GAME_HER2_BOOL_FULL_YESNO>>', 'No');
358 replace("$DIR/Component Definitions/Default.cdf", '<<DO_GAME_HER2_BOOL_FULL_YESNO>>', 'Yes');
363 replace("$DIR/Script Files/Setup.rul", '<<DO_GAME_HER2_BOOL>>', '0');
364 replace("$DIR/Component Definitions/Default.cdf", '<<DO_GAME_HER2_BOOL_YESNO>>', 'No');
365 replace("$DIR/Component Definitions/Default.cdf", '<<DO_GAME_HER2_BOOL_FULL_YESNO>>', 'No');
367 # and now the nightly only stuff (i.e. media upgrade)
368 if ($DO_NIGHTLY == 1)
370 replace("$DIR/Component Definitions/Default.cdf", '<<DO_NIGHTLY_BOOL_YESNO>>', 'Yes');
374 replace("$DIR/Component Definitions/Default.cdf", '<<DO_NIGHTLY_BOOL_YESNO>>', 'No');
378 # command line options, default to generating the setups
379 # optional, build a template from a work version
385 Builds IS script trees
386 setup.pl <gtkrad_dir> <config_file>
387 ex: setup.pl 'C:\\\\home\\\\Id' q3.cf
388 where q3.cf holds Q3 only game pack config
390 Takes a work tree and turns it back into a template tree
391 setup.pl <gtkrad_dir> -template <template_dir>
392 ex: setup.pl 'C:\\\\home\\\\Id' -template template-gen
398 # configure some shit
399 $UUIDGEN=`which uuidgen.exe 2>/dev/null`;
403 print "uuidgen not found\n";
413 $GTKRAD_DIR=$ARGV[0];
414 print "Configured for base GtkRadiant directory: '$GTKRAD_DIR'\n";
416 if (@ARGV>2 && $ARGV[1] eq '-template')
418 # building a template from a work dir
419 $TEMPLATE_GEN_DIR=$ARGV[2];
420 print "Building a template version of $WORK_DIR/ into $TEMPLATE_GEN_DIR/\n";
421 print "Copy files...\n";
422 system("rm -rf $TEMPLATE_GEN_DIR");
423 system("cp -R $WORK_DIR $TEMPLATE_GEN_DIR\n");
425 print "Templating UUID...\n";
426 system("cat $TEMPLATE_GEN_DIR/GtkRadiant.ipr | sed -e 's/InstallationGUID.*/InstallationGUID=<<GTKRAD_ISGUID>>/' > $TEMPLATE_GEN_DIR/GtkRadiant.ipr.tmp");
427 system("cp $TEMPLATE_GEN_DIR/GtkRadiant.ipr.tmp $TEMPLATE_GEN_DIR/GtkRadiant.ipr; rm $TEMPLATE_GEN_DIR/GtkRadiant.ipr.tmp");
429 print "Processing '$GTKRAD_DIR' into '<<GTKRAD_DIR>>'\n";
430 open($findscan, "find $TEMPLATE_GEN_DIR -name '*.fgl' | ");
431 my $line = <$findscan>;
435 replace($line, $GTKRAD_DIR, '<<GTKRAD_DIR>>');
436 } until (!($line = <$findscan>));
442 $SETUP_DIR = 'SetupOutput';
448 $DO_GAME_HALFLIFE = 0;
459 my $config_file = $ARGV[1];
461 print "Reading config from $config_file\n";
462 eval "require \"$config_file\"";
463 if ($SETUP_DIR eq $WORK_DIR)
465 die "Error: $WORK_DIR is reserved\n";
469 print " Output directory : $SETUP_DIR\n";
470 print " DO_CORE : $DO_CORE\n";
471 print " DO_GAME_Q3 : $DO_GAME_Q3\n";
472 print " DO_GAME_WOLF : $DO_GAME_WOLF\n";
473 print " DO_GAME_JKII : $DO_GAME_JKII\n";
474 print " DO_GAME_STVEF : $DO_GAME_STVEF\n";
475 print " DO_GAME_HALFLIFE : $DO_GAME_HALFLIFE\n";
476 print " DO_GAME_SOF2 : $DO_GAME_SOF2\n";
477 print " DO_GAME_ET : $DO_GAME_ET\n";
478 print " DO_GAME_Q1 : $DO_GAME_Q1\n";
479 print " DO_GAME_JA : $DO_GAME_JA\n";
480 print " DO_GAME_Q2 : $DO_GAME_Q2\n";
481 print " DO_GAME_HER2 : $DO_GAME_HER2\n";
482 if ($DO_NIGHTLY == 1)
484 print " Configured for nightly setup\n";
488 print " Configured for full setup\n";
493 print "Preparing $SETUP_DIR/...\n";
494 system("rm -rf $SETUP_DIR");
495 system("cp -R $WORK_DIR $SETUP_DIR");
496 finalize_tree("$SETUP_DIR");