# game building # builds the game for vanilla Q3 and TA # there are slight differences between Q3 and TA build: # -DMISSIONPACK # the config is passed in the imported variable TARGET_DIR # qvm building against native: # only native has g_syscalls.c # only qvm has ../game/bg_lib.c # qvm uses a custom g_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 -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( g_main.c ai_chat.c ai_cmd.c ai_dmnet.c ai_dmq3.c ai_main.c ai_team.c ai_vcmd.c bg_misc.c bg_pmove.c bg_slidemove.c g_active.c g_arenas.c g_bot.c g_client.c g_cmds.c g_combat.c g_items.c g_mem.c g_misc.c g_missile.c g_mover.c g_session.c g_spawn.c g_svcmds.c g_target.c g_team.c g_trigger.c g_utils.c g_weapon.c q_math.c q_shared.c ); $FILESREF = \@FILES; # only in .so # (VM uses a custom .asm with equ stubs) @SO_FILES = qw( g_syscalls.c ); $SO_FILESREF = \@SO_FILES; # only for VM @VM_FILES = qw( bg_lib.c g_syscalls.asm ); $VM_FILESREF = \@VM_FILES; # FIXME CPU string? # NOTE: $env $ta_env and $vm_env $vm_ta_env may not be necessary # we could alter the $env and $ta_env based on $TARGET_DIR # doing it this way to ensure homogeneity with cgame building if ($TARGET_DIR eq 'Q3') { if ($NO_SO eq 0) { Program $env 'qagamei386.so', @$FILESREF, @$SO_FILESREF; Install $env $INSTALL_DIR, 'qagamei386.so'; } if ($NO_VM eq 0) { Depends $vm_env 'qagame.qvm', '#qvmtools/q3lcc'; Depends $vm_env 'qagame.qvm', '#qvmtools/q3asm'; Program $vm_env 'qagame.qvm', @$FILESREF, @$VM_FILESREF; Install $vm_env $INSTALL_DIR . '/vm', 'qagame.qvm'; } } else { if ($NO_SO eq 0) { Program $ta_env 'qagamei386.so', @$FILESREF, @$SO_FILESREF; Install $ta_env $INSTALL_DIR, 'qagamei386.so'; } if ($NO_VM eq 0) { Depends $vm_env 'qagame.qvm', '#qvmtools/q3lcc'; Depends $vm_env 'qagame.qvm', '#qvmtools/q3asm'; Program $vm_ta_env 'qagame.qvm', @$FILESREF, @$VM_FILESREF; Install $vm_ta_env $INSTALL_DIR . '/vm', 'qagame.qvm'; } }