#!/usr/bin/perl #(C)2004 AMX Mod X Development Team # by David "BAILOPAN" Anderson # output will occur in bin.x.proc # where x is debug or opt and proc is ix86 or amd64 # You must use this script from the amxmodx src dir #options = # jit - use the JIT # debug - enable gdb debugging # amd64 - compile for AMD64 (impiles no jit) # proc=ix86 - assumed not amd64 # clean - clean the specifications above # asm - for ASM implementation # !! TODO - add memory mananger support # lineop - for JIT only, uses slow version $PROJECT = "amxmodx_mm"; $sdk = "../hlsdk/SourceCode"; $mm = "../metamod/metamod"; $gccf = "gcc"; $ccf = "cc"; $amd64_lstdc = "-lstdc++"; @CPP_SOURCE_FILES = ("meta_api.cpp", "CFile.cpp", "CVault.cpp", "vault.cpp", "float.cpp", "file.cpp", "modules.cpp", "CMisc.cpp", "CTask.cpp", "string.cpp", "amxmodx.cpp", "CEvent.cpp", "CCmd.cpp", "CLogEvent.cpp", "srvcmd.cpp", "strptime.cpp", "amxcore.cpp", "amxtime.cpp", "power.cpp", "amxxlog.cpp", "fakemeta.cpp", "amxxfile.cpp", "CLang.cpp", "md5.cpp", "emsg.cpp", "CForward.cpp", "CPlugin.cpp", "CModule.cpp", "CMenu.cpp", "util.cpp"); @C_SOURCE_FILES = (); my %OPTIONS, %OPT; $OPT{"debug"} = "-g -ggdb"; $OPT{"opt"} = "-O2 -ffast-math -funroll-loops -fomit-frame-pointer -s -DNDEBUG -Wall -Wno-unknown-pragmas -DOPT_TYPE=\"optimized\" -fno-exceptions -fno-rtti"; $OPTIONS{"include"} = "-I$sdk -I. -I$mm -I$sdk/engine -I$sdk/common -I$sdk/pm_shared -I$sdk/dlls"; while ($cmd = shift) { if ($cmd =~ /asm/) { if ($OPTIONS{"amd64"}) { die "You cannot compile the ASM core with AMD64 yet.\n"; } else { $OPTIONS{"asm"} = 1; } } if ($cmd =~ /jit/) { if ($OPTIONS{"amd64"}) { die "You cannot compile the JIT and AMD64 yet.\n"; } else { $OPTIONS{"jit"} = 1; } } elsif ($cmd =~ /amd64/) { if ($OPTIONS{"jit"} || $OPTIONS{"asm"}) { die "You cannot compile the JIT or ASM and AMD64 yet.\n"; } else { $OPTIONS{"amd64"} = 1; } } elsif ($cmd =~ /debug/) { $OPTIONS{"debug"} = 1; } elsif ($cmd =~ /proc=i(\d)86/) { $proc = $1; if ($OPTIONS{"amd64"}) { die "You cannot compile for i".$proc."86 and AMD64.\n"; } else { $OPTIONS{"proc"} = "i".$proc."86"; } } elsif ($cmd =~ /clean/) { $OPTIONS{"clean"} = 1; } elsif ($cmd =~ /lineop/) { $OPTIONS{"lineop"} = 1; } } $gcc = `$gccf --version`; if ($gcc =~ /2\.9/) { #if ($OPTIONS{"jit"}) #{ # push(@CPP_SOURCE_FILES, "amx.cpp"); # $OPT{"opt"} .= " -malign-loops=2 -malign-jumps=2 -malign-functions=2"; # } else { `ln -s amx.cpp amx.c`; push(@C_SOURCE_FILES, "amx.c"); # } } else { if ($OPTIONS{"amd64"}) { `ln -s amx.cpp amx.c`; push(@C_SOURCE_FILES, "amx.c"); } else { push(@CPP_SOURCE_FILES, "amx.cpp"); } $OPT{"opt"} .= " -falign-loops=2 -falign-jumps=2 -falign-functions=2"; } if ($OPTIONS{"debug"}) { $cflags = $OPT{"debug"}; } else { if (!$OPTIONS{"amd64"}) { $proc = $OPTIONS{"proc"}; if (!$proc) { $proc = 3; } $cflags = "-march=i".$proc."86 ".$OPT{"opt"}; } else { $cflags = $OPT{"opt"}; } } if ($OPTIONS{"amd64"}) { $cflags = " -m64 -DSMALL_CELL_SIZE=64 -DHAVE_I64 $cflags"; } if ($OPTIONS{"jit"}) { $cflags .= " -DJIT"; } if ($OPTIONS{"asm"}) { $cflags .= " -DASM32"; } if ($OPTIONS{"debug"}) { $outdir = "bin.debug"; } else { $outdir = "bin.opt"; } if ($OPTIONS{"amd64"}) { $outdir .= ".amd64"; $bin = $PROJECT."_amd64.so"; } else { $proc = $OPTIONS{"proc"}; if ($proc) { $outdir .= ".i".$proc."86"; $bin = $PROJECT."_i".$proc."86.so"; } else { $outdir .= ".i386"; $bin = $PROJECT."_i386.so"; } } if ($OPTIONS{"clean"}) { `rm $outdir/*.o`; `rm $outdir/$bin`; die("Project cleaned.\n"); } #create the dirs #build link list my @LINK; for ($i=0; $i<=$#CPP_SOURCE_FILES; $i++) { $file = $CPP_SOURCE_FILES[$i]; $file =~ s/\.cpp/\.o/; push(@LINK, $outdir."/".$file); } for ($i=0; $i<=$#C_SOURCE_FILES; $i++) { $file = $C_SOURCE_FILES[$i]; $file =~ s/\.c/\.o/; push(@LINK, $outdir."/".$file); } if ($OPTIONS{"jit"}) { if ($OPTIONS{"lineop"}) { push(@LINK, "JIT/jits-lineop.o"); } else { push(@LINK, "JIT/jits.o"); } } if ($OPTIONS{"amd64"}) { push(@LINK, "zlib/libz64.a"); push(@LINK, $amd64_lstdc); } else { push(@LINK, "zlib/libz.a"); } if ($OPTIONS{"asm"}) { push(@LINK, "amxexecn.o"); } if (!(-d $outdir)) { mkdir($outdir); } if (!(-d "$outdir/JIT")) { mkdir("$outdir/JIT"); } $inc = $OPTIONS{"include"}; for ($i=0; $i<=$#CPP_SOURCE_FILES; $i++) { $file = $CPP_SOURCE_FILES[$i]; $ofile = $file; $ofile =~ s/\.cpp/\.o/; $ofile = "$outdir/$ofile"; $gcc = "$gccf $cflags -Dstrcmpi=strcasecmp -fPIC $inc -c $file -o $ofile"; if (-e $ofile) { $file_time = (stat($file))[9]; $ofile_time = (stat($ofile))[9]; if ($file_time > $ofile_time) { `rm $ofile`; print "$gcc\n"; `$gcc`; } } else { print "$gcc\n"; `$gcc`; } } for ($i=0; $i<=$#CPP_SOURCE_FILES; $i++) { $file = $C_SOURCE_FILES[$i]; $ofile = $file; $ofile =~ s/\.c/\.o/; $ofile = "$outdir/$ofile"; $gcc = "$ccf $cflags -Dstrcmpi=strcasecmp -fPIC $inc -c $file -o $ofile"; if (-e $ofile) { $file_time = (stat($file))[9]; $ofile_time = (stat($ofile))[9]; if ($file_time > $ofile_time) { print "$gcc\n"; `$gcc`; } } else { print "$gcc\n"; `$gcc`; } } $gcc = "$gccf $cflags -shared -ldl -lm @LINK -o $outdir/$bin"; print "$gcc\n"; `$gcc`;