diff options
Diffstat (limited to 'code/game/Conscript')
-rwxr-xr-x | code/game/Conscript | 140 |
1 files changed, 140 insertions, 0 deletions
diff --git a/code/game/Conscript b/code/game/Conscript new file mode 100755 index 0000000..f823cef --- /dev/null +++ b/code/game/Conscript @@ -0,0 +1,140 @@ +# 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';
+ }
+}
|