builder.pl 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760
  1. #!perl
  2. #NOTE: this script assumes you are running the Cygwin perl, which uses the
  3. # Cygwin file paths (i.e. '/' corresponds to 'C:\cygwin')
  4. my $WIN_INSTALLDIR="\\\\dimbo\\panda\\win";
  5. # $ENV{'USE_COMPILER'} = "INTEL"; # experiment
  6. # my $WIN_INSTALLDIR="\\\\cxgeorge-d01\\c\\win";
  7. ### DEBUG SETTINGS
  8. # my $DEBUG_TREECOPY = 1;
  9. # my $DEBUG_GENERATE_PYTHON_CODE_ONLY = 1;
  10. # my $DEBUG_MAKEBSC_ONLY=1;
  11. if ($ENV{'DEBUG_GENERATE_PYTHON_CODE_ONLY'} ne '') {
  12. $DEBUG_GENERATE_PYTHON_CODE_ONLY = 1;
  13. }
  14. # my $DO_ARCHIVE_AND_COPY_ONLY = 1;
  15. my $DONT_ARCHIVE_OLD_BUILDS = 0;
  16. my $BLD_DTOOL_ONLY=0;
  17. my $DIRPATH_SEPARATOR=':'; # set to ';' for non-cygwin NT perl
  18. my @inst_dirnames=("archive","debug","install","release","publish");
  19. my $ARCHIVENUM=0;
  20. my $DEBUGNUM=1;
  21. my $INSTALLNUM=2;
  22. my $RELEASENUM=3;
  23. my $PUBLISHNUM=4;
  24. my @inst_dirs;
  25. for(my $i=0;$i<=$#inst_dirnames;$i++) {
  26. $inst_dirs[$i]=$WIN_INSTALLDIR."\\".$inst_dirnames[$i];
  27. }
  28. my $VC7_BINDIRS="/msvc7/Vc7/bin".$DIRPATH_SEPARATOR."/msvc7/Common7/Tools/Bin".$DIRPATH_SEPARATOR."/msvc7/Common7/Tools".$DIRPATH_SEPARATOR."/msvc7/Common7/IDE";
  29. #if(! $DEBUG_GENERATE_PYTHON_CODE_ONLY) {
  30. # $ENV{'PANDA_OPTIMIZE'}='4'; # var has meaning to my special Config.pp
  31. #}
  32. $ENV{'WINTOOLS'} = '/home/builder/player/wintools';
  33. #$ENV{'PPREMAKE_CONFIG'} = '/usr/local/etc/Config.pp'; old location
  34. $ENV{'PPREMAKE_CONFIG'} = $ENV{'WINTOOLS'}.'/panda/etc/Config.pp';
  35. $ENV{'PPREMAKE_PLATFORM'} = 'Win32'; # generate OptX-Win32 dirs instead of OptX-Cygwin
  36. $ENV{'TCSH_NO_CSHRC_CHDIR'}='1';
  37. $ENV{'ENABLE_PROFILING'}='1'; # generate .map files
  38. # needed to add this to fix version.rc path in ppremake?
  39. $ENV{'DTOOL'} = '/home/builder/player/dtool';
  40. $ENV{'HOME'}="/home/builder";
  41. $ENV{'USER'}="builder";
  42. $ENV{'USERNAME'}=$ENV{'USER'};
  43. my $DONT_ARCHIVE_OLD_BUILDS = (($ENV{'DONT_ARCHIVE_OLD_BUILDS'} ne "") || $DONT_ARCHIVE_OLD_BUILDS);
  44. sub logmsg() {
  45. my $msg = shift;
  46. print $msg."\n";
  47. open(LOGFILE,">>".$fulllogfilename) || die "can't open log file '$fulllogfilename'\n";
  48. print LOGFILE $msg."\n";
  49. close(LOGFILE);
  50. }
  51. #could change this to use eval, but it would require doubling the '\''s again in filename
  52. sub mychdir() {
  53. my $newdir = shift;
  54. my $retval = chdir($newdir);
  55. &logmsg("chdir(".$newdir.")");
  56. if(! $retval) {
  57. &logmsg("chdir(".$newdir.") failed!!");
  58. exit(1);
  59. }
  60. }
  61. sub mymkdir() {
  62. my $newdir=shift;
  63. if(!(-e $newdir)) {
  64. if(!mkdir($newdir,0xfff)) {
  65. &logmsg("cant create new dir '".$newdir."' !!");
  66. exit(1);
  67. }
  68. }
  69. }
  70. sub myrename() {
  71. my $n1 = shift;
  72. my $n2 = shift;
  73. my $retval;
  74. &logmsg("rename(".$n1.",".$n2.")");
  75. if(-e $n2) {
  76. # find name we can move old target to
  77. my $newnum=1;
  78. while(-e $n2.".old.".$newnum) {
  79. $newnum++;
  80. }
  81. $newconflicttargetname=$n2.".old.".$newnum;
  82. &logmsg("avoiding rename conflict, renaming old ".$n2." to ".$newconflicttargetname);
  83. $retval = rename($n2,$newconflicttargetname);
  84. if(! $retval) {
  85. &logmsg("rename failing, giving up (check if files or dirs are open in other apps)");
  86. exit(1);
  87. }
  88. }
  89. $retval = rename($n1,$n2);
  90. if(! $retval) {
  91. &logmsg("rename(".$n1.",".$n2.") failed!!! (check if files or dirs are open in other apps)");
  92. exit(1);
  93. }
  94. }
  95. sub myexecstr() {
  96. my $cmdstr = shift;
  97. my $errstr = shift;
  98. my $dologstr = shift;
  99. my $exec_cshrc_type = shift;
  100. if($dologstr eq "DO_LOG") {
  101. if($exec_cshrc_type eq "NT cmd") {
  102. $cmdstr.=" >> ".$fulllogfilename_win." 2>&1"; # 2>&1 tells nt cmd.exe to redirect stderr to stdout
  103. } else {
  104. $cmdstr.=" >>& ".$fulllogfilename; # for tcsh
  105. }
  106. &logmsg($cmdstr);
  107. }
  108. my $savedhome = $ENV{'HOME'};
  109. if( $exec_cshrc_type eq "NO_CSHRC") {
  110. # change $HOME so .cshrc doesn't get sources by tcsh
  111. $ENV{'HOME'}="/";
  112. } elsif( $exec_cshrc_type eq "NO_PANDA_ATTACH") {
  113. $ENV{'TCSH_NO_PANDA_ATTACH'}="1";
  114. }
  115. if($exec_cshrc_type eq "NT cmd") {
  116. my @args = ("cmd.exe", "/c", "$cmdstr");
  117. $retval = system(@args);
  118. } else {
  119. my @args = ("tcsh.exe", "-c", "$cmdstr");
  120. $retval = system(@args);
  121. }
  122. if($retval!=0) {
  123. if(($retval>=256) || ($retval<=-256)) {
  124. $retval= $retval/256; # actual retval
  125. }
  126. if($errstr eq "") {
  127. &logmsg($cmdstr." failed!!!!! continuing anyway...\nError return value=".$retval);
  128. } elsif($errstr ne "nomsg") {
  129. &logmsg($errstr."\nError return value=".$retval);
  130. exit($retval);
  131. }
  132. }
  133. if($exec_cshrc_type eq "NO_CSHRC") {
  134. $ENV{'HOME'}=$savedhome;
  135. } elsif( $exec_cshrc_type eq "NO_PANDA_ATTACH") {
  136. delete $ENV{'TCSH_NO_PANDA_ATTACH'};
  137. }
  138. }
  139. sub gettimestr() {
  140. my ($sec,$min,$hour,$mday,$mon,$year,$wday) = localtime(time);
  141. $mon++;
  142. return $mon."/".$mday." ".$hour.":".($min<10 ? "0":"").$min;
  143. }
  144. sub appendpath() {
  145. # note cygwin perl.exe requires ':' instead of ';' as path dir separator
  146. foreach $dir1 (@_) {
  147. $ENV{'PATH'}.=$DIRPATH_SEPARATOR.$CYGBLDROOT.$dir1;
  148. }
  149. }
  150. sub make_bsc_file() {
  151. &logmsg("*** Generating panda.bsc at ".&gettimestr()." ***");
  152. # &mychdir($CYGBLDROOT."/debug");
  153. # $outputdir=$WINBLDROOT."\\debug";
  154. &mychdir($CYGBLDROOT);
  155. $outputdir=$WINBLDROOT;
  156. $outputname="panda.bsc";
  157. $outputfilepath=$outputdir."\\".$outputname;
  158. $cmdfilepath=$outputdir."\\makebsc.txt";
  159. #open(FILES, "where -r . *.sbr |") || die "Couldn't run 'where'!\n";
  160. #requires unix/cygwin style find.exe
  161. open(FILES, "find ".$dirstodostr." -name \"*.sbr\" -print |") || die "Couldn't run 'find'!\n";
  162. open(OUTFILE, ">".$cmdfilepath) || die "Couldn't open ".$cmdfilepath."!\n";
  163. $filename = <FILES>; #skip initial line
  164. $filestr="";
  165. $duline = <FILES>;
  166. chop $duline;
  167. $filestr=$duline;
  168. while ($duline = <FILES>)
  169. {
  170. chop $duline; # Remove the newline from the end of the filename
  171. $filestr=$filestr."\n".$duline;
  172. }
  173. print OUTFILE "/n /o ".$outputfilepath." \n";
  174. print OUTFILE "$filestr","\n";
  175. close(OUTFILE);
  176. close(FILES);
  177. # vc7 dirs are not in path env-var by default
  178. $ENV{'PATH'}=$VC7_BINDIRS.$DIRPATH_SEPARATOR.$ENV{'PATH'};
  179. print $ENV{'PATH'}, "\n";
  180. $bscmake_str="bscmake /o ".$outputfilepath." @".$cmdfilepath."\n";
  181. &myexecstr($bscmake_str,"bscmake failed!!!","DO_LOG","NT cmd");
  182. # edit binary so it looks for src on mountable Z drive, so src browsing
  183. # works with Z:\ pointed to \\dragon
  184. $binreplace_str="perl binreplace.pl -i C:\\cygwin Z:\\cygwin ".$outputfilepath."\n";
  185. &myexecstr($binreplace_str,"binreplace failed!!!","DO_LOG","NT cmd");
  186. &myexecstr("copy ".$outputfilepath." ".$inst_dirs[$DEBUGNUM], "copy of ".$outputfilepath." failed!!", "DO_LOG","NT cmd");
  187. unlink($cmdfilepath);
  188. &mychdir($CYGBLDROOT);
  189. &logmsg("*** Finished generating panda.bsc at ".&gettimestr()." ***");
  190. }
  191. sub addpathsfromfile() {
  192. my $dirname = shift;
  193. my $envvarname = shift;
  194. my $pathfile=$WINBLDROOT."\\".$dirname."\\src\\configfiles\\".$dirname.".pth";
  195. if(!open(PTHFILE, $pathfile)) {
  196. &logmsg("Couldn't open ".$pathfile."!");
  197. exit(1);
  198. }
  199. my @filestrs=<PTHFILE>;
  200. close(PTHFILE);
  201. foreach my $i (@filestrs) {
  202. chop($i);
  203. $i =~ s/\//\\/g; # switch fwdslash to backslsh
  204. # print $i,"\n";
  205. $ENV{$envvarname}.=";".$WINBLDROOT."\\".$dirname."\\".$i;
  206. }
  207. }
  208. sub AddPckgPath() {
  209. my $pckg = shift;
  210. $ENV{'PATH'}.=":".$ENV{$pckg}."/bin:".$ENV{$pckg}."/lib";
  211. }
  212. sub gen_python_code() {
  213. &logmsg("*** GenPythonCode Start for ".$inst_dirnames[$treenum]." at ".&gettimestr()." ***");
  214. &mychdir($CYGBLDROOT."/direct/bin");
  215. # ETC_PATH required by generatePythonCode?
  216. $ENV{'ETC_PATH'}='/home/builder/player/panda/etc /home/builder/player/direct/etc /home/builder/player/dtool/etc /home/builder/player/toontown/etc /home/builder/player/pandatool/etc';
  217. my $origpath=$ENV{'PATH'}; # save now, restore path after done
  218. # start new path just for this fn
  219. $ENV{'PATH'}="/bin";
  220. &AddPckgPath('WINTOOLS');
  221. &AddPckgPath('DTOOL');
  222. &AddPckgPath('PANDATOOL');
  223. &AddPckgPath('PANDA');
  224. &AddPckgPath('DIRECT');
  225. &AddPckgPath('TOONTOWN');
  226. # $ENV{'PATH'}=$ENV{'WINTOOLS'}."/bin:".$ENV{'WINTOOLS'}."/lib:/bin:/contrib/bin:/mscommon/Tools/WinNT:/mscommon/MSDev98/Bin:/mscommon/Tools:/msvc98/bin:/home/builder/player/dtool/bin:/home/builder/player/dtool/lib:/home/builder/player/direct/bin:/home/builder/player/direct/lib::/home/builder/player/toontown/bin:/home/builder/player/toontown/lib:/home/builder/player/panda/lib:/home/builder/player/panda/bin:/usr/local/bin:.:/c/WINNT/system32:/c/WINNT:/c/WINNT/System32/Wbem:/c/bin:/mspsdk/Bin/:/mspsdk/Bin/WinNT:/mscommon/Tools/WinNT:/mscommon/MSDev98/Bin:/mscommon/Tools:/msvc98/bin:/home/builder/scripts:/home/builder/player/pandatool/bin:/home/builder/player/pandatool/lib";
  227. $ENV{'PATH'}.=":/mscommon/Tools/WinNT:/mscommon/MSDev98/Bin:/mscommon/Tools:/msvc98/bin:/usr/local/bin:.:/c/WINNT/system32:/c/WINNT:/c/bin:/mspsdk/Bin/:/mspsdk/Bin/WinNT:/mscommon/Tools/WinNT:/mscommon/Tools:/home/builder/scripts:";
  228. $ENV{'PATH'}.=$ENV{'WINTOOLS'}."/sdk/python/Tcl/bin:".$ENV{'WINTOOLS'}."/sdk/python/Tcl/lib";
  229. $ENV{'PYTHONPATH'}= $WINBLDROOT."\\direct\\src\\showbase;".$WINBLDROOT."\\panda\\lib;".$WINBLDROOT."\\dtool\\lib;".$WINBLDROOT."\\wintools\\bin;".$WINBLDROOT."\\wintools\\lib;";
  230. $ENV{'PYTHONPATH'}.= $WINBLDROOT."\\wintools\\sdk\\python\\Python-2.2\\Lib;".$WINBLDROOT."\\wintools\\sdk\\python\\Python-2.2\\DLLs;";
  231. # direct/src/showbase/sitecustomize.py will add paths based on CTPROJS
  232. $ENV{'CTPROJS'}="TOONTOWN:personal DIRECT:personal PANDA:personal WINTOOLS:personal DTOOL:personal";
  233. # my $directsrcroot=$WINBLDROOT."\\direct\\src";
  234. # this should be unnecessary if sitecustomize.py sees CTPROJS
  235. # # add stuff from etc/[dir].pth
  236. # &addpathsfromfile("direct","PYTHONPATH");
  237. # &addpathsfromfile("toontown","PYTHONPATH");
  238. $ENV{'TCSH_NO_CHANGEPATH'}='1';
  239. # old way that tried to do genPyCode directly
  240. # $outputdir = $WINBLDROOT."\\direct\\lib\\py";
  241. # &mymkdir($outputdir);
  242. # $outputdir.= "\\Opt".$ENV{'PANDA_OPTIMIZE'}."-Win32";
  243. # &mymkdir($outputdir);
  244. # now back to 1 build-type per tree
  245. #
  246. # my $genpyth_str;
  247. # my $genargstr="-v -d";
  248. #
  249. # if(($ENV{'PANDA_OPTIMIZE'} eq '1') || ($ENV{'PANDA_OPTIMIZE'} eq '2')) {
  250. # $genpyth_str="python_d -v -OO ";
  251. # $genargstr="-O ".$genargstr;
  252. # } else {
  253. # $genpyth_str="python -v -O ";
  254. # $genargstr="-O ".$genargstr;
  255. # }
  256. # $genpyth_str.="generatePythonCode ".$genargstr." '".$outputdir."' -e '".$WINBLDROOT."\\direct\\src\\extensions' -i libdtoolconfig libpandaexpress libpanda libpandaphysics libdirect libtoontown";
  257. # &myexecstr($genpyth_str,"generate python code failed!!!","DO_LOG","NO_PANDA_ATTACH");
  258. $genpy_args{'1'} = 'win-debug';
  259. $genpy_args{'2'} = 'win-debug';
  260. $genpy_args{'3'} = 'win-release';
  261. $genpy_args{'4'} = 'win-publish';
  262. $genpy_arg1 = "-t ".$genpy_args{$ENV{'PANDA_OPTIMIZE'}};
  263. &myexecstr("genPyCode ".$genpy_arg1,"genPyCode failed","DO_LOG","NO_PANDA_ATTACH");
  264. $ENV{'PATH'}=$origpath;
  265. delete $ENV{'TCSH_NO_CHANGEPATH'};
  266. &mychdir($CYGBLDROOT);
  267. &logmsg("*** GenPythonCode Finished for ".$inst_dirnames[$treenum]." at ".&gettimestr()." ***");
  268. }
  269. my $newdayarchivedirname;
  270. sub archivetree() {
  271. $treenum=shift;
  272. if(!(-e $inst_dirs[$treenum])) {
  273. return;
  274. }
  275. if($newdayarchivename eq "") {
  276. ($devicenum,$inodenum,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime,$blksize,$blocks)
  277. = stat($inst_dirs[$treenum]."\\dtool\\Sources.pp");
  278. ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)
  279. = localtime($mtime);
  280. $mon++;
  281. $newdayarchivedirname=$inst_dirs[$ARCHIVENUM]."\\".($mon<10 ? "0":"").$mon."-".($mday<10 ? "0":"").$mday;
  282. &mymkdir($newdayarchivedirname);
  283. }
  284. &logmsg("*** Archiving ".$inst_dirnames[$treenum]." build on install server at ".&gettimestr()." ***");
  285. my $archdirname=$newdayarchivedirname."\\".$inst_dirnames[$treenum];
  286. &myrename($inst_dirs[$treenum],$archdirname);
  287. foreach my $dir1 (@dirstodolist) {
  288. # copy DLL .pdb/.map up to lib dir so we can blow away metalibs subdir
  289. # could do this is the makefiles instead
  290. &myexecstr("( for /R ".$archdirname."\\".$dir1."\\metalibs %i in (lib*.pdb lib*.map) do copy %i ".$archdirname."\\".$dir1."\\lib )","nomsg","DO_LOG","NT cmd");
  291. if($dir1 eq "panda") {
  292. # dll/exe not under metalibs
  293. &myexecstr("( for /R ".$archdirname."\\".$dir1."\\src\\audiotraits %i in (lib*.pdb lib*.map) do copy %i ".$archdirname."\\".$dir1."\\lib )","nomsg","DO_LOG","NT cmd");
  294. &myexecstr("( for /R ".$archdirname."\\".$dir1."\\src\\shader %i in (lib*.pdb lib*.map) do copy %i ".$archdirname."\\".$dir1."\\lib )","nomsg","DO_LOG","NT cmd");
  295. &myexecstr("( for /R ".$archdirname."\\".$dir1."\\src\\testbed %i in (*.pdb *.map) do copy %i ".$archdirname."\\".$dir1."\\bin )","nomsg","DO_LOG","NT cmd");
  296. }
  297. # NT cmd 'for' always returns 144 for some reason, impossible to detect error cond, so just dont check retval
  298. # delete old objs/pdbs/etc out of archived trees (just blow away the Opt[Win32] dir)
  299. # &myexecstr("( for /D /R ".$archdirname."\\".$dir1."\\src %i in (Opt*Win32) do rd /s /q %i )","nomsg","DO_LOG","NT cmd");
  300. # instead blow away src,CVS,include,metalibs dirs completely
  301. # doing every rd twice since windows-samba-RAID link seems to screw up and cause some files to not be deleted the 1st time
  302. &myexecstr("rd /s /q ".$archdirname."\\".$dir1."\\src","nomsg","DO_LOG","NT cmd");
  303. &myexecstr("rd /s /q ".$archdirname."\\".$dir1."\\CVS","nomsg","DO_LOG","NT cmd");
  304. &myexecstr("rd /s /q ".$archdirname."\\".$dir1."\\include","nomsg","DO_LOG","NT cmd");
  305. &myexecstr("rd /s /q ".$archdirname."\\".$dir1."\\metalibs","nomsg","DO_LOG","NT cmd");
  306. &myexecstr("rd /s /q ".$archdirname."\\".$dir1."\\src","nomsg","DO_LOG","NT cmd");
  307. &myexecstr("rd /s /q ".$archdirname."\\".$dir1."\\CVS","nomsg","DO_LOG","NT cmd");
  308. &myexecstr("rd /s /q ".$archdirname."\\".$dir1."\\include","nomsg","DO_LOG","NT cmd");
  309. &myexecstr("rd /s /q ".$archdirname."\\".$dir1."\\metalibs","nomsg","DO_LOG","NT cmd");
  310. # del xtra files at root of subdirs
  311. &myexecstr("del /Q /F ".$archdirname."\\".$dir1."\\*","nomsg","DO_LOG","NT cmd");
  312. }
  313. # delete old browse files
  314. &myexecstr("del /q ".$archdirname."\\*.bsc","nomsg","DO_LOG","NT cmd");
  315. # delete wintools, right now its too big to archive
  316. &myexecstr("rd /s /q ".$archdirname."\\wintools","nomsg","DO_LOG","NT cmd");
  317. &myexecstr("rd /s /q ".$archdirname."\\wintools","nomsg","DO_LOG","NT cmd");
  318. # could also move .pdb from metalibs to lib, then del metalibs, include, src dirs
  319. }
  320. sub checkoutfiles {
  321. my $existing_module_str="";
  322. my $nonexisting_module_str="";
  323. &mychdir($CYGBLDROOT);
  324. foreach my $dir1 (@dirstodolist) {
  325. if(-e $dir1) {
  326. $existing_module_str.=$dir1." ";
  327. } else {
  328. $nonexisting_module_str.=$dir1." ";
  329. }
  330. }
  331. if($existing_module_str ne "") {
  332. # flaw: will bomb if any CVS subdirs are missing
  333. &myexecstr("( for /D /R . %i in (Opt*Win32) do rd /s /q %i )","nomsg","DO_LOG","NT cmd");
  334. &logmsg("*** REMOVING ALL FILES IN OLD SRC TREES ***");
  335. # use cvs update to grab new copy
  336. # note: instead of blowing these away, may want to rename and save them
  337. # also, I could just blow everything away and check out again
  338. # cant blow away if people are sitting in those dirs, so we do this instead
  339. $rmcmd="find ".$existing_module_str." -path '*CVS*' -prune -or -not -name 'bldlog*' -and -not -type d -print | xargs --no-run-if-empty -n 40 rm";
  340. #&myexecstr($rmcmd,"Removal of old files failed!","DO_LOG","NO_CSHRC");
  341. &myexecstr($rmcmd,"Removal of old files failed!","DO_LOG","NO_PANDA_ATTACH");
  342. &myexecstr("cvs update -d -R ".$existing_module_str." |& egrep -v 'Updating|^\\?'",
  343. "cvs update failed!","DO_LOG","NO_PANDA_ATTACH");
  344. }
  345. if($nonexisting_module_str ne "") {
  346. &myexecstr("cvs checkout -R ".$nonexisting_module_str." |& egrep -v 'Updating|^\\?'",
  347. "cvs checkout failed!","DO_LOG","NO_PANDA_ATTACH");
  348. }
  349. }
  350. sub buildall() {
  351. $treenum=shift;
  352. # DTOOL ppremake may have already run by DTOOL 'initialize make'
  353. if($DO_ARCHIVE_AND_COPY_ONLY) {
  354. goto 'ARCHIVE_AND_COPY';
  355. }
  356. &logmsg("*** Starting ".uc($inst_dirnames[$treenum])." Build (Opt=".$ENV{'PANDA_OPTIMIZE'}.") at ".&gettimestr()." ***");
  357. &checkoutfiles();
  358. # cant do attachment, since that often hangs on NT
  359. # must use non-attachment build system (BUILD_TYPE 'gmsvc', not 'stopgap', in $PPREMAKE_CONFIG)
  360. # hacks to fix multiproc build issue (cp file to dir occurs before dir creation, need to adjust makefiles to fix this)
  361. foreach my $dir1 (@dirstodolist) {
  362. &mymkdir($CYGBLDROOT."/".$dir1."/etc");
  363. &mymkdir($CYGBLDROOT."/".$dir1."/bin");
  364. &mymkdir($CYGBLDROOT."/".$dir1."/lib");
  365. &mymkdir($CYGBLDROOT."/".$dir1."/include");
  366. }
  367. &mymkdir($CYGBLDROOT."/dtool/include/parser-inc"); # hack to fix makefile multiproc issue
  368. &mymkdir($CYGBLDROOT."/pandatool/shared"); # hack to fix makefile multiproc issue
  369. foreach my $dir1 (@dirstodolist) {
  370. my $dir1_upcase = uc($dir1);
  371. &logmsg("*** PPREMAKE ".$dir1_upcase." (BUILDTYPE=".$ENV{'PANDA_BUILD_TYPE'}.") ***");
  372. &mychdir($CYGBLDROOT."/".$dir1);
  373. &myexecstr("ppremake",$dir1_upcase." ppremake failed!","DO_LOG","NO_PANDA_ATTACH");
  374. }
  375. # debug stuff
  376. # &mychdir($CYGBLDROOT);
  377. # &myexecstr("dir dtool","dir failed","DO_LOG","NT cmd");
  378. $makecmd="make";
  379. $shellarg="NO_PANDA_ATTACH";
  380. if($ENV{'PANDA_BUILD_TYPE'} eq 'msvc') {
  381. $makecmd="nmake";
  382. $shellarg="NT cmd";
  383. }
  384. foreach my $dir1 (@dirstodolist) {
  385. my $dir1_upcase = uc($dir1);
  386. &logmsg("*** BUILDING ".$dir1_upcase." at ".&gettimestr()." ***");
  387. &mychdir($CYGBLDROOT."/".$dir1);
  388. &myexecstr($makecmd." install",$dir1_upcase." ".$makecmd." install failed!","DO_LOG",$shellarg);
  389. }
  390. &mychdir($CYGBLDROOT); # get out of src dirs to allow them to be moved/renamed
  391. unlink($CYGBLDROOT."/dtool/dtool_config.h"); # fix freakish NTFS bug, this file is regenerated by ppremake anyway
  392. if($#dirstodolist>1) {
  393. &gen_python_code(); # must run AFTER toontown bld
  394. }
  395. ARCHIVE_AND_COPY:
  396. &mychdir($CYGBLDROOT); # get out of src dirs to allow them to be moved/renamed
  397. # archive old current srvr build & copy build to server, if its accessible
  398. if(!(-e $WIN_INSTALLDIR)) {
  399. &logmsg("ERROR: Cant access install directory!! (Is Server down??) ".$WIN_INSTALLDIR);
  400. &logmsg("Skipping archive and copy-build-to-server steps for ".$inst_dirnames[$treenum]." build");
  401. return;
  402. }
  403. if($DONT_ARCHIVE_OLD_BUILDS) {
  404. &myexecstr("rd /s /q ".$inst_dirs[$treenum],"DO_LOG","NT cmd"); # dont bother checking errors here, probably just some shell has the dir cd'd to
  405. } else {
  406. &archivetree($treenum);
  407. }
  408. &logmsg("*** Copying ".$inst_dirnames[$treenum]." build to install server at ".&gettimestr()." ***");
  409. &mymkdir($inst_dirs[$treenum]);
  410. my $xcopy_opt_str="/E /K /C /R /Y /H /I ";
  411. if($DEBUG_TREECOPY) {
  412. $xcopy_opt_str.="/T "; #debug only
  413. }
  414. if($treenum == $DEBUGNUM) {
  415. # get rid of .sbr files before copying
  416. &myexecstr("echo .sbr > C:\\junk","echo .sbr failed!!", "DO_LOG","NT cmd");
  417. $xcopy_opt_str.=" /EXCLUDE:C:\\junk";
  418. }
  419. # hopefully there are no extra dirs underneath
  420. # add wintools to dir copy list
  421. # dont want to add wintools to global dirstodo, treat it separately
  422. unshift(dirstodolist,"wintools");
  423. foreach my $dir1 (@dirstodolist) {
  424. &mymkdir($inst_dirs[$treenum]."\\".$dir1);
  425. &myexecstr("\\WINNT\\system32\\xcopy ".$xcopy_opt_str." ".$WINBLDROOT."\\".$dir1."\\* ".$inst_dirs[$treenum]."\\".$dir1,
  426. "xcopy of ".$inst_dirnames[$treenum]." tree failed!!", "DO_LOG","NT cmd");
  427. }
  428. shift(dirstodolist);
  429. }
  430. # assumes environment already attached to TOOL/PANDA/DIRECT/TOONTOWN
  431. # assumes cygwin env, BLDROOT must use fwd slashes
  432. if($ENV{'BLDROOT'} eq "") {
  433. $ENV{'BLDROOT'} = "/home/builder/player";
  434. }
  435. if($ENV{'CYGWIN_ROOT'} eq "") {
  436. $ENV{'CYGWIN_ROOT'} = "C:\\Cygwin";
  437. }
  438. $CYGROOT= $ENV{'CYGWIN_ROOT'};
  439. $CYGROOT =~ s/(.*)\\$/$1/; # get rid of trailing '\'
  440. #$CYGROOT =~ s/\\/\//g; # switch backslash to fwdslash (setting up for cygwin)
  441. $CYGBLDROOT = $ENV{'BLDROOT'};
  442. print "\$CYGBLDROOT='",$CYGBLDROOT,"'\n";
  443. if(($CYGBLDROOT eq "")||(!(-e $CYGBLDROOT))) {
  444. die "Bad \$CYGBLDROOT !!\n";
  445. }
  446. $WINBLDROOT=$CYGROOT.$CYGBLDROOT;
  447. $WINBLDROOT =~ s/\//\\/g; # switch fwdslash to backslash
  448. print "\$WINBLDROOT='",$WINBLDROOT,"'\n";
  449. my ($sec,$min,$hour,$mday,$mon,$year,$wday) = localtime(time);
  450. $mon++;
  451. $logfilenamebase="bldlog-".($mon<10 ? "0":"").$mon."-".($mday<10 ? "0":"").$mday.".txt";
  452. $fulllogfilename = $CYGBLDROOT."/".$logfilenamebase;
  453. $fulllogfilename_win = $WINBLDROOT."\\".$logfilenamebase;
  454. # recreate the log to blow away any old one
  455. open(LOGFILE,">".$fulllogfilename) || die "can't open log file '$fulllogfilename'\n";
  456. close(LOGFILE);
  457. &logmsg("*** Panda Build Log Started at ".&gettimestr()." ***");
  458. my @do_install_dir;
  459. my @dir_build_type;
  460. for($ii=0;$ii<=$#PUBLISHNUM;$ii++) {
  461. if($#ARGV<0) {
  462. $do_install_dir=1;
  463. } else {
  464. $do_install_dir=0;
  465. }
  466. $dir_build_type=0;
  467. }
  468. my $g_last_dirnum=0;
  469. for($ii=0;$ii<=$#ARGV;$ii++) {
  470. if(uc($ARGV[$ii]) eq uc($inst_dirnames[$INSTALLNUM])) {
  471. $g_last_dirnum=$INSTALLNUM;
  472. } elsif(uc($ARGV[$ii]) eq uc($inst_dirnames[$DEBUGNUM])) {
  473. $g_last_dirnum=$DEBUGNUM;
  474. } elsif(uc($ARGV[$ii]) eq uc($inst_dirnames[$RELEASENUM])) {
  475. $g_last_dirnum=$RELEASENUM;
  476. } elsif(uc($ARGV[$ii]) eq uc($inst_dirnames[$PUBLISHNUM])) {
  477. $g_last_dirnum=$PUBLISHNUM;
  478. } elsif(uc($ARGV[$ii]) eq "NMAKE") {
  479. $dir_build_type[$g_last_dirnum]=1;
  480. next;
  481. } else {
  482. &logmsg("invalid argument '".$ARGV[0]."' to builder.pl. arg must be 'install','debug', or 'release', or 'publish'\n");
  483. exit(1);
  484. }
  485. $do_install_dir[$g_last_dirnum]=1;
  486. }
  487. if(!(-e $WIN_INSTALLDIR)) {
  488. &logmsg("ERROR: Cant access install directory!! ".$WIN_INSTALLDIR);
  489. exit(1);
  490. }
  491. &mychdir($CYGBLDROOT);
  492. if($BLD_DTOOL_ONLY) {
  493. @dirstodolist=("dtool");
  494. } else {
  495. @dirstodolist=("dtool","panda","pandatool","direct","toontown");
  496. }
  497. $dirstodostr="";
  498. foreach my $dir1 (@dirstodolist) {
  499. $dirstodostr.=$dir1." ";
  500. }
  501. # makes ppremake build headers, libs in module dirs (panda/lib,dtool/bin,etc), not /usr/local/panda/inc...
  502. foreach my $dir1 (@dirstodolist) {
  503. my $dir1_upcase = uc($dir1);
  504. $ENV{$dir1_upcase}=$CYGBLDROOT."/".$dir1;
  505. # need this since we are building in src dirs, not install dir
  506. # so 'interrogate' needs to find its dlls when building panda, etc
  507. &appendpath("/".$dir1."/bin","/".$dir1."/lib");
  508. }
  509. # pick up cygwin utils
  510. $ENV{'PATH'}=$ENV{'WINTOOLS'}."/bin".$DIRPATH_SEPARATOR.$ENV{'WINTOOLS'}."/lib".$DIRPATH_SEPARATOR."/bin".$DIRPATH_SEPARATOR.$ENV{'PATH'}."/c/WINNT/system32".$DIRPATH_SEPARATOR."/c/WINNT";
  511. # want build to pick up python dll's from /usr/lib before /c/python16
  512. # $ENV{'PATH'}="/usr/lib".$DIRPATH_SEPARATOR.$ENV{'PATH'}; not needed
  513. if($DEBUG_MAKEBSC_ONLY) {
  514. &make_bsc_file();
  515. exit(0);
  516. }
  517. if(! $DEBUG_GENERATE_PYTHON_CODE_ONLY) {
  518. # update wintools
  519. unlink("wintools\\bin\\dos2unix.exe"); # rm a file so egrep doesnt find 0 non-Updating/?? lines and return failure
  520. &myexecstr("cvs update -d -R wintools |& egrep -v 'Updating|^\\?'", "cvs update failed!","DO_LOG","NO_PANDA_ATTACH");
  521. }
  522. if($DEBUG_TREECOPY) {
  523. goto 'DBGTREECOPY';
  524. }
  525. # goto 'SKIP_REMOVE';
  526. SKIP_REMOVE:
  527. # this doesnt work unless you can completely remove the dirs, since cvs checkout
  528. # bombs if dirs exist but CVS dirs do not.
  529. if($do_install_dir[$INSTALLNUM]) {
  530. if($dir_build_type[$INSTALLNUM]) {
  531. $ENV{'PANDA_BUILD_TYPE'} = 'msvc';
  532. } else {
  533. $ENV{'PANDA_BUILD_TYPE'} = 'gmsvc';
  534. }
  535. $ENV{'PANDA_OPTIMIZE'}='2';
  536. if($DEBUG_GENERATE_PYTHON_CODE_ONLY) {
  537. &gen_python_code();
  538. exit(0);
  539. }
  540. &buildall($INSTALLNUM);
  541. }
  542. if($do_install_dir[$RELEASENUM]) {
  543. if($dir_build_type[$RELEASENUM]) {
  544. $ENV{'PANDA_BUILD_TYPE'} = 'msvc';
  545. } else {
  546. $ENV{'PANDA_BUILD_TYPE'} = 'gmsvc';
  547. }
  548. $ENV{'PANDA_OPTIMIZE'}='3';
  549. if($DEBUG_GENERATE_PYTHON_CODE_ONLY) {
  550. &gen_python_code();
  551. exit(0);
  552. }
  553. &buildall($RELEASENUM);
  554. }
  555. BEFORE_DBGBUILD:
  556. if($do_install_dir[$DEBUGNUM]) {
  557. if($dir_build_type[$DEBUGNUM]) {
  558. $ENV{'PANDA_BUILD_TYPE'} = 'msvc';
  559. } else {
  560. $ENV{'PANDA_BUILD_TYPE'} = 'gmsvc';
  561. }
  562. $ENV{'USE_BROWSEINFO'}='1'; # make .sbr files
  563. if(! $DEBUG_GENERATE_PYTHON_CODE_ONLY) {
  564. $ENV{'PANDA_OPTIMIZE'}='1';
  565. }
  566. if($DEBUG_GENERATE_PYTHON_CODE_ONLY) {
  567. &gen_python_code();
  568. exit(0);
  569. }
  570. &buildall($DEBUGNUM);
  571. &make_bsc_file();
  572. delete $ENV{'USE_BROWSEINFO'};
  573. &myexecstr("del /s *.sbr","nomsg","DO_LOG","NT cmd");
  574. }
  575. AFTER_DBGBUILD:
  576. if($do_install_dir[$PUBLISHNUM]) {
  577. if($dir_build_type[$PUBLISHNUM]) {
  578. $ENV{'PANDA_BUILD_TYPE'} = 'msvc';
  579. } else {
  580. $ENV{'PANDA_BUILD_TYPE'} = 'gmsvc';
  581. }
  582. $ENV{'PANDA_OPTIMIZE'}='4';
  583. &buildall($PUBLISHNUM);
  584. }
  585. &logmsg("*** Panda Build Log Finished at ".&gettimestr()." ***");
  586. # store log in 'debug' dir
  587. &myexecstr("copy ".$fulllogfilename_win." ".$inst_dirs[$g_last_dirnum], "copy of ".$fulllogfilename_win." failed!!", "","NT cmd");
  588. exit(0);
  589. # TODO:
  590. # compress old archived blds?
  591. # build DLLs with version stamp set by this script
  592. # implement build-specific opttype mode