##
 # Makefile
 # Copyright (C) 2010 - 2018 Peter Belkner <pbelkner@snafu.de>
 # 
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
 # the Free Software Foundation, either version 3 of the License, or
 # (at your option) any later version.
 # 
 # This program is distributed in the hope that it will be useful,
 # but WITHOUT ANY WARRANTY; without even the implied warranty of
 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 # GNU General Public License for more details.
 # 
 # You should have received a copy of the GNU General Public License
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 ##
include config.mak
include $(SRCDIR)/libdlgitemurl/source.mak
include $(SRCDIR)/libffsox/source.mak
include $(SRCDIR)/lib1770/source.mak
include $(SRCDIR)/libpb/source.mak
include $(SRCDIR)/in_ffsox/source.mak
include $(SRCDIR)/in_ffsox/version.mak

###############################################################################
.PHONY: all install release

###############################################################################
SFURL=http://sourceforge.net/projects/$1/files/$2/download

define DOWNLOAD
  mkdir -p $(@D)
  wget -O $@ $1
	touch $@
endef

###############################################################################
MODES+=full
MODES+=tiny

### IN_FFSOX_TARGETS ##########################################################
IN_FFSOX=in_ffsox
#
IN_FFSOX_TARGETS_full+=$(PFX)/full/build/$(IN_FFSOX)/in_ffsox.dll
#
IN_FFSOX_TARGETS_tiny+=$(subst full,tiny,$(IN_FFSOX_TARGETS_full))

### DLGITEMURL_TARGETS ########################################################
DLGITEMURL=libdlgitemurl
#
DLGITEMURL_TARGETS+=$(PFX)/bin/libdlgitemurl.dll
DLGITEMURL_TARGETS+=$(PFX)/include/dlgitemurl.h
DLGITEMURL_TARGETS+=$(PFX)/lib/libdlgitemurl.def
#
DLGITEMURL_DELAYLOAD_PFX=$(PFX)/bin/delayload/libdlgitemurl
DLGITEMURL_DELAYLOAD+=$(DLGITEMURL_DELAYLOAD_PFX).dll.a

###############################################################################
### LIBFFSOX_TARGETS
LIBFFSOX_TARGETS_full+=$(PFX)/full/lib/libffsox.a
LIBFFSOX_TARGETS_full+=$(PFX)/full/include/ffsox.h
LIBFFSOX_TARGETS_full+=$(PFX)/full/include/ffsox_rep.h
LIBFFSOX_TARGETS_full+=$(PFX)/full/include/ffsox_sym.h
#
LIBFFSOX_TARGETS_tiny+=$(subst full,tiny,$(LIBFFSOX_TARGETS_full))

### LIB1770_TARGETS
LIB1770_TARGETS+=$(PFX)/lib/lib1770.a
LIB1770_TARGETS+=$(PFX)/include/bs1770.h

### LIBPB_TARGETS
LIBPB_TARGETS+=$(PFX)/lib/libpb.a
LIBPB_TARGETS+=$(PFX)/include/pb.h

### FFMPEG_TARGETS
FFMPEG_DLL_NAMES+=avutil-$(AVUTIL_VER)
FFMPEG_DLL_NAMES+=swresample-$(SWRESAMPLE_VER)
FFMPEG_DLL_NAMES+=swscale-$(SWSCALE_VER)
FFMPEG_DLL_NAMES+=postproc-$(POSTPROC_VER)
FFMPEG_DLL_NAMES+=avcodec-$(AVCODEC_VER)
FFMPEG_DLL_NAMES+=avformat-$(AVFORMAT_VER)
FFMPEG_DLL_NAMES+=avfilter-$(AVFILTER_VER)
#
FFMPEG_TARGETS_full+=$(PFX)/full/bin
FFMPEG_TARGETS_full+=$(PFX)/full/include/libswresample/swresample.h
FFMPEG_TARGETS_full+=$(PFX)/full/include/libswscale/swscale.h
FFMPEG_TARGETS_full+=$(PFX)/full/include/libpostproc/postprocess.h
FFMPEG_TARGETS_full+=$(PFX)/full/include/libavcodec/avcodec.h
FFMPEG_TARGETS_full+=$(PFX)/full/include/libavformat/avformat.h
FFMPEG_TARGETS_full+=$(PFX)/full/include/libavfilter/avfilter.h
FFMPEG_TARGETS_full+=$(patsubst %,$(PFX)/full/lib/%.def,$(FFMPEG_DLL_NAMES))
FFMPEG_TARGETS_full+=$(patsubst %,$(PFX)/full/bin/%.dll,$(FFMPEG_DLL_NAMES))
#
FFMPEG_TARGETS_tiny=$(subst full,tiny,$(FFMPEG_TARGETS_full))
#
FFMPEG_DELAYLOAD_full+=$(patsubst %,$(PFX)/full/bin/delayload/lib%.dll.a,\
		$(FFMPEG_DLL_NAMES))
#
FFMPEG_DELAYLOAD_tiny=$(subst full,tiny,$(FFMPEG_DELAYLOAD_full))

### OPUS_TARGETS
OPUS_TARGETS+=$(PFX)/lib/libopus.a
OPUS_TARGETS+=$(PFX)/include/opus/opus.h
OPUS_TARGETS+=$(PFX)/include/opus/opus_defines.h
OPUS_TARGETS+=$(PFX)/include/opus/opus_types.h
OPUS_TARGETS+=$(PFX)/include/opus/opus_multistream.h

### SOX_TARGETS
SOX_DLL=libsox-$(LIBSOX_VER).dll
#
SOX_TARGETS+=$(PFX)/lib/libsox.a
SOX_TARGETS+=$(PFX)/include/sox.h
# SOX_TARGETS will be further extended in the SOX section below. Here we need
# just SOX_DELAYLOAD anyway.
#
SOX_DELAYLOAD+=$(PFX)/bin/delayload/$(SOX_DLL)
SOX_DELAYLOAD+=$(PFX)/bin/delayload/$(SOX_DLL).a

###############################################################################
### MAIN TARGETS ##############################################################
### all
$(foreach mode,$(MODES),$(eval all: $(IN_FFSOX_TARGETS_$(mode))))

ifneq (,$(filter full,$(MODES))) # [
### install
install: install_plugin
install: install_dlgitemurl
install: install_sox
$(foreach name,$(FFMPEG_DLL_NAMES),$(eval install: install_$(name)))
#
.PHONY: install_plugin
install_plugin: $(PFX)/full/build/in_ffsox/in_ffsox.dll
	mkdir -p '$(WINAMP)/Plugins'
	cp -p $< '$(WINAMP)/Plugins'
.PHONY: install_dlgitemurl
install_dlgitemurl: $(PFX)/bin/libdlgitemurl.dll
	mkdir -p '$(WINAMP)/Plugins/in_ffsox'
	cp -p $< '$(WINAMP)/Plugins/in_ffsox'
.PHONY: install_sox
install_sox: $(PFX)/bin/delayload/$(SOX_DLL)
	mkdir -p '$(WINAMP)/Plugins/in_ffsox'
	cp -p $< '$(WINAMP)/Plugins/in_ffsox'
#
define INSTALL_FFMPEG_DLL
.PHONY: install_$(1)
install_$(1): $(PFX)/full/bin/$(1).dll
	mkdir -p '$(WINAMP)/Plugins/in_ffsox'
	cp -p $$< '$(WINAMP)/Plugins/in_ffsox'
endef
#
$(foreach name,$(FFMPEG_DLL_NAMES),$(eval $(call INSTALL_FFMPEG_DLL,$(name))))
endif # ]

ifneq (,$(filter tiny,$(MODES))) # [
.PHONY: release upload

### release
RELNAME:=$(APP)-$(VERSION)
RELPFX:=$(RELDIR)/$(RELNAME)/$(RELNAME)
RELBUILDDIR:=$(PFX)/tiny/build/in_ffsox

### upload
TOOLS=src-foreign
#RSYNC_SOURCE=./$(RELNAME)
RSYNC_SOURCE=./
#RSYNC_REMOTE_PATH=/home/frs/project/in-ffsox/$(APP)
RSYNC_REMOTE_PATH=/home/frs/project/in-ffsox/$(APP)/$(VERSION)
RSYNC_TARGET=pbelkner@frs.sourceforge.net:$(RSYNC_REMOTE_PATH)
upload: release
#	touch -r $(RELPFX)-$(TOOLS).tar.gz -F 1 $(RELPFX)-src.tar.gz
#	touch -r $(RELPFX)-src.tar.gz -F 1 $(RELPFX).dll.7z
#	touch -r $(RELPFX).dll.7z -F 1 $(RELPFX).exe
	cd $(RELDIR)/$(RELNAME) && rsync -avPe ssh $(RSYNC_SOURCE) $(RSYNC_TARGET)

### BIN NSIS ###################
MAKENSIS=$(NSIS)/makensis.exe
BINRELDEPS+=$(PFX)/tiny/build/in_ffsox/in_ffsox.dll
BINRELDEPS+=$(patsubst %,$(RELBUILDDIR)/in_ffsox/%.dll,$(FFMPEG_DLL_NAMES))
BINRELDEPS+=$(patsubst %,$(RELBUILDDIR)/in_ffsox/%,$(SOX_DLL))
BINRELDEPS+=$(RELBUILDDIR)/in_ffsox/libdlgitemurl.dll
BINRELDEPS+=$(RELBUILDDIR)/in_ffsox/COPYING

################################
# We provide for that the constituents of the release are created in the
# right order with timestamps separated by one second.
#
### README #####################
release: $(RELDIR)/$(RELNAME)/README
README_FILT+=-e 's,@@RELNAME@@,$(RELNAME),g'
README_FILT+=-e 's,@@AVCODEC_VER@@,$(AVCODEC_VER),g'
README_FILT+=-e 's,@@AVFORMAT_VER@@,$(AVFORMAT_VER),g'
$(RELDIR)/$(RELNAME)/README: $(SRCDIR)/README
	mkdir -p $(@D)
	sed $(README_FILT) $< >$@

### TOOLS ######################
release: $(RELPFX)-$(TOOLS).tar.gz
$(RELPFX)-$(TOOLS).tar.gz: $(SRCDIR)/README
$(RELPFX)-$(TOOLS).tar.gz: #FORCE
	rm -f $@
	mkdir -p $(@D)
	sleep 1
	cd $(TOOLDIR) && tar cfvz $@ ./* --transform 's,^\.,$(RELNAME)/tools,g'

### SRC ########################
release: $(RELPFX)-src.tar.gz
$(RELPFX)-src.tar.gz: $(RELPFX)-$(TOOLS).tar.gz
	rm -f $@
	mkdir -p $(@D)
	sleep 1
	cd $(SRCDIR) && tar cfvz $@ ./*  --transform 's,^\.,$(RELNAME),g'

### BIN dll.7z #################
release: $(RELPFX).dll.7z
$(RELPFX).dll.7z: $(RELPFX)-src.tar.gz
$(RELPFX).dll.7z: $(RELBUILDDIR)/in_ffsox.dll
	rm -f $@
	mkdir -p $(@D)
	sleep 1
	cd $(<D) && 7za a $@ $(subst $(<D)/,,$^)

### INSTALLER ##################
release: $(RELPFX).exe
$(RELPFX).exe: $(RELPFX).dll.7z
$(RELPFX).exe: $(BINRELDEPS)
$(RELPFX).exe: $(RELBUILDDIR)/$(RELNAME).nsi
	rm -f $@
	mkdir -p $(@D)
	sleep 1
	cd $(<D) && '$(MAKENSIS)' $(<F)
#
relpfx_nsis1=$(shell cygpath -m $(RELPFX))
relpfx_nsis2=$(patsubst %.exe,%,$(relpfx_nsis1))
NSI_FILT+=-e 's,@@VERSION@@,$(VERSION),g'
#NSI_FILT+=-e 's,@@RELPFX@@,$(shell $(PFX)/bin/p2w $(RELPFX) 2),g'
NSI_FILT+=-e 's,@@RELPFX@@,$(relpfx_nsis2),g'
$(RELBUILDDIR)/in_ffsox.nsi: $(BINRELDEPS)
$(RELBUILDDIR)/in_ffsox.nsi: $(PFX)/bin/p2w
$(RELBUILDDIR)/$(RELNAME).nsi: $(SRCDIR)/in_ffsox.nsi
	sed $(NSI_FILT) $< >$@

#RELPFX7Z)=X
ifneq (,$(RELPFX7Z)) # [
### BIN 7z #####################
release: $(RELPFX).7z
$(RELPFX).7z: $(BINRELDEPS)
	rm -f $@
	mkdir -p $(@D)
	cd $(<D) && 7za a $@ $(subst $(<D)/,,$^)
endif # ]

### P2W ########################
$(PFX)/bin/p2w: $(SRCDIR)/p2w.c
	mkdir -p $(@D)
	gcc -o $@ $<

################################
$(RELBUILDDIR)/in_ffsox/$(SOX_DLL): $(PFX)/bin/delayload/$(SOX_DLL)
	mkdir -p $(@D)
	cp -p $< $(@D)
$(RELBUILDDIR)/in_ffsox/%.dll: $(PFX)/tiny/bin/%.dll
	mkdir -p $(@D)
	cp -p $< $(@D)
$(RELBUILDDIR)/in_ffsox/%.dll: $(PFX)/bin/%.dll
	mkdir -p $(@D)
	cp -p $< $(@D)
$(RELBUILDDIR)/in_ffsox/%: $(SRCDIR)/%
	mkdir -p $(@D)
	cp -p $< $(@D)
endif # ]

### IN_FFSOX ##################################################################
IN_FFSOX_DEPS_SRCS=$(patsubst %,$(SRCDIR)/in_ffsox/%,$(IN_FFSOX_SRCS))
#
IN_FFSOX_DEPS_full+=$(LIBFFSOX_TARGETS_full)
IN_FFSOX_DEPS_full+=$(LIB1770_TARGETS)
IN_FFSOX_DEPS_full+=$(LIBPB_TARGETS)
IN_FFSOX_DEPS_full+=$(DLGITEMURL_DELAYLOAD)
IN_FFSOX_DEPS_full+=$(SOX_DELAYLOAD)
IN_FFSOX_DEPS_full+=$(SRCDIR)/in_ffsox/version.mak
IN_FFSOX_DEPS_full+=$(SRCDIR)/in_ffsox/source.mak
#
IN_FFSOX_DEPS_tiny+=$(subst full,tiny,$(IN_FFSOX_DEPS_full))
#
IN_FFSOX_OPTS_full+='--bindir=$(BINDIR)'
IN_FFSOX_OPTS_full+='--msvc=$(MSVC)'
IN_FFSOX_OPTS_full+='--mssdk=$(MSSDK)'
IN_FFSOX_OPTS_full+='--wasdk=$(WASDK)'
IN_FFSOX_OPTS_full+='--ffmpeg-src=$(PFX)/unpack/ffmpeg'
IN_FFSOX_OPTS_full+='--ffmpeg-build=$(PFX)/full/build/ffmpeg'
IN_FFSOX_OPTS_full+='LIBFFSOX=$(PFX)/full'
IN_FFSOX_OPTS_full+='LIBPB=$(PFX)'
IN_FFSOX_OPTS_full+='CPPFLAGS=-I$(PFX)/full/include -I$(PFX)/include'
IN_FFSOX_OPTS_full+='LDFLAGS=-L$(PFX)/full/lib -L$(PFX)/lib'
#
IN_FFSOX_OPTS_tiny+=$(subst full,tiny,$(IN_FFSOX_OPTS_full))
#
define IN_FFSOX_BUILD # [
$(IN_FFSOX_TARGETS_$(1)): $(IN_FFSOX_DEPS_SRCS)
$(IN_FFSOX_TARGETS_$(1)): $(PFX)/$(1)/build/$(IN_FFSOX)/Makefile
	cd $$(<D) && $(MAKE)
	touch -r $$< $$@
$(PFX)/$(1)/build/$(IN_FFSOX)/Makefile: $(IN_FFSOX_DEPS_$(1))
$(PFX)/$(1)/build/$(IN_FFSOX)/Makefile: $(SRCDIR)/in_ffsox/configure
$(PFX)/$(1)/build/$(IN_FFSOX)/Makefile: $(SRCDIR)/in_ffsox/Makefile
$(PFX)/$(1)/build/$(IN_FFSOX)/Makefile: OPTS=$(IN_FFSOX_OPTS_$(1))
endef # ]
#
$(foreach mode,$(MODES),$(eval $(call IN_FFSOX_BUILD,$(mode))))

### LIBFFSOX ##################################################################
LIBFFSOX=libffsox
#
LIBFFSOX_DEPS_SRCS=$(patsubst %,$(SRCDIR)/libffsox/%,$(LIBFFSOX_SRCS))
#
LIBFFSOX_DEPS_full+=$(DLGITEMURL_TARGETS)
LIBFFSOX_DEPS_full+=$(LIB1770_TARGETS)
LIBFFSOX_DEPS_full+=$(LIBPB_TARGETS)
LIBFFSOX_DEPS_full+=$(FFMPEG_DELAYLOAD_full)
LIBFFSOX_DEPS_full+=$(SOX_DELAYLOAD)
#
LIBFFSOX_DEPS_tiny+=$(subst full,tiny,$(LIBFFSOX_DEPS_full))
#
LIBFFSOX_OPTS_full+=--prefix=$(PFX)/full
LIBFFSOX_OPTS_full+=--libpb=$(PFX)
LIBFFSOX_OPTS_full+=--lib1770=$(PFX)
LIBFFSOX_OPTS_full+=--disable-magick
LIBFFSOX_OPTS_full+=--disable-lame
LIBFFSOX_OPTS_full+=--disable-replaygain
#
LIBFFSOX_OPTS_tiny+=$(subst full,tiny,$(LIBFFSOX_OPTS_full))

define LIBFFSOX_BUILD # [
$(LIBFFSOX_TARGETS_$(1)): $(LIBFFSOX_DEPS_SRCS)
$(LIBFFSOX_TARGETS_$(1)): $(PFX)/$(1)/build/$(LIBFFSOX)/Makefile
	cd $$(<D) && $(MAKE) && $(MAKE) install
	touch -r $$< $$@
$(PFX)/$(1)/build/$(LIBFFSOX)/Makefile: $(LIBFFSOX_DEPS_$(1))
$(PFX)/$(1)/build/$(LIBFFSOX)/Makefile: $(SRCDIR)/$(LIBFFSOX)/Makefile
$(PFX)/$(1)/build/$(LIBFFSOX)/Makefile: $(SRCDIR)/$(LIBFFSOX)/configure
$(PFX)/$(1)/build/$(LIBFFSOX)/Makefile: OPTS=$(LIBFFSOX_OPTS_$(1))
endef # ]

$(foreach mode,$(MODES),$(eval $(call LIBFFSOX_BUILD,$(mode))))

###############################################################################
DLGITEMURL_DEPS:=
#
DLGITEMURL_OPTS:=--prefix=$(PFX)

$(DLGITEMURL_DELAYLOAD_PFX).dll.a: $(DLGITEMURL_DELAYLOAD_PFX).def
	dlltool -d $< --output-delaylib $@
$(DLGITEMURL_DELAYLOAD_PFX).def: $(PFX)/lib/libdlgitemurl.def
	mkdir -p $(@D)
	echo LIBRARY "libdlgitemurl.dll" > $@
	cat $< >> $@
$(DLGITEMURL_TARGETS): $(patsubst %,$(SRCDIR)/$(DLGITEMURL)/%,\
		$(DLGITEMURL_SRCS))
$(DLGITEMURL_TARGETS): $(PFX)/build/$(DLGITEMURL)/Makefile
	cd $(<D) && $(MAKE) && $(MAKE) install
	touch -r $< $@
$(PFX)/build/$(DLGITEMURL)/Makefile: $(SRCDIR)/$(DLGITEMURL)/Makefile
$(PFX)/build/$(DLGITEMURL)/Makefile: $(SRCDIR)/$(DLGITEMURL)/configure
$(PFX)/build/$(DLGITEMURL)/Makefile: OPTS=$(DLGITEMURL_OPTS)

### LIB1770 ###################################################################
LIB1770=lib1770
LIB1770_DEPS+=$(SRCDIR)/lib1770/source.mak
LIB1770_DEPS+=$(LIBPB_TARGETS)
LIB1770_OPTS+=--prefix=$(PWD)

$(LIB1770_TARGETS): $(patsubst %,$(SRCDIR)/$(LIB1770)/%,$(LIB1770_SRCS))
$(LIB1770_TARGETS): $(PFX)/build/$(LIB1770)/Makefile
	cd $(<D) && $(MAKE) && $(MAKE) install
	touch -r $< $@
$(PFX)/build/$(LIB1770)/Makefile: $(LIB1770_DEPS)
$(PFX)/build/$(LIB1770)/Makefile: $(SRCDIR)/$(LIB1770)/Makefile
$(PFX)/build/$(LIB1770)/configure: $(SRCDIR)/$(LIB1770)/configure
$(PFX)/build/$(LIB1770)/Makefile: OPTS=$(LIB1770_OPTS)

### LIBPB #####################################################################
LIBPB=libpb
LIBPB_DEPS+=$(SRCDIR)/$(LIBPB)/source.mak
LIBPB_OPTS+=--prefix=$(PWD)

$(LIBPB_TARGETS): $(patsubst %,$(SRCDIR)/$(LIBPB)/%,$(LIBPB_SRCS))
$(LIBPB_TARGETS): $(PFX)/build/$(LIBPB)/Makefile
	cd $(<D) && $(MAKE) && $(MAKE) install
	touch -r $< $@
$(PFX)/build/$(LIBPB)/Makefile: $(LIBPB_DEPS)
$(PFX)/build/$(LIBPB)/Makefile: $(SRCDIR)/$(LIBPB)/Makefile
$(PFX)/build/$(LIBPB)/Makefile: $(SRCDIR)/$(LIBPB)/configure
$(PFX)/build/$(LIBPB)/Makefile: OPTS=$(LIBPB_OPTS)

### FFMPEG ####################################################################
FFMPEG=ffmpeg
FFMPEG_DEPS+=$(PFX)/lib/libpthread.a
FFMPEG_DEPS+=$(PFX)/lib/libiconv.a
FFMPEG_DEPS+=$(PFX)/lib/libbz2.a
FFMPEG_DEPS+=$(PFX)/lib/libz.a
FFMPEG_DEPS+=$(PFX)/lib/liblzma.a
FFMPEG_DEPS+=$(OPUS_TARGETS)

########
FFMPEG_OPTS_full+=--prefix=$(PFX)/full
FFMPEG_OPTS_full+='--extra-ldflags=-static-libgcc -L$(PFX)/lib'
FFMPEG_OPTS_full+=--enable-gpl
FFMPEG_OPTS_full+=--enable-version3
FFMPEG_OPTS_full+=--enable-shared
FFMPEG_OPTS_full+=--disable-doc
FFMPEG_OPTS_full+=--disable-w32threads
FFMPEG_OPTS_full+=--disable-os2threads
FFMPEG_OPTS_full+=--enable-libopus

########
FFMPEG_ENABLE_MP3_tiny=X
FFMPEG_ENABLE_AC3_tiny=X

########
FFMPEG_OPTS_tiny+=$(subst full,tiny,$(FFMPEG_OPTS_full))
FFMPEG_OPTS_tiny+=--disable-encoders
FFMPEG_OPTS_tiny+=--disable-decoders
FFMPEG_OPTS_tiny+=--disable-muxers
FFMPEG_OPTS_tiny+=--disable-demuxers
FFMPEG_OPTS_tiny+=--disable-hwaccels
FFMPEG_OPTS_tiny+=--disable-parsers
#FFMPEG_OPTS_tiny+=--disable-filter=elbg
#FFMPEG_OPTS_tiny+=--disable-parser=hevc
# ???
#FFMPEG_OPTS_tiny+=--enable-dct
FFMPEG_OPTS_tiny+=--disable-dxva2
# decoders
FFMPEG_OPTS_tiny+=--enable-decoder=pcm_s16le
FFMPEG_OPTS_tiny+=--enable-decoder=pcm_s24le
FFMPEG_OPTS_tiny+=--enable-decoder=pcm_dvd
FFMPEG_OPTS_tiny+=--enable-decoder=flac
FFMPEG_OPTS_tiny+=--enable-decoder=wavpack
FFMPEG_OPTS_tiny+=--enable-decoder=vorbis
FFMPEG_OPTS_tiny+=--enable-decoder=opus
FFMPEG_OPTS_tiny+=--enable-decoder=libopus
ifneq (,$(FFMPEG_ENABLE_MP3_tiny)) # [
FFMPEG_OPTS_tiny+=--enable-decoder=mp3
FFMPEG_OPTS_tiny+=--enable-decoder=mp3float
endif # ]
ifneq (,$(FFMPEG_ENABLE_AC3_tiny)) # [
FFMPEG_OPTS_tiny+=--enable-decoder=ac3
endif # ]
FFMPEG_OPTS_tiny+=--enable-decoder=vp3
FFMPEG_OPTS_tiny+=--enable-decoder=vp5
FFMPEG_OPTS_tiny+=--enable-decoder=vp6
FFMPEG_OPTS_tiny+=--enable-decoder=vp6a
FFMPEG_OPTS_tiny+=--enable-decoder=vp6f
FFMPEG_OPTS_tiny+=--enable-decoder=vp7
FFMPEG_OPTS_tiny+=--enable-decoder=vp8
FFMPEG_OPTS_tiny+=--enable-decoder=vp9
FFMPEG_OPTS_tiny+=--enable-decoder=theora
# demuxers
FFMPEG_OPTS_tiny+=--enable-demuxer=pcm_s16le
FFMPEG_OPTS_tiny+=--enable-demuxer=pcm_s24le
FFMPEG_OPTS_tiny+=--enable-demuxer=flac
FFMPEG_OPTS_tiny+=--enable-demuxer=wav
FFMPEG_OPTS_tiny+=--enable-demuxer=ogg
ifneq (,$(FFMPEG_ENABLE_MP3_tiny)) # [
FFMPEG_OPTS_tiny+=--enable-demuxer=mp3
endif # ]
ifneq (,$(FFMPEG_ENABLE_AC3_tiny)) # [
FFMPEG_OPTS_tiny+=--enable-demuxer=ac3
endif # ]
FFMPEG_OPTS_tiny+=--enable-demuxer=matroska
# parsers
FFMPEG_OPTS_tiny+=--enable-parser=png
FFMPEG_OPTS_tiny+=--enable-parser=vorbis
FFMPEG_OPTS_tiny+=--enable-parser=vp3
FFMPEG_OPTS_tiny+=--enable-parser=vp8
FFMPEG_OPTS_tiny+=--enable-parser=vp9

define FFMPEG_BUILD # [
.PRECIOUS: $(PFX)/$(1)/bin/delayload/%.dll.a
$(PFX)/$(1)/bin/delayload/lib%.dll.a: $(PFX)/$(1)/bin/delayload/%.def
	dlltool -d $$< --output-delaylib $$@
.PRECIOUS: $(PFX)/$(1)/bin/delayload/%.def
$(PFX)/$(1)/bin/delayload/%.def: $(PFX)/$(1)/lib/%.def
	mkdir -p $$(@D)
	echo "LIBRARY `basename $$< .def`.dll" > $$@
	cat $$< >> $$@
$(FFMPEG_TARGETS_$(1)): $(PFX)/$(1)/build/$(FFMPEG)/Makefile
	cd $$(<D) && $(MAKE) && $(MAKE) install
	touch -r $$< $$@
$(PFX)/$(1)/build/$(FFMPEG)/Makefile: $(FFMPEG_DEPS)
$(PFX)/$(1)/build/$(FFMPEG)/Makefile: OPTS=$(FFMPEG_OPTS_$(1))
endef # ]

$(foreach mode,$(MODES),$(eval $(call FFMPEG_BUILD,$(mode))))

$(TOOLDIR)/ffmpeg-snapshot.tar.bz2:
	$(call DOWNLOAD,http://ffmpeg.org/releases/$(@F))

###############################################################################
OPUS:=opus-1.2.1

OPUS_DEPS=

OPUS_OPTS+=--prefix=$(PWD)
OPUS_OPTS+=--disable-shared

$(OPUS_TARGETS): $(PFX)/build/$(OPUS)/Makefile
	cd $(<D) && $(MAKE) && $(MAKE) install
	touch -r $< $@
$(PFX)/build/$(OPUS)/Makefile: $(OPUS_DEPS)
$(PFX)/build/$(OPUS)/Makefile: OPTS=$(OPUS_OPTS)

$(TOOLDIR)/$(OPUS).tar.gz:
	$(call DOWNLOAD,http://downloads.xiph.org/releases/opus/$(@F))

### SOX #######################################################################
SOXVER:=14.4.2
SOX:=sox-$(SOXVER)
SOX_TARGETS+=$(PFX)/build/$(SOX)/src/.libs/$(SOX_DLL).def
SOX_TARGETS+=$(PFX)/build/$(SOX)/src/.libs/libsox.a
SOX_DEPS+=$(PFX)/lib/libpthread.a
SOX_DEPS+=$(PFX)/lib/libgomp.a

SOX_CFLAGS+=-static-libgcc
SOX_CFLAGS+=-shared
SOX_LDFLAGS+=-L$(PFX)/lib
SOX_LDLIBS+=-lgomp
SOX_LDLIBS+=-lpthread
SOX_LDLIBS+=-lwinmm

SOX_OPTS:=--prefix=$(PWD)
SOX_OPTS+=--without-ladspa
SOX_OPTS+=--without-png
SOX_OPTS+='LDFLAGS=-static-libgcc -L$(PWD)/lib'

$(PFX)/bin/delayload/$(SOX_DLL): $(PFX)/build/$(SOX)/src/.libs/libsox.a
$(PFX)/bin/delayload/$(SOX_DLL): $(PFX)/bin/delayload/$(SOX_DLL).def
	mkdir -p $(@D)
	gcc $(SOX_CFLAGS) -o $@ $^ $(SOX_LDFLAGS) $(SOX_LDLIBS)
$(PFX)/bin/delayload/$(SOX_DLL).a: $(PFX)/bin/delayload/$(SOX_DLL).def
	dlltool -d $< --output-delaylib $@
$(PFX)/bin/delayload/$(SOX_DLL).def: \
		$(PFX)/build/$(SOX)/src/.libs/$(SOX_DLL).def
	mkdir -p $(@D)
	echo "LIBRARY `basename $(@F) .def`" > $@
	cat $< >> $@
$(SOX_TARGETS): $(PFX)/build/$(SOX)/Makefile
	cd $(<D) && $(MAKE) && $(MAKE) install
	touch -r $< $@
$(PFX)/build/$(SOX)/Makefile: $(SOX_DEPS)
$(PFX)/build/$(SOX)/Makefile: OPTS=$(SOX_OPTS)

$(TOOLDIR)/$(SOX).tar.bz2:
	$(call DOWNLOAD,$(call SFURL,sox,sox/$(SOXVER)/$(@F)))

### CONFIGURE #################################################################
PFX_PATH:=$(PFX)/lib/pkgconfig
PFX_PATH_full:=$(PFX)/full/lib/pkgconfig:$(PFX_PATH)
PFX_PATH_tiny:=$(PFX)/tiny/lib/pkgconfig:$(PFX_PATH)

define CONFIGURE
  mkdir -p $(@D)
  export PKG_CONFIG_PATH=$1 && cd $(@D) && $< $(OPTS)
  touch $@
endef

.PRECIOUS: $(PFX)/build/%/Makefile
$(PFX)/build/%/Makefile: $(SRCDIR)/%/configure
	$(call CONFIGURE,$(PFX_PATH))
$(PFX)/full/build/%/Makefile: $(SRCDIR)/%/configure
	$(call CONFIGURE,$(PFX_PATH_full))
$(PFX)/tiny/build/%/Makefile: $(SRCDIR)/%/configure
	$(call CONFIGURE,$(PFX_PATH_tiny))
$(PFX)/build/%/Makefile: $(PFX)/unpack/%/configure
	$(call CONFIGURE,$(PFX_PATH))
$(PFX)/full/build/%/Makefile: $(PFX)/unpack/%/configure
	$(call CONFIGURE,$(PFX_PATH_full))
$(PFX)/tiny/build/%/Makefile: $(PFX)/unpack/%/configure
	$(call CONFIGURE,$(PFX_PATH_tiny))

### UNPACK ####################################################################
XFV=xfv
#XFV=xf

define UNPACK
  mkdir -p $(PFX)/unpack
  tar $(XFV)$1 $< -C $(PFX)/unpack
  if test -e $(SRCDIR)/patch/$*.patch; then \
    cd $(PFX)/unpack; \
    patch -p0 -i $(SRCDIR)/patch/$*.patch; \
  fi
  touch $@
endef

# $(1) - mode
define REMOVE_MODE
	ffmpeg=$(filter ffmpeg%,$*) && if [ 0 -lt $${#ffmpeg} ]; then \
		rm -rf $(PFX)/$(1)/bin/delayload/*; \
	fi
	if [ -e $(PFX)/$(1)/build/$*/Makefile ]; then \
		cd $(PFX)/$(1)/build/$*; \
		make uninstall; \
	fi
	rm -rf $(PFX)/$(1)/build/$*/*
endef

define REMOVE
	sox=$(filter sox%,$*) && if [ 0 -lt $${#sox} ]; then \
		rm -rf $(PFX)/bin/delayload/*; \
	fi
	if [ -e $(PFX)/build/$*/Makefile ]; then \
		cd $(PFX)/build/$*; \
		make uninstall; \
	fi
	rm -rf $(PFX)/build/$*/*
endef

.PRECIOUS: $(PFX)/unpack/%/configure
## FFMPEG
$(PFX)/unpack/%/configure: $(TOOLDIR)/%-snapshot.tar.bz2
	$(foreach mode,$(MODES),$(call REMOVE_MODE,$(mode)))
	rm -rf $(PFX)/$(1)/unpack/$*/*
	$(call UNPACK,j)
## OPUS
$(PFX)/unpack/%/configure: $(TOOLDIR)/%.tar.gz
	$(call REMOVE)
	rm -rf $(PFX)/unpack/$*/*
	$(call UNPACK,z)
## SOX
$(PFX)/unpack/%/configure: $(TOOLDIR)/%.tar.bz2
	$(call REMOVE)
	rm -rf $(PFX)/unpack/$*/*
	$(call UNPACK,j)

###############################################################################
.PRECIOUS: $(PFX)/lib/lib%.a
# We copy some static libraries local in order that during linking they will
# be found before their shared counterparts. In order to make this work we
# need to set up the linker's library search path accordingly.
$(PFX)/lib/lib%.a:
	mkdir -p $(@D)
	cp -p $(shell gcc -print-file-name=$(@F)) $(@D)
