source ./configure-lib.sh

variable builddir build

rule copy --command "cp \$in \$out"

rule re2c --command "re2c \$flags -o \$out \$in"

rule lemon --command "lemon -d\$builddir \$in"

DEBUG_FLAGS="--cflag -g"

# TODO, why is this not accepting an argument with strings?
per_platform library ___-tabula \
  --include-directory tabula/include \
  --cflag -Wall \
  --cflag -Werror \
  --cflag -Wno-unused-function \
  --cflag -Wno-unused-value \
  --cflag -pthread \
  --lflag -lpthread \
  $DEBUG_FLAGS \
  tabula/src/tabula.c

per_platform library ___-libuv     --pkg-config libuv
per_platform library ___-sqlite3   --pkg-config sqlite3

library lnx-glfw3 --platform lnx --pkg-config glfw3 --lflag -lGL
library win-glfw3 --platform win --pkg-config glfw3 --lflag -lgdi32 --lflag -lssp

executable alias-gen_geometric_algebra lnx-tabula alias/gen/geometric_algebra.c

rule gen_geometric_algebra --implicit \$builddir/alias-gen_geometric_algebra --command "\$builddir/alias-gen_geometric_algebra \$flags > \$out"

build "\$builddir/include/alias/pga2d.h" gen_geometric_algebra "" --flags "-p 2 -d 1 --binary meet outer_product --binary join regressive_product --code m02"
build "\$builddir/include/alias/pga3d.h" gen_geometric_algebra "" --flags "-p 3 -d 1 --binary meet outer_product --binary join regressive_product --code m024"
build "\$builddir/include/alias/cga2d.h" gen_geometric_algebra "" --flags "-p 3 -n 1 --binary meet outer_product --binary join regressive_product"
build "\$builddir/include/alias/cga3d.h" gen_geometric_algebra "" --flags "-p 4 -n 1 --binary meet outer_product --binary join regressive_product"

phony geometric_algebra_headers \
  --include-directory "\$builddir/include" \
  "\$builddir/include/alias/pga2d.h" \
  "\$builddir/include/alias/pga3d.h" \
  "\$builddir/include/alias/cga2d.h" \
  "\$builddir/include/alias/cga3d.h"

per_platform library ___-alias \
  --include-directory alias/include \
  --include-directory alias/ext/glad \
  --lflag -lm \
  ___-tabula \
  ___-libuv \
  geometric_algebra_headers \
  alias/src/ash.c \
  alias/src/color.c \
  alias/src/ecs_archetype.c \
  alias/src/ecs_component.c \
  alias/src/ecs_entity.c \
  alias/src/ecs_instance.c \
  alias/src/ecs_layer.c \
  alias/src/ecs_memory.c \
  alias/src/ecs_query.c \
  alias/src/ff_qoi.c \
	alias/src/file_system.c \
	alias/src/glob.c \
  alias/src/lexer.c \
  alias/src/log.c \
  alias/src/memory.c \
  alias/src/physics_bvh_2d.c \
  alias/src/physics.c \
  alias/src/random.c \
  alias/src/str.c \
  alias/src/string32.c \
  alias/src/transform.c \
  alias/src/ui.c \
  alias/src/libuv.c \
	alias/src/gl.c

build "\$builddir/algebra-parse.re.c" lemon solver/src/algebra-parse.re.y

build "\$builddir/algebra-parse.c" re2c "\$builddir/algebra-parse.re.c"

per_platform library ___-solver \
  --include-directory solver/include \
  ___-alias \
  solver/src/algebra.c \
  "\$builddir/algebra-parse.c"

per_platform executable ___-solver-test \
  ___-solver \
  solver/test/algebra.c \
  solver/test/main.c

per_platform executable ___-struo \
	___-alias \
	___-solver \
	--include-directory struo/include \
	struo/src/main.c \
	struo/src/options.c

per_platform library ___-engine \
	___-glfw3 \
	___-struo \
  --include-directory engine/include \
  --include-directory engine/ext/stb \
	engine/src/engine.c \
	engine/src/stbi.c

per_platform executable ___-engine-test \
  ___-engine \
	engine/integration_test/src/main.c

per_platform executable ___-game_01 \
	___-engine \
	game_01/src/main.c

# ---------------------------------------------------------------------------------------------------------------------

rule configure --command "./configure.sh > build.ninja" --implicit "configure-lib.sh configure.sh" --generator
build build.ninja configure

#rule gen_build_graph --command "ninja -t graph | dot -Tpng -o \$out" --implicit build.ninja
#build build.ninja.png gen_build_graph

# ---------------------------------------------------------------------------------------------------------------------

# TODO add_subdirectory(ext/mir)

per_platform library ___-quake2-shared \
  ___-alias \
  ___-sqlite3 \
  --include-directory quake2 \
  quake2/game/q_shared.c \
  quake2/game/monster/m_flash.c

per_platform library ___-quake2-game \
  ___-quake2-shared \
  --define-private GAME_HARD_LINKED=1 \
  quake2/game/player/p_weapon.c \
  quake2/game/player/p_view.c \
  quake2/game/player/p_trail.c \
  quake2/game/player/p_hud.c \
  quake2/game/player/p_client.c \
  quake2/game/monster/m_tank.c \
  quake2/game/monster/m_supertank.c \
  quake2/game/monster/m_soldier.c \
  quake2/game/monster/m_parasite.c \
  quake2/game/monster/m_mutant.c \
  quake2/game/monster/m_move.c \
  quake2/game/monster/m_medic.c \
  quake2/game/monster/m_insane.c \
  quake2/game/monster/m_infantry.c \
  quake2/game/monster/m_hover.c \
  quake2/game/monster/m_gunner.c \
  quake2/game/monster/m_gladiator.c \
  quake2/game/monster/m_flyer.c \
  quake2/game/monster/m_float.c \
  quake2/game/monster/m_flipper.c \
  quake2/game/monster/m_chick.c \
  quake2/game/monster/m_brain.c \
  quake2/game/monster/m_boss32.c \
  quake2/game/monster/m_boss31.c \
  quake2/game/monster/m_boss3.c \
  quake2/game/monster/m_boss2.c \
  quake2/game/monster/m_berserk.c \
  quake2/game/monster/m_actor.c \
  quake2/game/g_weapon.c \
  quake2/game/g_utils.c \
  quake2/game/g_turret.c \
  quake2/game/g_trigger.c \
  quake2/game/g_target.c \
  quake2/game/g_svcmds.c \
  quake2/game/g_spawn.c \
  quake2/game/g_save.c \
  quake2/game/g_phys.c \
  quake2/game/g_monster.c \
  quake2/game/g_misc.c \
  quake2/game/g_main.c \
  quake2/game/g_items.c \
  quake2/game/g_func.c \
  quake2/game/g_combat.c \
  quake2/game/g_cmds.c \
  quake2/game/g_chase.c \
  quake2/game/g_ai.c

per_platform library ___-quake2-common \
  ___-quake2-shared \
  quake2/qcommon/cmd.c \
  quake2/qcommon/cmodel.c \
  quake2/qcommon/common.c \
  quake2/qcommon/crc.c \
  quake2/qcommon/cvar.c \
  quake2/qcommon/files.c \
  quake2/qcommon/md4.c \
  quake2/qcommon/net_chan.c \
  quake2/qcommon/pmove.c \
  quake2/qcommon/sql.c

per_platform library ___-quake2-client \
  ___-quake2-common \
  ___-glfw3 \
  quake2/client/cl_cin.c \
  quake2/client/cl_ents.c \
  quake2/client/cl_fx.c \
  quake2/client/cl_input.c \
  quake2/client/cl_inv.c \
  quake2/client/cl_main.c \
  quake2/client/cl_newfx.c \
  quake2/client/cl_parse.c \
  quake2/client/cl_pred.c \
  quake2/client/cl_scrn.c \
  quake2/client/cl_tent.c \
  quake2/client/cl_view.c \
  quake2/client/console.c \
  quake2/client/keys.c \
  quake2/client/menu.c \
  quake2/client/qmenu.c \
  quake2/client/snd_dma.c \
  quake2/client/snd_mem.c \
  quake2/client/snd_mix.c \
  quake2/client/x86.c \
  quake2/client/in_glfw.c \
  quake2/client/snd_miniaudio.c \
  quake2/client/snd_miniaudio_imp.c

per_platform library ___-quake2-server \
  ___-quake2-common \
  quake2/server/sv_ccmds.c \
  quake2/server/sv_ents.c \
  quake2/server/sv_game.c \
  quake2/server/sv_init.c \
  quake2/server/sv_main.c \
  quake2/server/sv_send.c \
  quake2/server/sv_user.c \
  quake2/server/sv_world.c

per_platform library ___-quake2-refresh \
  ___-quake2-common \
  ___-glfw3 \
  --define-private REF_HARD_LINKED=1 \
  quake2/ref_gl/gl_beam.c \
  quake2/ref_gl/gl_compute.c \
  quake2/ref_gl/gl_draw.c \
  quake2/ref_gl/gl_light.c \
  quake2/ref_gl/gl_model.c \
  quake2/ref_gl/gl_particle.c \
  quake2/ref_gl/gl_rmisc.c \
  quake2/ref_gl/gl_warp.c \
  quake2/ref_gl/gl_image.c \
  quake2/ref_gl/gl_mesh.c \
  quake2/ref_gl/gl_model_not_found.c \
  quake2/ref_gl/gl_rmain.c \
  quake2/ref_gl/gl_rsurf.c \
  quake2/ref_gl/gl_sky.c \
  quake2/ref_gl/gl_sprite.c \
  quake2/ref_gl/gl_thin.c \
  quake2/ref_gl/glimp_glfw.c \
  quake2/ref_gl/qgl_glfw.c \
  quake2/ref_gl/render_mesh.c

per_platform executable ___-quake2 \
  ___-quake2-client \
  ___-quake2-server \
  ___-quake2-refresh \
  ___-quake2-game \
  quake2/main.c

per_platform executable ___-q2tools \
  --include-directory quake2/tools/common \
  --lflag -lm \
  quake2/tools/main.c \
  quake2/tools/4bsp/4bsp.c \
  quake2/tools/4bsp/brushbsp.c \
  quake2/tools/4bsp/csg.c \
  quake2/tools/4bsp/faces.c \
  quake2/tools/4bsp/leakfile.c \
  quake2/tools/4bsp/map.c \
  quake2/tools/4bsp/portals.c \
  quake2/tools/4bsp/prtfile.c \
  quake2/tools/4bsp/textures.c \
  quake2/tools/4bsp/tree.c \
  quake2/tools/4bsp/writebsp.c \
  quake2/tools/4rad/4rad.c \
  quake2/tools/4rad/lightmap.c \
  quake2/tools/4rad/patches.c \
  quake2/tools/4rad/trace.c \
  quake2/tools/4vis/4vis.c \
  quake2/tools/4vis/flow.c \
  quake2/tools/common/bspfile.c \
  quake2/tools/common/cmdlib.c \
  quake2/tools/common/l3dslib.c \
  quake2/tools/common/lbmlib.c \
  quake2/tools/common/llwolib.c \
  quake2/tools/common/mathlib.c \
  quake2/tools/common/mdfour.c \
  quake2/tools/common/polylib.c \
  quake2/tools/common/scriplib.c \
  quake2/tools/common/threads.c \
  quake2/tools/common/trilib.c

  #quake2/tools/4data/4data.c \
  #quake2/tools/4data/images.c \
  #quake2/tools/4data/models.c \
  #quake2/tools/4data/sprites.c \
  #quake2/tools/4data/tables.c \
  #quake2/tools/4data/video.c \