# Ut Video Codec Suite  POSIX/MinGW Makefile
#
# Originally written by: Derek Buitenhuis <derek.buitenhuis AT gmail.com>
#
# Usage: make
#        make install prefix=/some/dir/here
#        make uninstall prefix=/some/dir/here

DESTDIR=

prefix=/usr/local
libdir=$(DESTDIR)$(prefix)/lib
includedir=$(DESTDIR)$(prefix)/include

CROSS_PREFIX=
CXX=$(CROSS_PREFIX)g++
AR=$(CROSS_PREFIX)ar
RANLIB=$(CROSS_PREFIX)ranlib

UTV_CORE_DIR=utv_core
UTV_LOGL_DIR=utv_logl

CXXFLAGS=-g -O2 -Wall -Wextra -Wno-multichar -Wno-unused-parameter -Wno-sign-compare

# on MinGW env, uncomment following lines and set proper value to WINSDK_ROOT.
#WINSDK_ROOT="/c/Program Files/Microsoft SDKs/Windows/v6.1"
#CPPFLAGS=-I/usr/include/w32api -I$(WINSDK_ROOT)/Include

# Pretty-ify Building
ifndef V
$(foreach VAR,CXX AR RANLIB,\
    $(eval override $(VAR) = @printf " %s\t%s\n" $(VAR) "$$@"; $($(VAR))))
endif

OBJ = $(UTV_CORE_DIR)/Codec.o \
      $(UTV_CORE_DIR)/CodecBase.o \
      $(UTV_CORE_DIR)/Convert.o \
      $(UTV_CORE_DIR)/DummyCodec.o \
      $(UTV_CORE_DIR)/FrameBuffer.o \
      $(UTV_CORE_DIR)/GlobalConfig.o \
      $(UTV_CORE_DIR)/HuffmanCode.o \
      $(UTV_CORE_DIR)/Log.o \
      $(UTV_CORE_DIR)/Predict.o \
      $(UTV_CORE_DIR)/Thread.o \
      $(UTV_CORE_DIR)/TunedFunc.o \
      $(UTV_CORE_DIR)/UL00Codec.o \
      $(UTV_CORE_DIR)/ULRACodec.o \
      $(UTV_CORE_DIR)/ULRGCodec.o \
      $(UTV_CORE_DIR)/ULYUV420Codec.o \
      $(UTV_CORE_DIR)/ULYUV422Codec.o \
      $(UTV_CORE_DIR)/ULYUV444Codec.o \
      $(UTV_CORE_DIR)/UQ00Codec.o \
      $(UTV_CORE_DIR)/UQRACodec.o \
      $(UTV_CORE_DIR)/UQRGCodec.o \
      $(UTV_CORE_DIR)/UQY2Codec.o \
      $(UTV_CORE_DIR)/utv_core.o \
      $(UTV_LOGL_DIR)/LogPath.o \
      $(UTV_LOGL_DIR)/LogReader.o \
      $(UTV_LOGL_DIR)/LogUtil.o \
      $(UTV_LOGL_DIR)/LogWriter.o

ifeq ($(ARCH),i386)
OBJ += $(UTV_CORE_DIR)/TunedFunc_x86x64.o \
	$(UTV_CORE_DIR)/TunedFunc_x86x64_avx1.o \
	$(UTV_CORE_DIR)/TunedFunc_x86x64_sse2.o \
	$(UTV_CORE_DIR)/TunedFunc_x86x64_sse41.o \
	$(UTV_CORE_DIR)/TunedFunc_x86x64_ssse3.o \
	$(UTV_CORE_DIR)/HuffmanCode_x86.o
endif
ifeq ($(ARCH),x86_64)
OBJ += $(UTV_CORE_DIR)/TunedFunc_x86x64.o \
	$(UTV_CORE_DIR)/TunedFunc_x86x64_avx1.o \
	$(UTV_CORE_DIR)/TunedFunc_x86x64_sse2.o \
	$(UTV_CORE_DIR)/TunedFunc_x86x64_sse41.o \
	$(UTV_CORE_DIR)/TunedFunc_x86x64_ssse3.o \
	$(UTV_CORE_DIR)/HuffmanCode_x64.o
endif

%.a:
	$(AR) rcu $@ $^
	$(RANLIB) $@

all: static-lib

$(UTV_CORE_DIR)/libutvideo.a: $(OBJ)

static-lib: $(UTV_CORE_DIR)/libutvideo.a

$(UTV_CORE_DIR)/TunedFunc_x86x64_sse2.o $(UTV_CORE_DIR)/TunedFunc_x86x64_sse2.lo: CXXFLAGS += -msse2
$(UTV_CORE_DIR)/TunedFunc_x86x64_ssse3.o $(UTV_CORE_DIR)/TunedFunc_x86x64_ssse3.lo: CXXFLAGS += -mssse3
$(UTV_CORE_DIR)/TunedFunc_x86x64_sse41.o $(UTV_CORE_DIR)/TunedFunc_x86x64_sse41.lo: CXXFLAGS += -msse4.1
$(UTV_CORE_DIR)/TunedFunc_x86x64_avx1.o $(UTV_CORE_DIR)/TunedFunc_x86x64_avx1.lo: CXXFLAGS += -mavx

clean:
	@printf " RM\t$(UTV_CORE_DIR)/*.o\n";
	@rm -f $(UTV_CORE_DIR)/*.o
	@printf " RM\t$(UTV_CORE_DIR)/libutvideo.a\n";
	@rm -f $(UTV_CORE_DIR)/libutvideo.a

install: all
	@mkdir -p $(libdir) # in case of custom install dir
	@printf " MKDIR\t\t$(includedir)/utvideo\n";
	@mkdir -p $(includedir)/utvideo
	@printf " INSTALL\t$(includedir)/utvideo/Codec.h\n";
	@cp -f $(UTV_CORE_DIR)/Codec.h $(includedir)/utvideo/Codec.h
	@printf " INSTALL\t$(includedir)/utvideo/utvideo.h\n";
	@cp -f $(UTV_CORE_DIR)/utvideo.h $(includedir)/utvideo/utvideo.h
	@printf " INSTALL\t$(includedir)/utvideo/version.h\n";
	@cp -f $(UTV_CORE_DIR)/version.h $(includedir)/utvideo/version.h
	@printf " INSTALL\t$(libdir)/libutvideo.a\n";
	@cp -f $(UTV_CORE_DIR)/libutvideo.a $(libdir)/libutvideo.a

uninstall:
	@printf " RM\t$(includedir)/utvideo/*.h\n";
	@rm -f $(includedir)/utvideo/*.h
	@printf " RMDIR\t$(includedir)/utvideo\n";
	@-rmdir $(includedir)/utvideo 2> /dev/null || \
	  if [ -d $(includedir)/utvideo ]; then \
	    printf " NOTE: Not removing $(includedir)/utvideo since it is not empty.\n"; \
	  fi
	@printf " RM\t$(libdir)/libutvideo.a\n";
	@rm -f $(libdir)/libutvideo.a

.PHONY: all static-lib clean install uninstall
