# cgame building # builds the cgame for vanilla Q3 and TA # there are slight differences between Q3 and TA build: # -DMISSIONPACK # TA has cg_newdraw.c and ../ui/ui_shared.c # the config is passed in the imported variable TARGET_DIR # qvm building against native: # only native has cg_syscalls.c # only qvm has ../game/bg_lib.c # qvm uses a custom cg_syscalls.asm with equ stubs Import qw( BASE_CFLAGS TARGET_DIR INSTALL_DIR NO_VM NO_SO CC CXX LINK ); $env = new cons( # the code has the very bad habit of doing things like #include "../ui/ui_shared.h" # this seems to confuse the dependency analysis, explicit toplevel includes seem to fix CPPPATH => '#cgame:#game:#q3_ui', CC => $CC, CXX => $CXX, LINK => $LINK, ENV => { PATH => $ENV{PATH}, HOME => $ENV{HOME} }, CFLAGS => $BASE_CFLAGS . '-fPIC', LDFLAGS => '-shared -ldl -lm' ); # for TA, use -DMISSIONPACK %ta_env_hash = $env->copy( CPPPATH => '#cgame:#game:#ui' ); $ta_env_hash{CFLAGS} = '-DMISSIONPACK ' . $ta_env_hash{CFLAGS}; $ta_env = new cons(%ta_env_hash); # qvm building # we heavily customize the cons environment $vm_env = new cons( # the code has the very bad habit of doing things like #include "../ui/ui_shared.h" # this seems to confuse the dependency analysis, explicit toplevel includes seem to fix CPPPATH => '#cgame:#game:#q3_ui', CC => 'q3lcc', CCCOM => '%CC %CFLAGS %_IFLAGS -c %< -o %>', SUFOBJ => '.asm', LINK => 'q3asm', CFLAGS => '-DQ3_VM -DCGAME -S -Wf-target=bytecode -Wf-g', # need to know where to find the compiler tools ENV => { PATH => $ENV{PATH} . ":./qvmtools", }, ); # TA qvm building %vm_ta_env_hash = $vm_env->copy( CPPPATH => '#cgame:#game:#ui' ); $vm_ta_env_hash{CFLAGS} = '-DMISSIONPACK ' . $vm_ta_env_hash{CFLAGS}; $vm_ta_env = new cons(%vm_ta_env_hash); # the file with vmMain function MUST be the first one of the list @FILES = qw( cg_main.c ../game/bg_misc.c ../game/bg_pmove.c ../game/bg_slidemove.c ../game/q_math.c ../game/q_shared.c cg_consolecmds.c cg_draw.c cg_drawtools.c cg_effects.c cg_ents.c cg_event.c cg_info.c cg_localents.c cg_marks.c cg_players.c cg_playerstate.c cg_predict.c cg_scoreboard.c cg_servercmds.c cg_snapshot.c cg_view.c cg_weapons.c ); $FILESREF = \@FILES; # only in .so # (VM uses a custom .asm with equ stubs) @SO_FILES = qw( cg_syscalls.c ); $SO_FILESREF = \@SO_FILES; # only for VM @VM_FILES = qw( ../game/bg_lib.c cg_syscalls.asm ); $VM_FILESREF = \@VM_FILES; # common additionals for TA @TA_FILES = qw( cg_newdraw.c ../ui/ui_shared.c ); $TA_FILESREF = \@TA_FILES; # FIXME CPU string if ($TARGET_DIR eq 'Q3') { if ($NO_SO eq 0) { Program $env 'cgamei386.so', @$FILESREF, @$SO_FILESREF; Install $env $INSTALL_DIR, 'cgamei386.so'; } if ($NO_VM eq 0) { Depends $vm_env 'cgame.qvm', '#qvmtools/q3lcc'; Depends $vm_env 'cgame.qvm', '#qvmtools/q3asm'; Program $vm_env 'cgame.qvm', @$FILESREF, @$VM_FILESREF; Install $vm_env $INSTALL_DIR . '/vm', 'cgame.qvm'; } } else { if ($NO_SO eq 0) { Program $ta_env 'cgamei386.so', @$FILESREF, @$SO_FILESREF, @$TA_FILESREF; Install $ta_env $INSTALL_DIR, 'cgamei386.so'; } if ($NO_VM eq 0) { Depends $vm_env 'cgame.qvm', '#qvmtools/q3lcc'; Depends $vm_env 'cgame.qvm', '#qvmtools/q3asm'; Program $vm_ta_env 'cgame.qvm', @$FILESREF, @$VM_FILESREF, @$TA_FILESREF; Install $vm_ta_env $INSTALL_DIR . '/vm', 'cgame.qvm'; } }