###############################
# vgmstream makefile
###############################

ifeq ($(VGMSTREAM_VERSION),)
  # for current dir (expanded later)
  VGMSTREAM_VERSION=`sh ./version-get.sh`
else
  VGMSTREAM_VERSION=$(VGMSTREAM_VERSION)
endif
DEF_CFLAGS += -DVGMSTREAM_VERSION_AUTO -DVGM_LOG_OUTPUT

VGM_X64=0

###############################################################################
### external defs
# currently aimed to WIN32 builds but vgmstream-cli should work for others (or use autotools instead)
export TARGET_OS = $(OS)

#for Win builds with vgmstream123
LIBAO_DLL_PATH = ../libao/bin

### tools
RMF = rm -f

ifeq ($(TARGET_OS),Windows_NT)
  SHELL = sh
  CC = gcc
  AR = ar
  STRIP = strip
  WINDRES = windres
  DLLTOOL = dlltool
  
  DLL_DIR = .
  export DLL_DIR
  ifneq ($(VGM_X64),0)
    DLLTOOL = dlltool -m i386:x86-64 --as-flags --64
    DLL_DIR = dll-x64
  endif

  # same thing, the above should be available
  #CC = i686-w64-mingw32-gcc
  #AR = i686-w64-mingw32-ar
  #STRIP = i686-w64-mingw32-strip
  #WINDRES = i686-w64-mingw32-windres
  #DLLTOOL = i686-w64-mingw32-dlltool

else
  SHELL = /bin/sh
  CC = gcc
  AR = ar
  STRIP = strip
  WINDRES =
  DLLTOOL =

  # (old crosscompile, not used anymore?)
  #CC = i586-mingw32msvc-gcc
  #AR = i586-mingw32msvc-ar
  #STRIP = i586-mingw32msvc-strip
  #WINDRES = i586-mingw32msvc-windres
  #DLLTOOL = i586-mingw32msvc-dlltool

endif
export RMF SHELL CC AR STRIP WINDRES DLLTOOL


###############################################################################
### build defs

DEF_CFLAGS += -ffast-math -O3 -Wall -Werror=format-security -Wvla -Wimplicit-function-declaration -Wignored-qualifiers -Wmissing-declarations

VGM_DEBUG_FLAGS = 0
ifeq ($(VGM_DEBUG_FLAGS),1)
  #DEF_CFLAGS += -O0
  DEF_CFLAGS += -g -DVGM_DEBUG_OUTPUT
  DEF_CFLAGS += -Wall
  DEF_CFLAGS += -Wextra
  DEF_CFLAGS += -Wno-sign-compare
  DEF_CFLAGS += -Wlogical-op
  #DEF_CFLAGS += -pedantic -Wconversion -std=gnu90
  #DEF_CFLAGS += -Wfloat-equal
  DEF_CFLAGS += -Wdisabled-optimization -Wunsafe-loop-optimizations -Wswitch-default
  DEF_CFLAGS +=  -Wcast-qual -Wpointer-arith
  DEF_CFLAGS += -Wcast-align=strict -Wduplicated-cond -Wjump-misses-init -Wnull-dereference
  DEF_CFLAGS += -Wold-style-definition -Wstrict-prototypes
  DEF_CFLAGS += -Wmultistatement-macros -Wstringop-truncation
  DEF_CFLAGS += -Wredundant-decls -Wmissing-include-dirs -Wmissing-declarations
  #DEF_CFLAGS += -Wshadow
  #DEF_CFLAGS += -Wstack-protector -fstack-protector
  STRIP = echo
endif

LIBS_CFLAGS=
LIBS_LDFLAGS=
LIBS_TARGET_EXT_LIBS=

### bit stuff
# TODO: some targets don't work with X64 (Winamp, etc), detect
#ifneq ($(VGM_X86),0)
#  DEF_CFLAGS += -m32
#endif
ifneq ($(VGM_X64),0)
  DEF_CFLAGS += -m64
endif

ifeq ($(TARGET_OS),Windows_NT)
  VGM_UNICODE = 1
  ifneq ($(VGM_UNICODE),0)
    # -DUNICODE/_UNICODE forces certain APIs to use UTF-16
    DEF_CFLAGS  += -DUNICODE -D_UNICODE -DVGM_STDIO_UNICODE -municode
  endif
endif

# config libs
VGM_G7221 = 1
ifneq ($(VGM_G7221),0)
  LIBS_CFLAGS  += -DVGM_USE_G7221
endif


### external libs
# (call "make VGM_xxx = 0/1" to override 0/1 defaults, as Make does)
ifeq ($(TARGET_OS),Windows_NT)

  # enabled by default on Windows
  VGM_VORBIS = 1
  ifneq ($(VGM_VORBIS),0)
    LIBS_CFLAGS  += -DVGM_USE_VORBIS
    LIBS_LDFLAGS += -lvorbis
    LIBS_TARGET_EXT_LIBS += libvorbis.dll.a
  endif

  VGM_MPEG = 1
  ifneq ($(VGM_MPEG),0)
    LIBS_CFLAGS  += -DVGM_USE_MPEG
    LIBS_LDFLAGS += -lmpg123-0
    LIBS_TARGET_EXT_LIBS += libmpg123-0.dll.a
  endif

  VGM_G719 = 1
  ifneq ($(VGM_G719),0)
    LIBS_CFLAGS  += -DVGM_USE_G719
    LIBS_LDFLAGS += -lg719_decode
    LIBS_TARGET_EXT_LIBS += libg719_decode.dll.a
  endif

  VGM_FFMPEG = 1
  ifneq ($(VGM_FFMPEG),0)
    LIBS_CFLAGS  += -DVGM_USE_FFMPEG -I../ext_includes/ffmpeg
    LIBS_LDFLAGS += -lavcodec-vgmstream-59 -lavformat-vgmstream-59 -lavutil-vgmstream-57 -lswresample-vgmstream-4
    LIBS_TARGET_EXT_LIBS += avcodec-vgmstream-59.dll.a avformat-vgmstream-59.dll.a avutil-vgmstream-57.dll.a swresample-vgmstream-4.dll.a
  endif

  VGM_ATRAC9 = 1
  ifneq ($(VGM_ATRAC9),0)
    LIBS_CFLAGS  += -DVGM_USE_ATRAC9
    LIBS_LDFLAGS += -latrac9
    LIBS_TARGET_EXT_LIBS += libatrac9.dll.a
  endif

  VGM_CELT = 1
  ifneq ($(VGM_CELT),0)
    LIBS_CFLAGS  += -DVGM_USE_CELT
    LIBS_LDFLAGS += -lcelt-0061 -lcelt-0110
    LIBS_TARGET_EXT_LIBS += libcelt-0061.dll.a libcelt-0110.dll.a
  endif

  VGM_SPEEX = 1
  ifneq ($(VGM_SPEEX),0)
    LIBS_CFLAGS  += -DVGM_USE_SPEEX
    LIBS_LDFLAGS += -lspeex-1
    LIBS_TARGET_EXT_LIBS += libspeex-1.dll.a
  endif

else

  # must install system libs and enable manually on Linux
  VGM_VORBIS = 0
  ifneq ($(VGM_VORBIS),0)
    LIBS_CFLAGS  += -DVGM_USE_VORBIS
    LIBS_LDFLAGS += -lvorbis -lvorbisfile
  endif

  VGM_MPEG = 0
  ifneq ($(VGM_MPEG),0)
    LIBS_CFLAGS  += -DVGM_USE_MPEG
    LIBS_LDFLAGS += -lmpg123
  endif

  VGM_G719 = 0
  ifneq ($(VGM_G719),0)
    LIBS_CFLAGS  += -DVGM_USE_G719
    LIBS_LDFLAGS += -lg719_decode
  endif

  VGM_FFMPEG = 0
  ifneq ($(VGM_FFMPEG),0)
    LIBS_CFLAGS  += -DVGM_USE_FFMPEG
    LIBS_LDFLAGS += -lavcodec -lavformat -lavutil -lswresample
  endif

  VGM_ATRAC9 = 0
  ifneq ($(VGM_ATRAC9),0)
    LIBS_CFLAGS  += -DVGM_USE_ATRAC9
    ifeq ($(VGM_ATRAC9),1)
      LIBS_LDFLAGS += -latrac9
    endif
    ifeq ($(VGM_ATRAC9),2)
      LIBS_LDFLAGS += -l:libatrac9.a
    endif
  endif

  VGM_CELT = 0
  ifneq ($(VGM_CELT),0)
    LIBS_CFLAGS  += -DVGM_USE_CELT
    ifeq ($(VGM_CELT),1)
      LIBS_LDFLAGS += -lcelt-0061 -lcelt-0110
    endif
    ifeq ($(VGM_CELT),2)
      LIBS_LDFLAGS += -l:libcelt-0061.a -l:libcelt-0110.a
    endif
  endif

  VGM_SPEEX = 0
  ifneq ($(VGM_SPEEX),0)
    LIBS_CFLAGS  += -DVGM_USE_SPEEX
    LIBS_LDFLAGS +=  -lspeex
  endif
endif

export DEF_CFLAGS LIBS_CFLAGS LIBS_LDFLAGS LIBS_TARGET_EXT_LIBS


###############################################################################
### internal defs
ifeq ($(TARGET_OS),Windows_NT)
  BIN_FILE = vgmstream-$(VGMSTREAM_VERSION)-win.zip
  ZIP_FILES  = COPYING
  ZIP_FILES += README.md
  ZIP_FILES += doc/USAGE.md
  ZIP_FILES += cli/vgmstream-cli.exe
  ZIP_FILES += winamp/in_vgmstream.dll
  ZIP_FILES += xmplay/xmp-vgmstream.dll
  ZIP_FILES += ext_libs/*.dll
  ZIP_FILES_AO  = cli/vgmstream123.exe
  ZIP_FILES_AO += $(LIBAO_DLL_PATH)/*.dll
else
  BIN_FILE = vgmstream-$(VGMSTREAM_VERSION)-bin.zip
  ZIP_FILES  = COPYING
  ZIP_FILES += README.md
  ZIP_FILES += doc/USAGE.md
  ZIP_FILES += cli/vgmstream-cli
  ZIP_FILES_AO  = cli/vgmstream123
endif

###############################################################################
### targets
buildrelease: clean bin

buildrelease-ex: clean bin-ex

buildfullrelease: clean sourceball bin

# make a tmp copy of git's index to avoid including dev stuff
sourceball:
	rm -rf vgmstream-$(VGMSTREAM_VERSION)
	git checkout-index -f -a --prefix=vgmstream-$(VGMSTREAM_VERSION)/
#	echo "#!/bin/sh" > vgmstream-$(VGMSTREAM_VERSION)/version-get.sh
#	echo "echo \"$(VGMSTREAM_VERSION)\"" >> vgmstream-$(VGMSTREAM_VERSION)/version-get.sh
	tar cvzf "bin/vgmstream-$(VGMSTREAM_VERSION)-src.tar.gz" vgmstream-$(VGMSTREAM_VERSION)/*
#	git archive --format zip --output bin/vgmstream-$(VGMSTREAM_VERSION)-src.zip master
	rm -rf vgmstream-$(VGMSTREAM_VERSION)

bin: vgmstream-cli winamp xmplay
	mkdir -p bin
	zip -FS -j "bin/$(BIN_FILE)" $(ZIP_FILES)

#separate since vgmstream123 is kinda untested
bin-ex: vgmstream-cli winamp xmplay vgmstream123
	mkdir -p bin
	zip -FS -j "bin/$(BIN_FILE)" $(ZIP_FILES) $(ZIP_FILES_AO)

vgmstream-cli: vgmstream_cli

vgmstream_cli: version
	$(MAKE) -C cli vgmstream_cli

vgmstream123: version
	$(MAKE) -C cli vgmstream123

api_example: version
	$(MAKE) -C cli api_example

winamp: version
	$(MAKE) -C winamp in_vgmstream

xmplay: version
	$(MAKE) -C xmplay xmp_vgmstream

version:
	sh version-make.sh

clean:
	$(RMF) vgmstream-*.zip
	$(MAKE) -C src clean
	$(MAKE) -C cli clean
	$(MAKE) -C winamp clean
	$(MAKE) -C xmplay clean
	$(MAKE) -C ext_libs clean

.PHONY: clean buildfullrelease buildrelease sourceball bin vgmstream-cli vgmstream_cli vgmstream123 api_example winamp xmplay version
