GIT_VERSION = `git config --get remote.origin.url | sed -r 's/.*(\@|\/\/)(.*)(\:|\/)([^:\/]*)\/([^\/\.]*)\.git/https:\/\/\2\/\4\/\5/'` `git describe --tags --always --dirty=-dev`

BUILDDIR = build/build
BINDIR = bin

GAME_MODULES = AIAttackMan.c AIDefenseMan.c AIEvents.c AIFleetMan.c AIHandler.c AIMoves.c AIOrders.c AIPlayer.c AIResourceMan.c AIShip.c AITeam.c AITrack.c AIUtilities.c AIVar.c \
               Alliance.c Animatic.c Attack.c AutoDownloadMap.c AutoLOD.c B-Spline.c Battle.c BigFile.c Blobs.c BMP.c Bounties.c BTG.c Camera.c CameraCommand.c Captaincy.c \
               ChannelFSM.c Chatting.c Clamp.c Clipper.c Clouds.c Collision.c Color.c ColPick.c CommandLayer.c CommandNetwork.c CommandWrap.c ConsMgr.c Crates.c Damage.c Debug.c \
               Demo.c Dock.c ETG.c Eval.c FEFlow.c FEReg.c File.c FlightMan.c FontReg.c Formation.c GameChat.c GamePick.c Globals.c Gun.c Hash.c HorseRace.c HS.c InfoOverlay.c \
               KAS.c KASFunc.c Key.c KeyBindings.c LagPrint.c LaunchMgr.c LevelLoad.c Light.c LinkedList.c LOD.c MadLinkIn.c Matrix.c Memory.c Mesh.c MeshAnim.c MEX.c \
               MultiplayerGame.c MultiplayerLANGame.c NavLights.c Nebulae.c NetCheck.c NIS.c Objectives.c ObjTypes.c Options.c Particle.c Physics.c PiePlate.c Ping.c \
               PlugScreen.c ProfileTimers.c Randy.c Region.c ResCollect.c ResearchAPI.c ResearchGUI.c SaveGame.c ScenPick.c Scroller.c Select.c Sensors.c Shader.c ShipSelect.c \
               ShipView.c SinglePlayer.c SoundEvent.c SoundEventPlay.c SoundEventStop.c SpeechEvent.c Star3d.c Stats.c StatScript.c StringSupport.c StubTransform.c Subtitle.c \
               Tactical.c Tactics.c Task.c TaskBar.c Teams.c Timer.c TitanNet.c Tracking.c TradeMgr.c Trails.c Transformer.c Tutor.c Tweak.c Twiddle.c Types.c UIControls.c Undo.c \
               Universe.c UnivUpdate.c Vector.c Volume.c

SDL_MODULES = avi.c dct.c font.c fqcodec.c fqeffect.c fquant.c main.c mainrgn.c mixfft.c mouse.c NetworkInterface.c prim2d.c prim3d.c Queue.c render.c rglu.c rinit.c screenshot.c \
              smixer.c soundlow.c sstream.c texreg.c TimeoutTimer.c Titan.c TitanInterfaceC.stub.c utility.c

MISSION_OBJECTS = Tutorial1 Mission01 Mission02 Mission03 Mission04 Mission05 Mission05_OEM Mission06 Mission07 Mission08 Mission09 Mission10 Mission11 \
                  Mission12 Mission13 Mission14 Mission15 Mission16

SRCDIR = ../src

MODULES = $(SDL_MODULES:%=$(SRCDIR)/SDL/%) \
          $(GAME_MODULES:%=$(SRCDIR)/Game/%) \
          $(wildcard $(SRCDIR)/Ships/*.c) \
          $(SRCDIR)/ThirdParty/CRC/CRC32.c \
          $(wildcard $(SRCDIR)/ThirdParty/LZSS/*.c)

# -DHW_GAME_HOMEWORLD
# -DHW_GAME_DEMO
# -DHW_BUILD_FOR_DISTRIBUTION
# -DHW_BUILD_FOR_DEBUGGING

COMMONFLAGS = -MMD \
              -MP \
              -DHAVE_BOOLEAN \
              -DHW_GAME_HOMEWORLD \
              -DHW_BUILD_FOR_DISTRIBUTION \
              -DGENERIC_ETGCALLFUNCTION \
              -D_WIN32 \
              -D_LINUX_FIX_ME \
              -DHW_PTR_64 \
              -DHW_PTR_64_FIX_ME \
              -DWIN32 \
              -DWINDOWS \
              -DSTDC_HEADERS \
              -DGIT_VERSION="\"$(GIT_VERSION)\"" \
              -I $(BUILDDIR)/Missions/Generated/ \
              -I ../src/Game/ \
              -I ../src/Ships/ \
              -I ../src/Game/ \
              -I ../src/SDL/ \
              -I ../src/ThirdParty/CRC/ \
              -I ../src/ThirdParty/LZSS/ \
              -I ../src/ThirdParty/Titan/ \
              -I ../src/ThirdParty/stb/ \
              -I .

EMXX = gcc
EMXXFLAGS = $(COMMONFLAGS) -O0 -ggdb3 `sdl2-config --cflags` -mconsole
EMXXLINK = -O0 -ggdb3 -lSDL2main -lSDL2 `sdl2-config --libs` -lopengl32 -mconsole


KAS2CFLAGS = -O0 -ggdb3 `sdl2-config --cflags` -lSDL2main -lSDL2 `sdl2-config --libs` -mconsole


all: kas2c missions .WAIT $(BINDIR)

# to generate windows pdb debug symbols from the mingw dwarf debug symbols
# download cv2pdb from https://github.com/rainers/cv2pdb and place the binaries
# in a subfolder called cv2pdb
debug: kas2c missions .WAIT $(BINDIR) $(BINDIR)/hw.pdb

LEX = lex
YACC = yacc

kas2c: ../tools/kas2c/kas2c.exe

../tools/kas2c/kas2c.exe: ../tools/kas2c/kas2c.c ../tools/kas2c/kas2c.h ../tools/kas2c/lexer.c ../tools/kas2c/parser.c
	$(EMXX) $(KAS2CFLAGS) ../tools/kas2c/*.c ../tools/kas2c/*.h -o $@

../tools/kas2c/lexer.c: ../tools/kas2c/lexer.l
	$(LEX) -i -o$@ ../tools/kas2c/lexer.l

../tools/kas2c/parser.c: ../tools/kas2c/parser.y
	$(YACC) -d -o $@ ../tools/kas2c/parser.y


missions: kas2c \
          $(MISSION_OBJECTS:%=$(BUILDDIR)/Missions/Generated/%.c)

.PRECIOUS: $(BUILDDIR)/Missions/Generated/%.c $(BUILDDIR)/Missions/Generated/%.h $(BUILDDIR)/Missions/Generated/%.func.c
$(BUILDDIR)/Missions/Generated/%.c $(BUILDDIR)/Missions/Generated/%.h $(BUILDDIR)/Missions/Generated/%.func.c: $(BUILDDIR)/Missions/Generated/%.kp ../tools/kas2c/kas2c.exe
	../tools/kas2c/kas2c.exe $< $(basename $@).c $(basename $@).h $(basename $@).func.c

.PRECIOUS: $(BUILDDIR)/Missions/Generated/Tutorial%.kp
$(BUILDDIR)/Missions/Generated/Tutorial%.kp: ../src/Missions/Tutorials/Tutorial%.kas
	@mkdir -p $(dir $@)
	cpp -x c $< > $@

.PRECIOUS: $(BUILDDIR)/Missions/Generated/Mission%.kp
$(BUILDDIR)/Missions/Generated/Mission%.kp: ../src/Missions/SinglePlayer/Mission%.kas
	@mkdir -p $(dir $@)
	cpp -x c $< > $@




$(BINDIR): $(BINDIR)/hw.exe

hw.res: hw.rc
	windres.exe hw.rc -O coff -o hw.res

$(BINDIR)/hw.exe: missions $(MODULES:%=$(BUILDDIR)/%.o) $(MISSION_OBJECTS:%=$(BUILDDIR)/Missions/Generated/%.o) $(MISSION_OBJECTS:%=$(BUILDDIR)/Missions/Generated/%.func.o) hw.res Makefile
	$(EMXX) $(filter %.o,$^) hw.res -o $@ $(EMXXLINK)

$(BUILDDIR)/Missions/Generated/%.o: $(BUILDDIR)/Missions/Generated/%.c
	@mkdir -p $(dir $@)
	@echo $<
	@$(EMXX) $(EMXXFLAGS) -c $< -o $@

$(BUILDDIR)/%.o: % Makefile
	@mkdir -p $(dir $@)
	@echo $<
	@$(EMXX) $(EMXXFLAGS) -c $< -o $@

$(BINDIR)/hw.pdb: $(BINDIR)/hw.exe
	.\cv2pdb\cv2pdb.exe bin\hw.exe

clean:
	rm -rf build/* $(BUILDDIR)/* $(BINDIR)/hw.exe
