#--------------------------------------------------------------------------------------------
#   makefile to build MPXPLAY program with MinGW 4.5.2 and JWasm for Win32 console
#    MinGW : you can use other version too, but it can give different result
#    JWasm : http://www.japheth.de/JWasm.html (I use v2.06e)
#--------------------------------------------------------------------------------------------

# project root defs
PROJECT_ROOTDIR = $(CURDIR)
PROJECT_LIBDIR = $(PROJECT_ROOTDIR)
BUILDDIR = $(PROJECT_ROOTDIR)/build
EXE_MPXPLAY = $(PROJECT_ROOTDIR)/mpxplay.exe

# tool/compiler defs
TOOLDIR = d:/MinGW
TOOLVERSION = 4.5.2
BINDIR = $(TOOLDIR)/bin

AR = $(BINDIR)/ar
CC = $(BINDIR)/gcc
RANLIB = $(BINDIR)/ranlib
RM = $(TOOLDIR)/msys/1.0/bin/rm
STRIP = $(BINDIR)/strip

RANLIB_LIB = $(RANLIB) $@
DEL_LIB_OBJS = $(RM) $(addsuffix *.o, $(dir $<))

ARFLAGS = rcs

# compiler options
CFLAGS = -s -Os -funsigned-char -I. -I$(TOOLDIR)/include -D MPXPLAY
#CFLAGS += -ffast-math
LFLAGS = -lmsvcrt -lwinmm -ldsound -lws2_32 -lwsock32 -lmpr
LIBDIR = $(TOOLDIR)/lib -L$(TOOLDIR)/lib/gcc/mingw32/$(TOOLVERSION)
LFLAGS += -L$(LIBDIR)
#LFLAGS +=-Wl,-M -Wl,-Map=$(BUILDDIR)\mpxplay.map

#--- main lib---- ------------------------------------------------------------
LIB_MAIN = mpx_main.a
DIR_MAIN = $(PROJECT_ROOTDIR)
SRC_MAIN = MPXPLAY.C IN_FILE.C MPXINBUF.C
SRCS_MAIN = $(addprefix $(DIR_MAIN)/, $(notdir $(SRC_MAIN)))
OBJS_MAIN := $(SRCS_MAIN:.C=.o)
VPATH = $(DIR_MAIN)
LIB_ALL = $(LIB_MAIN)

#--- AU_CARDS lib ------------------------------------------------------------
LIB_AUCARDS = au_cards.a
DIR_AUCARDS = $(PROJECT_LIBDIR)/AU_CARDS
SRC_AUCARDS = AU_CARDS.C DMAIRQ.C SC_WAV.C SC_NULL.C SC_WINDS.C SC_WINWO.C
SRCS_AUCARDS = $(addprefix $(DIR_AUCARDS)/, $(notdir $(SRC_AUCARDS)))
OBJS_AUCARDS := $(SRCS_AUCARDS:.C=.o)
VPATH += $(DIR_AUCARDS)
LIB_ALL += $(LIB_AUCARDS)

#--- AU_MIXER lib -------------------------------------------------------------
LIB_AUMIXER = au_mixer.a
DIR_AUMIXER = $(PROJECT_LIBDIR)/AU_MIXER
SRC_AUMIXER = ANALISER.C AU_MIXER.C CUTSILEN.C CV_BITS.C CV_CHAN.C CV_FREQ.C FX_SURR.C FX_TONE.C MX_AVOL.C MX_CROSF.C MX_VOLUM.C
SRCS_AUMIXER = $(addprefix $(DIR_AUMIXER)/, $(notdir $(SRC_AUMIXER)))
OBJS_AUMIXER := $(SRCS_AUMIXER:.C=.o)
VPATH += $(DIR_AUMIXER)
LIB_ALL += $(LIB_AUMIXER)

#--- CONTROL lib ---------------------------------------------------------------
LIB_CONTROL = control.a
DIR_CONTROL = $(PROJECT_LIBDIR)/CONTROL
SRC_CONTROL = CONTROL.C FASTLIST.C JOY.C KEYBOARD.C KEYGROUP.C MOUSE.C SERIAL.C STARTUP.C
SRCS_CONTROL = $(addprefix $(DIR_CONTROL)/, $(notdir $(SRC_CONTROL)))
OBJS_CONTROL := $(SRCS_CONTROL:.C=.o)
VPATH += $(DIR_CONTROL)
LIB_ALL += $(LIB_CONTROL)

#--- DECODERS lib --------------------------------------------------------------
LIB_DECODERS = decoders.a
DIR_DECODERS = $(PROJECT_LIBDIR)/DECODERS
SRC_DECODERS = DECODERS.C AD_AAC.C AD_AC3.C AD_ALAC.C AD_MP3.C AD_PCM.C AD_FFMPG.C AD_VORBI.C
SRCS_DECODERS = $(addprefix $(DIR_DECODERS)/, $(notdir $(SRC_DECODERS)))
OBJS_DECODERS := $(SRCS_DECODERS:.C=.o)
VPATH += $(DIR_DECODERS)
LIB_ALL += $(LIB_DECODERS)

#--- DEMUXERS lib --------------------------------------------------------------
LIB_DEMUXERS = demuxers.a
DIR_DEMUXERS = $(PROJECT_LIBDIR)/DEMUXERS
SRC_DEMUXERS = IN_ASF.C IN_AVI.C IN_MP4.C IN_OGG.C IN_WAV.C IN_FFMPG.C FFUTILS.C FF_FLV.C FF_MKV.C FF_MPG.C FF_TS.C
SRCS_DEMUXERS = $(addprefix $(DIR_DEMUXERS)/, $(notdir $(SRC_DEMUXERS)))
OBJS_DEMUXERS := $(SRCS_DEMUXERS:.C=.o)
VPATH += $(DIR_DEMUXERS)
LIB_ALL += $(LIB_DEMUXERS)

#--- DEPARSER lib --------------------------------------------------------------
LIB_DEPARSER = deparser.a
DIR_DEPARSER = $(PROJECT_LIBDIR)/DEPARSER
SRC_DEPARSER = IN_AAC.C IN_AC3.C IN_APE.C IN_FLAC.C IN_MP3.C IN_MPC.C IN_WAVPA.C IN_RAWAU.C TAGGING.C
SRCS_DEPARSER = $(addprefix $(DIR_DEPARSER)/, $(notdir $(SRC_DEPARSER)))
OBJS_DEPARSER := $(SRCS_DEPARSER:.C=.o)
VPATH += $(DIR_DEPARSER)
LIB_ALL += $(LIB_DEPARSER)

#--- DISKDRIV lib --------------------------------------------------------------
LIB_DISKDRIV = diskdriv.a
DIR_DISKDRIV = $(PROJECT_LIBDIR)/DISKDRIV
SRC_DISKDRIV = DISKDRIV.C DRV_CD.C DRV_HD.C DRV_FTP.C DRV_HTTP.C CD_ASPI.C OPEN_FTP.C TCPCOMON.C
SRCS_DISKDRIV = $(addprefix $(DIR_DISKDRIV)/, $(notdir $(SRC_DISKDRIV)))
OBJS_DISKDRIV := $(SRCS_DISKDRIV:.C=.o)
VPATH += $(DIR_DISKDRIV)
LIB_ALL += $(LIB_DISKDRIV)

#--- DISPLAY lib --------------------------------------------------------------
LIB_DISPLAY = display.a
DIR_DISPLAY = $(PROJECT_LIBDIR)/DISPLAY
SRC_DISPLAY = DISPLAY.C BUTTONS.C LCD.C TEXTWIN.C VISUALPI.C
SRCS_DISPLAY = $(addprefix $(DIR_DISPLAY)/, $(notdir $(SRC_DISPLAY)))
OBJS_DISPLAY := $(SRCS_DISPLAY:.C=.o)
VPATH += $(DIR_DISPLAY)
LIB_ALL += $(LIB_DISPLAY)

#--- NEWFUNC lib --------------------------------------------------------------
LIB_NEWFUNC = newfunc.a
DIR_NEWFUNC = $(PROJECT_LIBDIR)/NEWFUNC
SRC_NEWFUNC = NEWFUNC.C BITSTRM.C CPU.C DLL_LOAD.C DPMI.C DRIVEHND.C ERRORHND.C FILEHAND.C FPU.C
SRC_NEWFUNC += KEYBOARD.C MEMORY.C MIXED.C STRING.C TEXTDISP.C TIME.C TIMER.C
SRCS_NEWFUNC = $(addprefix $(DIR_NEWFUNC)/, $(notdir $(SRC_NEWFUNC)))
OBJS_NEWFUNC := $(SRCS_NEWFUNC:.C=.o)
VPATH += $(DIR_NEWFUNC)
LIB_ALL += $(LIB_NEWFUNC)

#--- PLAYLIST lib --------------------------------------------------------------
LIB_PLAYLIST = playlist.a
DIR_PLAYLIST = $(PROJECT_LIBDIR)/PLAYLIST
SRC_PLAYLIST = PLAYLIST.C CHKENTRY.C DISKFILE.C EDITLIST.C FILEINFO.C ID3LIST.C JUKEBOX.C LOADDIR.C
SRC_PLAYLIST += LOADLIST.C LOADSUB.C RANDLIST.C SAVELIST.C SKIPLIST.C SORTLIST.C TEXTCONV.C
SRCS_PLAYLIST = $(addprefix $(DIR_PLAYLIST)/, $(notdir $(SRC_PLAYLIST)))
OBJS_PLAYLIST := $(SRCS_PLAYLIST:.C=.o)
VPATH += $(DIR_PLAYLIST)
LIB_ALL += $(LIB_PLAYLIST)

#--- VIDEOOUT lib --------------------------------------------------------------
LIB_VIDEOOUT = videoout.a
DIR_VIDEOOUT = $(PROJECT_LIBDIR)/VIDEOOUT
SRC_VIDEOOUT = VIDEOOUT.C VO_VESA.C
SRCS_VIDEOOUT = $(addprefix $(DIR_VIDEOOUT)/, $(notdir $(SRC_VIDEOOUT)))
OBJS_VIDEOOUT := $(SRCS_VIDEOOUT:.C=.o)
VPATH += $(DIR_VIDEOOUT)
LIB_ALL += $(LIB_VIDEOOUT)

#################################################################################
#--- AD_AAC lib --------------------------------------------------------------
LIB_AD_AAC = ad_aac.a
DIR_AD_AAC = $(DIR_DECODERS)/AD_AAC
SRC_AD_AAC  = BITS.C CFFT.C COMMON.C DECODER.C DRC.C FILTBANK.C HCR.C HUFFMAN.C IC_PREDI.C
SRC_AD_AAC += LT_PREDI.C MDCT.C MP4.C MS_IS.C OUTPUT.C PNS.C PULSE.C RVLC.C SBR_DCT.C SBR_DEC.C
SRC_AD_AAC += SBR_E_NF.C SBR_FBT.C SBR_HFAD.C SBR_HFGE.C SBR_QMF.C SBR_SYNT.C SBR_TF_G.C SPECREC.C
SRC_AD_AAC += SYNTAX.C TNS.C
SRCS_AD_AAC = $(addprefix $(DIR_AD_AAC)/, $(notdir $(SRC_AD_AAC)))
OBJS_AD_AAC := $(SRCS_AD_AAC:.C=.o)
VPATH += $(DIR_AD_AAC)
LIB_ALL += $(LIB_AD_AAC)

#--- AD_AC3 lib --------------------------------------------------------------
LIB_AD_AC3 = ad_ac3.a
DIR_AD_AC3 = $(DIR_DECODERS)/AD_AC3
SRC_AD_AC3  = BIT_ALLO.C BITSTREA.C CRC.C IMDCT.C PARSE.C
SRCS_AD_AC3 = $(addprefix $(DIR_AD_AC3)/, $(notdir $(SRC_AD_AC3)))
OBJS_AD_AC3 := $(SRCS_AD_AC3:.C=.o)
VPATH += $(DIR_AD_AC3)
LIB_ALL += $(LIB_AD_AC3)

#--- AD_APE lib --------------------------------------------------------------
LIB_AD_APE = ad_ape.a
DIR_AD_APE = $(DIR_DECODERS)/AD_APE
SRC_AD_APE  = APEINFO.C DEC_NEW.C DEC_OLD.C MACLIB.C PRED_NEW.C PRED_OLD.C PREPARE.C UNBITBAS.C UNBITNEW.C UNBITOLD.C
SRCS_AD_APE = $(addprefix $(DIR_AD_APE)/, $(notdir $(SRC_AD_APE)))
OBJS_AD_APE := $(SRCS_AD_APE:.C=.o)
VPATH += $(DIR_AD_APE)
LIB_ALL += $(LIB_AD_APE)

#--- AD_MP3 lib --------------------------------------------------------------
LIB_AD_MP3 = ad_mp3.a
DIR_AD_MP3 = $(DIR_DECODERS)/AD_MP3
SRC_AD_MP3  = LAYER2.C LAYER3.C
SRCS_AD_MP3 = $(addprefix $(DIR_AD_MP3)/, $(notdir $(SRC_AD_MP3)))
OBJS_AD_MP3 := $(SRCS_AD_MP3:.C=.o)
VPATH += $(DIR_AD_MP3)
LIB_ALL += $(LIB_AD_MP3)

#--- AD_MPC lib --------------------------------------------------------------
LIB_AD_MPC = ad_mpc.a
DIR_AD_MPC = $(DIR_DECODERS)/AD_MPC
SRC_AD_MPC  = BITSTRM.C HUFF_NEW.C MPCDEC.C REQUANT.C
SRCS_AD_MPC = $(addprefix $(DIR_AD_MPC)/, $(notdir $(SRC_AD_MPC)))
OBJS_AD_MPC := $(SRCS_AD_MPC:.C=.o)
VPATH += $(DIR_AD_MPC)
LIB_ALL += $(LIB_AD_MPC)

#--- AD_VORBI lib --------------------------------------------------------------
LIB_AD_VORBI = ad_vorbi.a
DIR_AD_VORBI = $(DIR_DECODERS)/AD_VORBI
SRC_AD_VORBI  = BITWISE.C BLOCK.C CODEBOOK.C FLOOR0.C FLOOR1.C FRAMING.C INFO.C MAPPING0.C RES0.C SHARBOOK.C SYNTHESI.C WINDOW.C LSP.C MDCT.C
SRCS_AD_VORBI = $(addprefix $(DIR_AD_VORBI)/, $(notdir $(SRC_AD_VORBI)))
OBJS_AD_VORBI := $(SRCS_AD_VORBI:.C=.o)
VPATH += $(DIR_AD_VORBI)
LIB_ALL += $(LIB_AD_VORBI)

#--- AD_WAVPA lib --------------------------------------------------------------
LIB_AD_WAVPA = ad_wavpa.a
DIR_AD_WAVPA = $(DIR_DECODERS)/AD_WAVPA
SRC_AD_WAVPA  = BITS.C FLOAT.C METADATA.C UNPACK.C WORDS.C WPUTILS.C
SRCS_AD_WAVPA = $(addprefix $(DIR_AD_WAVPA)/, $(notdir $(SRC_AD_WAVPA)))
OBJS_AD_WAVPA := $(SRCS_AD_WAVPA:.C=.o)
VPATH += $(DIR_AD_WAVPA)
LIB_ALL += $(LIB_AD_WAVPA)

#--- FFMPEGAC lib --------------------------------------------------------------
LIB_FFMPEGAC = ffmpegac.a
DIR_FFMPEGAC = $(DIR_DECODERS)/FFMPEGAC
SRC_FFMPEGAC  =  BITSTREA.C CRC.C FLAC.C GOLOMB.C MEM.C UTILS.C WMADEC.C FFT.C MDCT.C
SRCS_FFMPEGAC = $(addprefix $(DIR_FFMPEGAC)/, $(notdir $(SRC_FFMPEGAC)))
OBJS_FFMPEGAC := $(SRCS_FFMPEGAC:.C=.o)
VPATH += $(DIR_FFMPEGAC)
LIB_ALL += $(LIB_FFMPEGAC)

#################################################################################
LIBS_MPXPLAY := $(addprefix $(BUILDDIR)/, $(notdir $(LIB_ALL:.a=.a)))

all: $(EXE_MPXPLAY)

$(BUILDDIR)/$(LIB_MAIN): $(OBJS_MAIN)
	$(AR) $(ARFLAGS) $@ $(OBJS_MAIN)
	$(RANLIB_LIB)
	$(DEL_LIB_OBJS)

$(BUILDDIR)/$(LIB_AUCARDS): $(OBJS_AUCARDS)
	$(AR) $(ARFLAGS) $@ $(OBJS_AUCARDS)
	$(RANLIB_LIB)
	$(DEL_LIB_OBJS)

$(BUILDDIR)/$(LIB_AUMIXER): $(OBJS_AUMIXER)
	$(AR) $(ARFLAGS) $@ $(OBJS_AUMIXER)
	JWasm -coff -Fo$(DIR_AUMIXER)/ANALIASM.o $(DIR_AUMIXER)/ANALIASM.ASM
	$(AR) $(ARFLAGS) $@ $(DIR_AUMIXER)/ANALIASM.o
	$(RANLIB_LIB)
	$(DEL_LIB_OBJS)

$(BUILDDIR)/$(LIB_CONTROL): $(OBJS_CONTROL)
	$(AR) $(ARFLAGS) $@ $(OBJS_CONTROL)
	$(RANLIB_LIB)
	$(DEL_LIB_OBJS)

$(BUILDDIR)/$(LIB_DECODERS): $(OBJS_DECODERS)
	$(AR) $(ARFLAGS) $@ $(OBJS_DECODERS)
	$(RANLIB_LIB)
	$(DEL_LIB_OBJS)

$(BUILDDIR)/$(LIB_DEMUXERS): $(OBJS_DEMUXERS)
	$(AR) $(ARFLAGS) $@ $(OBJS_DEMUXERS)
	$(RANLIB_LIB)
	$(DEL_LIB_OBJS)

$(BUILDDIR)/$(LIB_DEPARSER): $(OBJS_DEPARSER)
	$(AR) $(ARFLAGS) $@ $(OBJS_DEPARSER)
	$(RANLIB_LIB)
	$(DEL_LIB_OBJS)

$(BUILDDIR)/$(LIB_DISKDRIV): $(OBJS_DISKDRIV)
	$(AR) $(ARFLAGS) $@ $(OBJS_DISKDRIV)
	$(RANLIB_LIB)
	$(DEL_LIB_OBJS)

$(BUILDDIR)/$(LIB_DISPLAY): $(OBJS_DISPLAY)
	$(AR) $(ARFLAGS) $@ $(OBJS_DISPLAY)
	$(RANLIB_LIB)
	$(DEL_LIB_OBJS)

$(BUILDDIR)/$(LIB_NEWFUNC): $(OBJS_NEWFUNC)
	$(AR) $(ARFLAGS) $@ $(OBJS_NEWFUNC)
	$(RANLIB_LIB)
	$(DEL_LIB_OBJS)

$(BUILDDIR)/$(LIB_PLAYLIST): $(OBJS_PLAYLIST)
	$(AR) $(ARFLAGS) $@ $(OBJS_PLAYLIST)
	$(RANLIB_LIB)
	$(DEL_LIB_OBJS)

$(BUILDDIR)/$(LIB_VIDEOOUT): $(OBJS_VIDEOOUT)
	$(AR) $(ARFLAGS) $@ $(OBJS_VIDEOOUT)
	$(RANLIB_LIB)
	$(DEL_LIB_OBJS)

#---------------------------------------------------------------------------------
$(BUILDDIR)/$(LIB_AD_AAC): $(OBJS_AD_AAC)
	$(AR) $(ARFLAGS) $@ $(OBJS_AD_AAC)
	$(RANLIB_LIB)
	$(DEL_LIB_OBJS)

$(BUILDDIR)/$(LIB_AD_AC3): $(OBJS_AD_AC3)
	$(AR) $(ARFLAGS) $@ $(OBJS_AD_AC3)
	$(RANLIB_LIB)
	$(DEL_LIB_OBJS)

$(BUILDDIR)/$(LIB_AD_APE): $(OBJS_AD_APE)
	$(AR) $(ARFLAGS) $@ $(OBJS_AD_APE)
	JWasm -coff -Fo$(DIR_AD_APE)/APEMMX.o $(DIR_AD_APE)/APEMMX.ASM
	$(AR) $(ARFLAGS) $@ $(DIR_AD_APE)/APEMMX.o
	$(RANLIB_LIB)
	$(DEL_LIB_OBJS)

$(BUILDDIR)/$(LIB_AD_MP3): $(OBJS_AD_MP3)
	$(AR) $(ARFLAGS) $@ $(OBJS_AD_MP3)
	JWasm -coff -zcw -Fo$(DIR_AD_MP3)/L3_DEQ.o $(DIR_AD_MP3)/L3_DEQ.ASM
	JWasm -coff -Fo$(DIR_AD_MP3)/L3_MDCT.o $(DIR_AD_MP3)/L3_MDCT.ASM
	JWasm -coff -Fo$(DIR_AD_MP3)/SYNTH.o $(DIR_AD_MP3)/SYNTH.ASM
	$(AR) $(ARFLAGS) $@ $(DIR_AD_MP3)/L3_DEQ.o
	$(AR) $(ARFLAGS) $@ $(DIR_AD_MP3)/L3_MDCT.o
	$(AR) $(ARFLAGS) $@ $(DIR_AD_MP3)/SYNTH.o
	$(RANLIB_LIB)
	$(DEL_LIB_OBJS)

$(BUILDDIR)/$(LIB_AD_MPC): $(OBJS_AD_MPC)
	$(AR) $(ARFLAGS) $@ $(OBJS_AD_MPC)
	$(RANLIB_LIB)
	$(DEL_LIB_OBJS)

$(BUILDDIR)/$(LIB_AD_VORBI): $(OBJS_AD_VORBI)
	$(AR) $(ARFLAGS) $@ $(OBJS_AD_VORBI)
	$(RANLIB_LIB)
	$(DEL_LIB_OBJS)

$(BUILDDIR)/$(LIB_AD_WAVPA): $(OBJS_AD_WAVPA)
	$(AR) $(ARFLAGS) $@ $(OBJS_AD_WAVPA)
	$(RANLIB_LIB)
	$(DEL_LIB_OBJS)

$(BUILDDIR)/$(LIB_FFMPEGAC): $(OBJS_FFMPEGAC)
	$(AR) $(ARFLAGS) $@ $(OBJS_FFMPEGAC)
	$(RANLIB_LIB)
	$(DEL_LIB_OBJS)

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

$(EXE_MPXPLAY): $(LIBS_MPXPLAY)
	$(CC) $(CFLAGS) -o $@ $(LIBS_MPXPLAY) $(LFLAGS)
	$(STRIP) -s $(EXE_MPXPLAY)

%.o: %.c
	$(CC) -c -x c $(CFLAGS) -o $@ $<

%.o: %.C
	$(CC) -c -x c $(CFLAGS) -o $@ $<

clean distclean:
	$(RM) $(BUILDDIR)/*.a
