#########################################################################
# Makefile for Microsoft's MPEG VM software encoder & decoder
#
# Peter Van Beek, Wed Feb  5 14:20:17 1997
# University of Rochester, Department of Electrical Engineering
#########################################################################

########## General definitions ##########################################
CCC 		= g++ -D __TRACE_AND_STATS_ -D__DOUBLE_PRECISION_ -DFULL_SEARCH -D_OBSS_

#CFLAGS		= $(INC)  -g -O2 -Wall -Wpointer-arith
CFLAGS		= $(INC) -g -Wall -Wpointer-arith

LN 			= /bin/ln -s
MV 			= /bin/mv
CP 			= /bin/cp
RM 			= /bin/rm -f
INSTALL		= $(LN)



########## Module definitions ###########################################
TOPDIR		= .
BINDIR		= ./bin

GROUP		= .

SRCDIR		= $(TOPDIR)/$(GROUP)
APPDIR		= $(TOPDIR)/$(GROUP)/app
APPENCDIR	= $(TOPDIR)/$(GROUP)/app/encoder
APPDECDIR	= $(TOPDIR)/$(GROUP)/app/decoder
APPCONVDIR	= $(TOPDIR)/$(GROUP)/app/convertpar
SYSDIR		= $(TOPDIR)/$(GROUP)/sys
SYSENCDIR	= $(TOPDIR)/$(GROUP)/sys/encoder
SYSDECDIR	= $(TOPDIR)/$(GROUP)/sys/decoder
TOOLSDIR	= $(TOPDIR)/$(GROUP)/tools
TOOLSENTDIR	= $(TOPDIR)/$(GROUP)/tools/entropy
TOOLSSADIR      = $(TOPDIR)/$(GROUP)/tools/sadct
TYPEDIR		= $(TOPDIR)/$(GROUP)/type
VTCDIR		= $(TOPDIR)/$(GROUP)/vtc
VTCINCDIR	= $(TOPDIR)/$(GROUP)/vtc/include
VTCMAINDIR	= $(TOPDIR)/$(GROUP)/vtc/main
VTCPEZWDIR	= $(TOPDIR)/$(GROUP)/vtc/pezw
VTCWAVLTDIR	= $(TOPDIR)/$(GROUP)/vtc/wavelet
VTCZTEDIR	= $(TOPDIR)/$(GROUP)/vtc/zte
VTCZTQDIR	= $(TOPDIR)/$(GROUP)/vtc/ztq
VTCSHAPEDIR	= $(TOPDIR)/$(GROUP)/vtc/shape

OBJDIR		= $(TOPDIR)/$(GROUP)/obj

LIBS		= -lm -lobj

PROGRAMS 	= vm_enc vm_dec convertpar

OBJECTS	= \
			$(OBJDIR)/block.o \
			$(OBJDIR)/paramset.o \
			$(OBJDIR)/cae.o \
			$(OBJDIR)/dct.o \
			$(OBJDIR)/error.o \
			$(OBJDIR)/gmc_motion.o \
			$(OBJDIR)/gmc_util.o \
			$(OBJDIR)/mb.o \
			$(OBJDIR)/mc.o \
			$(OBJDIR)/mcpad.o \
			$(OBJDIR)/mode.o \
			$(OBJDIR)/mv.o \
			$(OBJDIR)/shape.o \
			$(OBJDIR)/spt.o \
			$(OBJDIR)/tps_bfshape.o \
			$(OBJDIR)/tps_enhcbuf.o \
			$(OBJDIR)/vopses.o \
			$(OBJDIR)/blkenc.o \
			$(OBJDIR)/tm5rc.o \
			$(OBJDIR)/vopseenc.o \
			$(OBJDIR)/errenc.o \
			$(OBJDIR)/gmc_enc_util.o \
			$(OBJDIR)/gme_for_iso.o \
			$(OBJDIR)/mbenc.o \
			$(OBJDIR)/mbinterlace.o \
			$(OBJDIR)/mcenc.o \
			$(OBJDIR)/motest.o \
			$(OBJDIR)/mvenc.o \
			$(OBJDIR)/padenc.o \
			$(OBJDIR)/sesenc.o \
			$(OBJDIR)/shpenc.o \
			$(OBJDIR)/sptenc.o \
			$(OBJDIR)/vopmbenc.o \
			$(OBJDIR)/blkdec.o \
			$(OBJDIR)/errdec.o \
			$(OBJDIR)/mbdec.o \
			$(OBJDIR)/mbheaddec.o \
			$(OBJDIR)/mbinterlacedec.o \
			$(OBJDIR)/mcdec.o \
			$(OBJDIR)/mvdec.o \
			$(OBJDIR)/rvlcdec.o \
			$(OBJDIR)/shpdec.o \
			$(OBJDIR)/sptdec.o \
			$(OBJDIR)/vopmbdec.o \
			$(OBJDIR)/vopsedec.o \
			$(OBJDIR)/bitstrm.o \
			$(OBJDIR)/huffman.o \
			$(OBJDIR)/sadct.o \
			$(OBJDIR)/basic.o \
			$(OBJDIR)/geom.o \
			$(OBJDIR)/grayc.o \
			$(OBJDIR)/grayf.o \
			$(OBJDIR)/grayi.o \
			$(OBJDIR)/svd.o \
			$(OBJDIR)/typeapi.o \
			$(OBJDIR)/vop.o \
			$(OBJDIR)/warp.o \
			$(OBJDIR)/yuvac.o \
			$(OBJDIR)/yuvai.o \
			$(OBJDIR)/computePSNR.o \
			$(OBJDIR)/read_image.o \
			$(OBJDIR)/seg.o \
			$(OBJDIR)/vtcdec.o \
			$(OBJDIR)/vtcenc.o \
			$(OBJDIR)/wavelet.o \
			$(OBJDIR)/write_image.o \
			$(OBJDIR)/PEZW_ac.o \
			$(OBJDIR)/PEZW_utils.o \
			$(OBJDIR)/PEZW_textureLayerBQ.o \
			$(OBJDIR)/PEZW_globals.o \
			$(OBJDIR)/wvtpezw_tree_init_decode.o \
			$(OBJDIR)/wvtpezw_tree_init_encode.o \
			$(OBJDIR)/wvtpezw_tree_encode.o \
			$(OBJDIR)/wvtpezw_tree_decode.o \
			$(OBJDIR)/wvtPEZW.o \
			$(OBJDIR)/download_filter.o \
			$(OBJDIR)/dwt.o \
			$(OBJDIR)/dwt_aux.o \
			$(OBJDIR)/dwtmask.o \
			$(OBJDIR)/idwt.o \
			$(OBJDIR)/idwt_aux.o \
			$(OBJDIR)/imagebox.o \
			$(OBJDIR)/ac.o \
			$(OBJDIR)/bitpack.o \
			$(OBJDIR)/ztscanUtil.o \
			$(OBJDIR)/ztscan_dec.o \
			$(OBJDIR)/ztscan_enc.o \
			$(OBJDIR)/QMInit.o \
			$(OBJDIR)/QMUtils.o \
			$(OBJDIR)/Utils.o \
			$(OBJDIR)/decQM.o \
			$(OBJDIR)/encQM.o \
			$(OBJDIR)/errorHandler.o \
			$(OBJDIR)/msg.o \
			$(OBJDIR)/quant.o \
			$(OBJDIR)/newpred.o \
			$(OBJDIR)/newpenc.o \
			$(OBJDIR)/newpdec.o \
			$(OBJDIR)/BinArCodec.o \
			$(OBJDIR)/ShapeBaseCommon.o \
			$(OBJDIR)/ShapeEnhCommon.o \
			$(OBJDIR)/ShapeEnhEncode.o \
			$(OBJDIR)/ShapeEncoding.o \
			$(OBJDIR)/ShapeBaseEncode.o \
			$(OBJDIR)/ShapeEnhDecode.o \
			$(OBJDIR)/ShapeDecoding.o \
			$(OBJDIR)/ShapeBaseDecode.o \
			$(OBJDIR)/idwtmask.o \
			$(OBJDIR)/ShapeUtil.o \
			$(OBJDIR)/rrv.o \


# Include all subdirectories for ease
INC	= 	-I$(TOPDIR)/$(GROUP)/ \
		-I$(TOPDIR)/$(GROUP)/sys/ \
		-I$(TOPDIR)/$(GROUP)/sys/encoder \
		-I$(TOPDIR)/$(GROUP)/sys/decoder \
		-I$(TOPDIR)/$(GROUP)/type \
		-I$(TOPDIR)/$(GROUP)/tools \
		-I$(TOPDIR)/$(GROUP)/tools/entropy \
		-I$(TOPDIR)/$(GROUP)/tools/sadct \
		-I$(TOPDIR)/$(GROUP)/vtc \
		-I$(TOPDIR)/$(GROUP)/vtc/include \
		-I$(TOPDIR)/$(GROUP)/vtc/main \
		-I$(TOPDIR)/$(GROUP)/vtc/pezw \
		-I$(TOPDIR)/$(GROUP)/vtc/wavelet \
		-I$(TOPDIR)/$(GROUP)/vtc/zte \
		-I$(TOPDIR)/$(GROUP)/vtc/ztq \
		-I$(TOPDIR)/$(GROUP)/vtc/shape \
		-L$(OBJDIR)


.KEEP_STATE:

########## Targets #########################################

$(GROUP): $(OBJECTS)
	@echo Done making $(GROUP) objects

all:	$(OBJECTS) $(PROGRAMS)
	@echo Done making $(GROUP) objects and programs

# -------- encoder ---------------------------------------------

vm_enc: $(OBJECTS) $(OBJDIR)/encoder.o
	@echo $(CCC) $(CFLAGS) $(INC) -o $(BINDIR)/vm_enc $(APPENCDIR)/encoder.cpp $(LIBS)
	@$(CCC) $(CFLAGS) $(INC) -o $(BINDIR)/vm_enc $(APPENCDIR)/encoder.cpp $(LIBS)
	@echo Done making vm_enc

# -------- decoder ---------------------------------------------

vm_dec: $(OBJECTS) $(OBJDIR)/decoder.o
	@echo $(CCC) $(CFLAGS) $(INC) -o $(BINDIR)/vm_dec $(APPDECDIR)/decoder.cpp $(LIBS)
	@$(CCC) $(CFLAGS) $(INC) -o $(BINDIR)/vm_dec $(APPDECDIR)/decoder.cpp $(LIBS)
	@echo Done making vm_dec

# -------- convertpar ------------------------------------------

convertpar: $(OBJDIR)/convertpar.o
	@echo $(CCC) $(CFLAGS) $(INC) -o $(BINDIR)/convertpar $(APPCONVDIR)/convertpar.cpp $(LIBS)
	@$(CCC) $(CFLAGS) $(INC) -o $(BINDIR)/convertpar $(APPCONVDIR)/convertpar.cpp $(LIBS)
	@echo Done making convertpar

# -------- necessary Objects --------------------------
# -------- with generic rules -------------------------

#$(OBJDIR)/%.o: $(APPDIR)/%.cpp
#	$(CCC) $(CFLAGS)  -c $< -o $@

$(OBJDIR)/%.o: $(APPENCDIR)/%.cpp
	$(CCC) $(CFLAGS)  -c $< -o $@

$(OBJDIR)/%.o: $(APPDECDIR)/%.cpp
	$(CCC) $(CFLAGS)  -c $< -o $@

$(OBJDIR)/%.o: $(APPCONVDIR)/%.cpp
	$(CCC) $(CFLAGS)  -c $< -o $@

$(OBJDIR)/%.o: $(SYSDIR)/%.cpp
	$(CCC) $(CFLAGS)  -c $< -o $@
	ar rcv $(OBJDIR)/libobj.a $@

$(OBJDIR)/%.o: $(SYSENCDIR)/%.cpp
	$(CCC) $(CFLAGS)  -c $< -o $@
	ar rcv $(OBJDIR)/libobj.a $@

$(OBJDIR)/%.o: $(SYSDECDIR)/%.cpp
	$(CCC) $(CFLAGS)  -c $< -o $@
	ar rcv $(OBJDIR)/libobj.a $@

$(OBJDIR)/%.o: $(TOOLSDIR)/%.cpp
	$(CCC) $(CFLAGS)  -c $< -o $@
	ar rcv $(OBJDIR)/libobj.a $@

$(OBJDIR)/%.o: $(TOOLSENTDIR)/%.cpp
	$(CCC) $(CFLAGS)  -c $< -o $@
	ar rcv $(OBJDIR)/libobj.a $@

$(OBJDIR)/%.o: $(TOOLSSADIR)/%.cpp
	$(CCC) $(CFLAGS)  -c $< -o $@
	ar rcv $(OBJDIR)/libobj.a $@

$(OBJDIR)/%.o: $(TYPEDIR)/%.cpp
	$(CCC) $(CFLAGS)  -c $< -o $@
	ar rcv $(OBJDIR)/libobj.a $@

$(OBJDIR)/%.o: $(VTCMAINDIR)/%.cpp
	$(CCC) $(CFLAGS)  -c $< -o $@
	ar rcv $(OBJDIR)/libobj.a $@

$(OBJDIR)/%.o: $(VTCPEZWDIR)/%.cpp
	$(CCC) $(CFLAGS)  -c $< -o $@
	ar rcv $(OBJDIR)/libobj.a $@

$(OBJDIR)/%.o: $(VTCWAVLTDIR)/%.cpp
	$(CCC) $(CFLAGS)  -c $< -o $@
	ar rcv $(OBJDIR)/libobj.a $@

$(OBJDIR)/%.o: $(VTCZTEDIR)/%.cpp
	$(CCC) $(CFLAGS)  -c $< -o $@
	ar rcv $(OBJDIR)/libobj.a $@

$(OBJDIR)/%.o: $(VTCZTQDIR)/%.cpp
	$(CCC) $(CFLAGS)  -c $< -o $@
	ar rcv $(OBJDIR)/libobj.a $@

$(OBJDIR)/%.o: $(VTCSHAPEDIR)/%.cpp
	$(CCC) $(CFLAGS)  -c $< -o $@
	ar rcv $(OBJDIR)/libobj.a $@

# =========================================================================
# ----- and now install... ------------------------------------

install:	$(PROGRAMS)
	$(INSTALL) $(SRCDIR)/vm_enc $(BINDIR)
	$(INSTALL) $(SRCDIR)/vm_dec $(BINDIR)
	$(INSTALL) $(SRCDIR)/convertpar $(BINDIR)
	@echo Installed $(PROGRAMS) in $(BINDIR)

# ----- ... and deinstall if you are unsatisfied --------------

deinstall:	
	$(RM) $(BINDIR)/vm_enc
	$(RM) $(BINDIR)/vm_dec
	$(RM) $(BINDIR)/convertpar
	@echo Removed $(PROGRAMS) from $(BINDIR)

# ----- clean the obj-Subdiir ---------------------------------

clean:
	$(RM) core $(PROGRAMS) $(OBJECTS) $(OBJDIR)/*.o @echo Done cleaning ... 
