B = /home/tfrieden/source/quake3/code

VM_JIT = vm_ppc.c

AHI_SND = $(B)/amiga/amiga_snd.c \
		  $(B)/client/snd_adpcm.c \
		  $(B)/client/snd_dma.c \
		  $(B)/client/snd_mem.c \
		  $(B)/client/snd_mix.c \
		  $(B)/client/snd_wavelet.c \

OPENAL_SND = $(B)/amiga/snd_al_buffers.c \
			 $(B)/amiga/snd_al_main.c \
			 $(B)/amiga/snd_al_music.c \
			 $(B)/amiga/snd_al_sources.c

SND_SRC = $(AHI_SND)

SRC = $(B)/client/cl_cgame.c \
	  $(B)/client/cl_cin.c \
	  $(B)/client/cl_console.c \
	  $(B)/client/cl_input.c \
	  $(B)/client/cl_keys.c \
	  $(B)/client/cl_main.c \
	  $(B)/client/cl_net_chan.c \
	  $(B)/client/cl_parse.c \
	  $(B)/client/cl_scrn.c \
	  $(B)/client/cl_ui.c \
	  \
	  $(B)/qcommon/cm_load.c \
	  $(B)/qcommon/cm_patch.c \
 	  $(B)/qcommon/cm_polylib.c \
 	  $(B)/qcommon/cm_test.c \
 	  $(B)/qcommon/cm_trace.c \
 	  $(B)/qcommon/cmd.c \
	  $(B)/qcommon/common.c \
	  $(B)/qcommon/cvar.c \
	  $(B)/qcommon/files.c \
	  $(B)/qcommon/huffman.c \
	  $(B)/qcommon/md4.c \
	  $(B)/qcommon/msg.c \
	  $(B)/qcommon/net_chan.c \
	  \
	  $(B)/game/q_math.c \
	  $(B)/game/q_shared.c \
	  \
	  $(B)/server/sv_bot.c \
	  $(B)/server/sv_ccmds.c \
	  $(B)/server/sv_client.c \
	  $(B)/server/sv_game.c \
	  $(B)/server/sv_init.c \
	  $(B)/server/sv_main.c \
	  $(B)/server/sv_net_chan.c \
	  $(B)/server/sv_snapshot.c \
	  $(B)/server/sv_world.c \
	  \
	  $(B)/qcommon/unzip.c \
	  $(B)/qcommon/vm.c \
	  $(B)/qcommon/vm_interpreted.c \
	  $(B)/qcommon/$(VM_JIT) \
	  \
	  $(B)/botlib/be_aas_bspq3.c \
	  $(B)/botlib/be_aas_cluster.c \
	  $(B)/botlib/be_aas_debug.c \
	  $(B)/botlib/be_aas_entity.c \
	  $(B)/botlib/be_aas_file.c \
	  $(B)/botlib/be_aas_main.c \
	  $(B)/botlib/be_aas_move.c \
	  $(B)/botlib/be_aas_optimize.c \
	  $(B)/botlib/be_aas_reach.c \
	  $(B)/botlib/be_aas_route.c \
	  $(B)/botlib/be_aas_routealt.c \
	  $(B)/botlib/be_aas_sample.c \
	  $(B)/botlib/be_ai_char.c \
	  $(B)/botlib/be_ai_chat.c \
	  $(B)/botlib/be_ai_gen.c \
	  $(B)/botlib/be_ai_goal.c \
	  $(B)/botlib/be_ai_move.c \
	  $(B)/botlib/be_ai_weap.c \
	  $(B)/botlib/be_ai_weight.c \
	  $(B)/botlib/be_ea.c \
	  $(B)/botlib/be_interface.c \
	  $(B)/botlib/l_crc.c \
	  $(B)/botlib/l_libvar.c \
	  $(B)/botlib/l_log.c \
	  $(B)/botlib/l_memory.c \
	  $(B)/botlib/l_precomp.c \
	  $(B)/botlib/l_script.c \
	  $(B)/botlib/l_struct.c \
	  \
	  $(B)/renderer/tr_animation.c \
	  $(B)/renderer/tr_backend.c \
	  $(B)/renderer/tr_bsp.c \
	  $(B)/renderer/tr_cmds.c \
	  $(B)/renderer/tr_curve.c \
	  $(B)/renderer/tr_flares.c \
	  $(B)/renderer/tr_font.c \
	  $(B)/renderer/tr_image.c \
	  $(B)/renderer/tr_init.c \
	  $(B)/renderer/tr_light.c \
	  $(B)/renderer/tr_main.c \
	  $(B)/renderer/tr_marks.c \
	  $(B)/renderer/tr_mesh.c \
	  $(B)/renderer/tr_model.c \
	  $(B)/renderer/tr_noise.c \
	  $(B)/renderer/tr_scene.c \
	  $(B)/renderer/tr_shade.c \
	  $(B)/renderer/tr_shade_calc.c \
	  $(B)/renderer/tr_shader.c \
	  $(B)/renderer/tr_shadows.c \
	  $(B)/renderer/tr_sky.c \
	  $(B)/renderer/tr_surface.c \
	  $(B)/renderer/tr_world.c \
	  \
	  $(B)/jpeg-6/jcapimin.c \
	  $(B)/jpeg-6/jccoefct.c \
	  $(B)/jpeg-6/jccolor.c \
	  $(B)/jpeg-6/jcdctmgr.c \
	  $(B)/jpeg-6/jchuff.c \
	  $(B)/jpeg-6/jcinit.c \
	  $(B)/jpeg-6/jcmainct.c \
	  $(B)/jpeg-6/jcmarker.c \
	  $(B)/jpeg-6/jcmaster.c \
	  $(B)/jpeg-6/jcomapi.c \
	  $(B)/jpeg-6/jcparam.c \
	  $(B)/jpeg-6/jcphuff.c \
	  $(B)/jpeg-6/jcprepct.c \
	  $(B)/jpeg-6/jcsample.c \
	  $(B)/jpeg-6/jctrans.c \
	  $(B)/jpeg-6/jdapimin.c \
	  $(B)/jpeg-6/jdapistd.c \
	  $(B)/jpeg-6/jdatadst.c \
	  $(B)/jpeg-6/jdatasrc.c \
	  $(B)/jpeg-6/jdcoefct.c \
	  $(B)/jpeg-6/jdcolor.c \
	  $(B)/jpeg-6/jddctmgr.c \
	  $(B)/jpeg-6/jdhuff.c \
	  $(B)/jpeg-6/jdinput.c \
	  $(B)/jpeg-6/jdmainct.c \
	  $(B)/jpeg-6/jdmarker.c \
	  $(B)/jpeg-6/jdmaster.c \
	  $(B)/jpeg-6/jdpostct.c \
	  $(B)/jpeg-6/jdsample.c \
	  $(B)/jpeg-6/jdtrans.c \
	  $(B)/jpeg-6/jerror.c \
	  $(B)/jpeg-6/jfdctflt.c \
	  $(B)/jpeg-6/jidctflt.c \
	  $(B)/jpeg-6/jmemmgr.c \
	  $(B)/jpeg-6/jmemnobs.c \
	  $(B)/jpeg-6/jutils.c \
	  \
	  $(B)/amiga/amiga_input.c \
	  $(B)/amiga/amiga_main.c \
	  $(B)/amiga/amiga_net.c \
	  $(B)/amiga/amiga_shared.c \
	  $(B)/amiga/amiga_syscon.c \
	  $(B)/amiga/amiga_glimp.c \
	  $(B)/amiga/amiga_qgl.c \
	  $(SND_SRC)

CGAMESRC = 	$(B)/game/bg_lib.c \
			$(B)/game/bg_misc.c \
			$(B)/game/bg_pmove.c \
			$(B)/game/bg_slidemove.c \
			\
			$(B)/cgame/cg_consolecmds.c \
			$(B)/cgame/cg_draw.c \
			$(B)/cgame/cg_drawtools.c \
			$(B)/cgame/cg_effects.c \
			$(B)/cgame/cg_ents.c \
			$(B)/cgame/cg_event.c \
			$(B)/cgame/cg_info.c \
			$(B)/cgame/cg_localents.c \
			$(B)/cgame/cg_main.c \
			$(B)/cgame/cg_marks.c \
			$(B)/cgame/cg_players.c \
			$(B)/cgame/cg_playerstate.c \
			$(B)/cgame/cg_predict.c \
			$(B)/cgame/cg_scoreboard.c \
			$(B)/cgame/cg_servercmds.c \
			$(B)/cgame/cg_snapshot.c \
			$(B)/cgame/cg_syscalls.c \
			$(B)/cgame/cg_view.c \
			$(B)/cgame/cg_weapons.c \
			\
			$(B)/game/q_math.c \
			$(B)/game/q_shared.c \
			\
			$(B)/ui/ui_shared.c \
			\
			$(B)/amiga/amiga_cgame.c
			
GAMESRC =   $(B)/game/ai_chat.c \
			$(B)/game/ai_cmd.c \
			$(B)/game/ai_dmnet.c \
			$(B)/game/ai_dmq3.c \
			$(B)/game/ai_main.c \
			$(B)/game/ai_team.c \
			$(B)/game/ai_vcmd.c \
			$(B)/game/bg_lib.c \
			$(B)/game/bg_misc.c \
			$(B)/game/bg_pmove.c \
			$(B)/game/bg_slidemove.c \
			$(B)/game/g_active.c \
			$(B)/game/g_arenas.c \
			$(B)/game/g_bot.c \
			$(B)/game/g_client.c \
			$(B)/game/g_cmds.c \
			$(B)/game/g_combat.c \
			$(B)/game/g_items.c \
			$(B)/game/g_main.c \
			$(B)/game/g_mem.c \
			$(B)/game/g_misc.c \
			$(B)/game/g_missile.c \
			$(B)/game/g_mover.c \
			$(B)/game/g_session.c \
			$(B)/game/g_spawn.c \
			$(B)/game/g_svcmds.c \
			$(B)/game/g_syscalls.c \
			$(B)/game/g_target.c \
			$(B)/game/g_team.c \
			$(B)/game/g_trigger.c \
			$(B)/game/g_utils.c \
			$(B)/game/g_weapon.c \
			$(B)/game/q_math.c \
			$(B)/game/q_shared.c \
			\
			$(B)/amiga/amiga_game.c

UISRC =	$(B)/game/bg_misc.c \
		$(B)/game/q_math.c \
		$(B)/game/q_shared.c \
		$(B)/q3_ui/ui_addbots.c \
		$(B)/q3_ui/ui_atoms.c \
		$(B)/q3_ui/ui_cdkey.c \
		$(B)/q3_ui/ui_cinematics.c \
		$(B)/q3_ui/ui_confirm.c \
		$(B)/q3_ui/ui_connect.c \
		$(B)/q3_ui/ui_controls2.c \
		$(B)/q3_ui/ui_credits.c \
		$(B)/q3_ui/ui_demo2.c \
		$(B)/q3_ui/ui_display.c \
		$(B)/q3_ui/ui_gameinfo.c \
		$(B)/q3_ui/ui_ingame.c \
		$(B)/q3_ui/ui_loadconfig.c \
		$(B)/q3_ui/ui_main.c \
		$(B)/q3_ui/ui_menu.c \
		$(B)/q3_ui/ui_mfield.c \
		$(B)/q3_ui/ui_mods.c \
		$(B)/q3_ui/ui_network.c \
		$(B)/q3_ui/ui_options.c \
		$(B)/q3_ui/ui_playermodel.c \
		$(B)/q3_ui/ui_players.c \
		$(B)/q3_ui/ui_playersettings.c \
		$(B)/q3_ui/ui_preferences.c \
		$(B)/q3_ui/ui_qmenu.c \
		$(B)/q3_ui/ui_removebots.c \
		$(B)/q3_ui/ui_saveconfig.c \
		$(B)/q3_ui/ui_serverinfo.c \
		$(B)/q3_ui/ui_servers2.c \
		$(B)/q3_ui/ui_setup.c \
		$(B)/q3_ui/ui_sound.c \
		$(B)/q3_ui/ui_sparena.c \
		$(B)/q3_ui/ui_specifyserver.c \
		$(B)/q3_ui/ui_splevel.c \
		$(B)/q3_ui/ui_sppostgame.c \
		$(B)/q3_ui/ui_spreset.c \
		$(B)/q3_ui/ui_spskill.c \
		$(B)/q3_ui/ui_startserver.c \
		$(B)/q3_ui/ui_team.c \
		$(B)/q3_ui/ui_teamorders.c \
		$(B)/q3_ui/ui_video.c \
		\
		$(B)/ui/ui_syscalls.c \
		\
		$(B)/amiga/amiga_ui.c


CC=ppc-amigaos-gcc -V 3.4.4
CFLAGS=-mcrt=newlib -fsigned-char -g -ggdb -O3 -DDEBUG -DMINIGL
Q3LIBS=-lsocket -ldll -lGL -lopenal -lvorbisfile -lvorbis -logg -lpthread -lm -lauto -lraauto
DLLLIBS=-ldll

define quake3_template
quake3_objs/$(notdir $(basename $(1))).o: $(1)
ifeq ($(notdir $(1)), $(VM_JIT))
	@echo Compiling $(notdir $(1))
	@$(CC) $(CFLAGS) -Wa,-mregnames -c $(1) -o quake3_objs/$(notdir $(basename $(1))).o
else
ifeq ($(dir $(1)), $(B)/botlib/)
	@echo Compiling $(notdir $(1))
	@$(CC) $(CFLAGS) -DBOTLIB -c $(1) -o quake3_objs/$(notdir $(basename $(1))).o
else
	@echo Compiling $(notdir $(1))
	@$(CC) $(CFLAGS) -c $(1) -o quake3_objs/$(notdir $(basename $(1))).o
endif
endif
Q3OBJ+=quake3_objs/$(notdir $(basename $(1))).o
endef

define cgame_template
cgame_objs/$(notdir $(basename $(1))).o: $(1)
	@echo Compiling $(notdir $(1))
	@$(CC) $(CFLAGS) -c $(1) -o cgame_objs/$(notdir $(basename $(1))).o
CGAMEOBJ+=cgame_objs/$(notdir $(basename $(1))).o
endef

define game_template
game_objs/$(notdir $(basename $(1))).o: $(1)
	@echo Compiling $(notdir $(1))
	@$(CC) $(CFLAGS) -c $(1) -o game_objs/$(notdir $(basename $(1))).o
GAMEOBJ+=game_objs/$(notdir $(basename $(1))).o
endef

define ui_template
ui_objs/$(notdir $(basename $(1))).o: $(1)
	@echo Compiling $(notdir $(1))
	@$(CC) $(CFLAGS) -c $(1) -o ui_objs/$(notdir $(basename $(1))).o
UIOBJ+=ui_objs/$(notdir $(basename $(1))).o
endef

all: config dirs dist/quake3 

#dist/baseq3/uippc.so dist/baseq3/cgameppc.so \
	dist/baseq3/qagameppc.so copy

$(foreach file,$(SRC),$(eval $(call quake3_template,$(file))))
$(foreach file,$(CGAMESRC),$(eval $(call cgame_template,$(file))))
$(foreach file,$(GAMESRC),$(eval $(call game_template,$(file))))
$(foreach file,$(UISRC),$(eval $(call ui_template,$(file))))


.PHONY: dirs config

dirs:
	-mkdir quake3_objs
	-mkdir cgame_objs
	-mkdir game_objs
	-mkdir ui_objs
	-mkdir dist
	-mkdir dist/baseq3
	
config:
	@echo Build configuration
	@echo CC     = $(CC)
	@echo CFLAGS = $(CFLAGS)
	@echo Q3LIBS = $(Q3LIBS)
	@echo

dist/quake3: $(Q3OBJ) makefile
	$(CC) $(CFLAGS) $(LDFLAGS) -o dist/quake3 $(Q3OBJ) $(Q3LIBS)
	
dist/baseq3/cgameppc.so: $(CGAMEOBJ) makefile
	$(CC) $(CFLAGS) $(LDFLAGS) -o dist/baseq3/cgameppc.so $(CGAMEOBJ) $(DLLLIBS)
	
dist/baseq3/qagameppc.so: $(GAMEOBJ) makefile
	$(CC) $(CFLAGS) $(LDFLAGS) -o dist/baseq3/qagameppc.so $(GAMEOBJ) $(DLLLIBS)

dist/baseq3/uippc.so: $(UIOBJ) makefile
	$(CC) $(CFLAGS) $(LDFLAGS) -o dist/baseq3/uippc.so $(UIOBJ) $(DLLLIBS)

archive:
	cd dist
	tar cvjf ../q3.tar.bz2 quake3 baseq3
	cd ..
	cp q3.tar.bz2 /tfrieden/Trash
	
copy:
	cp -v dist/quake3 /tfrieden/Trash
	cp -v dist/baseq3/* /tfrieden/Trash

