diff --git a/Makefile b/Makefile
index 0f838836..cb81a3a0 100644
--- a/Makefile
+++ b/Makefile
@@ -1,8 +1,55 @@
-.PHONY: buildfullrelease buildrelease mingw_test mingw_winamp mingw_xmplay sourceball mingwbin
+###############################
+# vgmstream makefile
+###############################
 
-buildfullrelease: clean sourceball mingwbin
+### defs
+# currently aimed to WIN32 builds but vgmstream_cli should work for others (or use autotools instead)
+export TARGET_OS = WIN32
 
-buildrelease: clean mingwbin
+
+### tools
+RMF = rm -f
+
+ifeq ($(TARGET_OS),WIN32)
+  SHELL = sh
+  CC = gcc
+  AR = ar
+  STRIP = strip
+  WINDRES = windres
+  DLLTOOL = dlltool
+
+  # 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
+
+
+### targets
+
+buildrelease: clean bin
+
+buildfullrelease: clean sourceball bin
 
 sourceball:
 	rm -rf vgmstream-`./version.sh`
@@ -13,23 +60,29 @@ sourceball:
 	tar cvzf "vgmstream-`./version.sh`.tar.gz" vgmstream-`./version.sh`/*
 	rm -rf vgmstream-`./version.sh`
 
-mingwbin: mingw_test mingw_winamp mingw_xmplay
+bin mingwbin: vgmstream_cli winamp xmplay
 	zip -FS -j "vgmstream-`./version.sh`-test.zip" COPYING README.md test/test.exe winamp/in_vgmstream.dll xmplay/xmp-vgmstream.dll ext_libs/*.dll
 
-mingw_test:
-	$(MAKE) -C test -f Makefile.mingw test.exe
+vgmstream_cli mingw_test:
+	$(MAKE) -C test vgmstream_cli
 
-mingw_winamp:
-	$(MAKE) -C winamp in_vgmstream.dll
+#vgmstream123:
+#	$(MAKE) -C test vgmstream123
 
-mingw_xmplay:
-	$(MAKE) -C xmplay xmp-vgmstream.dll
+winamp mingw_winamp:
+	$(MAKE) -C winamp in_vgmstream
+
+xmplay mingw_xmplay:
+	$(MAKE) -C xmplay xmp_vgmstream
 
 clean:
-	rm -f vgmstream-*.zip
+	$(RMF) vgmstream-*.zip
 	$(MAKE) -C src clean
 	$(MAKE) -C test clean
-	$(MAKE) -C test -f Makefile.mingw clean
 	$(MAKE) -C winamp clean
 	$(MAKE) -C xmplay clean
-	$(MAKE) -C ext_libs -f Makefile.mingw clean
+	$(MAKE) -C ext_libs clean
+
+.PHONY: clean buildfullrelease buildrelease sourceball bin vgmstream_cli winamp xmplay mingwbin mingw_test mingw_winamp mingw_xmplay
+
+#deprecated: buildfullrelease sourceball mingwbin mingw_test mingw_winamp mingw_xmplay
diff --git a/ext_libs/Makefile.mingw b/ext_libs/Makefile
similarity index 75%
rename from ext_libs/Makefile.mingw
rename to ext_libs/Makefile
index b6cbd08b..77fab35f 100644
--- a/ext_libs/Makefile.mingw
+++ b/ext_libs/Makefile
@@ -1,6 +1,12 @@
-export SHELL = /bin/sh
-#export DLLTOOL=i586-mingw32msvc-dlltool
-export DLLTOOL=i686-w64-mingw32-dlltool
+#
+# external libs
+#
+
+# needed?
+ifneq ($(TARGET_OS),WIN32)
+$(error option must be built with TARGET_OS = WIN32)
+endif
+
 
 libvorbis.a: libvorbis.def
 	$(DLLTOOL) -d libvorbis.def -l libvorbis.a
@@ -30,7 +36,9 @@ libswresample.a: swresample-vgmstream-3.dll swresample-vgmstream-3.def
 	$(DLLTOOL) -D swresample-vgmstream-3.dll -d swresample-vgmstream-3.def -l libswresample.a
 
 libatrac9.a: libatrac9.dll libatrac9.def
-	$(DLLTOOL) -D libatrac9.dll -d libatrac9.ef -l libatrac9.a
+	$(DLLTOOL) -d libatrac9.dll -d libatrac9.def -l libatrac9.a
 
 clean:
-	rm -f libvorbis.a libmpg123-0.a libg7221_decode.a libg719_decode.a libat3plusdecoder.a libavcodec.a libavformat.a libavutil.a libswresample.a libatrac9.a
+	$(RMF) libvorbis.a libmpg123-0.a libg7221_decode.a libg719_decode.a libat3plusdecoder.a libavcodec.a libavformat.a libavutil.a libswresample.a libatrac9.a
+
+.PHONY: clean
diff --git a/src/Makefile b/src/Makefile
index 3dda5b10..43a77db0 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -1,26 +1,38 @@
-# get all .c to find all possible .o
+#
+# main vgmstream code
+#
+
+# automatically get all possible .o by finding all .c
+OBJECTS =
+
 SRC_SRCS = $(wildcard *.c)
 SRC_OBJS = $(patsubst %.c,%.o,$(SRC_SRCS))
+OBJECTS += $(SRC_OBJS)
 
 CODING_SRCS = $(wildcard coding/*.c)
 CODING_OBJS = $(patsubst %.c,%.o,$(CODING_SRCS))
+OBJECTS += $(CODING_OBJS)
 
 LAYOUT_SRCS = $(wildcard layout/*.c)
 LAYOUT_OBJS = $(patsubst %.c,%.o,$(LAYOUT_SRCS))
+OBJECTS += $(LAYOUT_OBJS)
 
 META_SRCS = $(wildcard meta/*.c)
 META_OBJS = $(patsubst %.c,%.o,$(META_SRCS))
+OBJECTS += $(META_OBJS)
 
 EXT_LIBS_SRCS = $(wildcard ../ext_libs/*.c)
 EXT_LIBS_OBJS = $(patsubst %.c,%.o,$(EXT_LIBS_SRCS))
+OBJECTS += $(EXT_LIBS_OBJS)
 
-OBJECTS = $(SRC_OBJS) $(CODING_OBJS) $(LAYOUT_OBJS) $(META_OBJS) $(EXT_LIBS_OBJS)
 
 libvgmstream.a: $(OBJECTS)
 	$(AR) crs libvgmstream.a $(OBJECTS)
 
-vgmstream-deps:
-	$(CC) $(CFLAGS) -M -o vgmstream-deps
+#vgmstream-deps:
+#	$(CC) $(CFLAGS) -M -o vgmstream-deps
 
 clean:
-	rm -f $(OBJECTS) libvgmstream.a
+	$(RMF) $(OBJECTS) libvgmstream.a
+
+.PHONY: clean
diff --git a/test/Makefile b/test/Makefile
index 4fdce8f4..3435f2ac 100644
--- a/test/Makefile
+++ b/test/Makefile
@@ -1,20 +1,105 @@
-export SHELL = /bin/sh
-export CFLAGS=-Wall -O3 -I../ext_includes -DUSE_ALLOCA -DVGM_USE_MAIATRAC3PLUS
-# -DVGM_USE_G7221 -DVGM_USE_G719 
-export LDFLAGS=-L../src -L ../ext_libs -lvgmstream -lvorbis -lvorbisfile -lmpg123 -lat3plusdecoder -lpthread -lm
-#-lg719_decode -lg7221_decode -lsiren_decode
-export CC=gcc
-export AR=ar
-export STRIP=strip
+#
+# CLI tools
+#
 
-.PHONY: libvgmstream.a
 
-test.exe: libvgmstream.a
-	$(CC) $(CFLAGS) $(LDFLAGS) "-DVERSION=\"`../version.sh`\"" test.c $(LDFLAGS) -o vgmstream
-	$(STRIP) vgmstream
+### main defs
+
+ifeq ($(TARGET_OS),WIN32)
+  OUTPUT_CLI = test.exe
+else
+  OUTPUT_CLI = vgmstream-cli
+endif
+
+# ? -DUSE_ALLOCA -DWIN32
+CFLAGS += -Wall -O3 -DVAR_ARRAYS -I../ext_includes $(EXTRA_CFLAGS)
+LDFLAGS += -L../src -L../ext_libs -lm -lvgmstream $(EXTRA_LDFLAGS)
+TARGET_EXT_LIBS = 
+
+#ifdef VGM_DEBUG
+#  CFLAGS += -DVGM_DEBUG_OUTPUT -O0 -Werror=format-security -Wdeclaration-after-statement -Wvla
+#  CFLAGS += -Wold-style-definition -Woverflow -Wpointer-arith -Wstrict-prototypes -pedantic -std=gnu90 -fstack-protector -Wformat
+#endif
+
+
+### external libs
+ifeq ($(TARGET_OS),WIN32)
+
+VGM_ENABLE_VORBIS = 1
+ifeq ($(VGM_ENABLE_VORBIS),1)
+  #CFLAGS  += -DVGM_USE_VORBIS
+  LDFLAGS += -lvorbis
+  TARGET_EXT_LIBS += libvorbis.a
+else
+  CFLAGS  += -DVGM_DISABLE_VORBIS
+endif
+
+VGM_ENABLE_MPEG = 1
+ifeq ($(VGM_ENABLE_MPEG),1)
+  #CFLAGS  += -DVGM_USE_MPEG
+  LDFLAGS += -lmpg123-0
+  TARGET_EXT_LIBS += libmpg123-0.a
+else
+  CFLAGS  += -DVGM_DISABLE_MPEG
+endif
+
+VGM_ENABLE_G7221 = 1
+ifeq ($(VGM_ENABLE_G7221),1) 
+  CFLAGS  += -DVGM_USE_G7221
+  LDFLAGS += -lg7221_decode
+  TARGET_EXT_LIBS += libg7221_decode.a
+endif
+
+VGM_ENABLE_G719 = 1
+ifeq ($(VGM_ENABLE_G719),1) 
+  CFLAGS  += -DVGM_USE_G719
+  LDFLAGS += -lg719_decode
+  TARGET_EXT_LIBS += libg719_decode.a
+endif
+
+VGM_ENABLE_MAIATRAC3PLUS = 0
+ifeq ($(VGM_ENABLE_MAIATRAC3PLUS),1) 
+  CFLAGS  += -DVGM_USE_MAIATRAC3PLUS
+  LDFLAGS += -lat3plusdecoder
+  TARGET_EXT_LIBS += libat3plusdecoder.a
+endif
+
+VGM_ENABLE_FFMPEG = 1
+ifeq ($(VGM_ENABLE_FFMPEG),1)
+  CFLAGS  += -DVGM_USE_FFMPEG
+  LDFLAGS += -lavcodec -lavformat -lavutil -lswresample
+  TARGET_EXT_LIBS += libavcodec.a libavformat.a libavutil.a libswresample.a
+endif
+
+VGM_ENABLE_ATRAC9 = 1
+ifeq ($(VGM_ENABLE_ATRAC9),1) 
+  CFLAGS  += -DVGM_USE_ATRAC9
+  LDFLAGS += -latrac9
+  TARGET_EXT_LIBS += libatrac9.a
+endif
+
+endif #if WIN32
+
+export CFLAGS LDFLAGS
+
+
+### targets
+
+vgmstream_cli: libvgmstream.a $(TARGET_EXT_LIBS)
+	$(CC) $(CFLAGS) "-DVERSION=\"`../version.sh`\"" test.c $(LDFLAGS) -o $(OUTPUT_CLI)
+	$(STRIP) $(OUTPUT_CLI)
+
+#vgmstream123: libvgmstream.a $(TARGET_EXT_LIBS)
+#	$(CC) $(CFLAGS) "-DVERSION=\"`../version.sh`\"" test.c $(LDFLAGS) -lao -o $(OUTPUT_123)
+#	$(STRIP) $(OUTPUT_123)
 
 libvgmstream.a:
 	$(MAKE) -C ../src $@
 
+$(TARGET_EXT_LIBS):
+	$(MAKE) -C ../ext_libs $@
+
 clean:
-	rm -f test test.o
+	$(RMF) $(OUTPUT_CLI)
+
+.PHONY: clean vgmstream_cli libvgmstream.a $(TARGET_EXT_LIBS)
diff --git a/test/Makefile.mingw b/test/Makefile.mingw
deleted file mode 100644
index e5927da8..00000000
--- a/test/Makefile.mingw
+++ /dev/null
@@ -1,71 +0,0 @@
-# optional parts
-VGM_ENABLE_FFMPEG=1
-ifeq ($(VGM_ENABLE_FFMPEG),1)
-FFMPEG_CC=-DVGM_USE_FFMPEG
-FFMPEG_LD=-lavcodec -lavformat -lavutil -lswresample
-endif
-
-VGM_ENABLE_MAIATRAC3PLUS=0
-ifeq ($(VGM_ENABLE_MAIATRAC3PLUS),1) 
-MAT3P_CC=-DVGM_USE_MAIATRAC3PLUS
-MAT3P_LD=-lat3plusdecoder
-endif
-
-#MPEG_CC=-DVGM_USE_MPEG
-MPEG_LD=-lmpg123-0
-VGM_DISABLE_MPEG=0
-ifeq ($(VGM_DISABLE_MPEG),1)
-MPEG_CC=-DVGM_DISABLE_MPEG
-MPEG_LD=
-endif
-
-
-# config
-export SHELL = /bin/sh
-export CFLAGS=-Wall -O3 $(MPEG_CC) -DVGM_USE_G7221 -DVGM_USE_G719 $(MAT3P_CC) $(FFMPEG_CC) -DVAR_ARRAYS -I../ext_includes $(EXTRA_CFLAGS)
-export LDFLAGS=-L../src -L../ext_libs -lvgmstream -lvorbis $(MPEG_LD) -lg7221_decode -lg719_decode $(MAT3P_LD) $(FFMPEG_LD) -lm $(EXTRA_LDFLAGS)
-#export CC=i586-mingw32msvc-gcc
-#export AR=i586-mingw32msvc-ar
-#export STRIP=i586-mingw32msvc-strip
-export CC=i686-w64-mingw32-gcc
-export AR=i686-w64-mingw32-ar
-export STRIP=i686-w64-mingw32-strip
-
-.PHONY: libvgmstream.a libvorbis.a libmpg123-0.a libg7221_decode.a libg719_decode.a libat3plusdecoder.a libavcodec.a libavformat.a libavutil.a libswresample.a
-
-test.exe: libvgmstream.a libvorbis.a libmpg123-0.a libg7221_decode.a libg719_decode.a libat3plusdecoder.a libavcodec.a libavformat.a libavutil.a libswresample.a
-	$(CC) $(CFLAGS) "-DVERSION=\"`../version.sh`\"" test.c $(LDFLAGS) -o test.exe
-	$(STRIP) test.exe
-
-libvgmstream.a:
-	$(MAKE) -C ../src $@
-
-libvorbis.a:
-	$(MAKE) -C ../ext_libs -f Makefile.mingw $@
-
-libmpg123-0.a:
-	$(MAKE) -C ../ext_libs -f Makefile.mingw $@
-
-libg7221_decode.a:
-	$(MAKE) -C ../ext_libs -f Makefile.mingw $@
-
-libg719_decode.a:
-	$(MAKE) -C ../ext_libs -f Makefile.mingw $@
-
-libat3plusdecoder.a:
-	$(MAKE) -C ../ext_libs -f Makefile.mingw $@
-
-libavcodec.a:
-	$(MAKE) -C ../ext_libs -f Makefile.mingw $@
-
-libavformat.a:
-	$(MAKE) -C ../ext_libs -f Makefile.mingw $@
-
-libavutil.a:
-	$(MAKE) -C ../ext_libs -f Makefile.mingw $@
-
-libswresample.a:
-	$(MAKE) -C ../ext_libs -f Makefile.mingw $@
-
-clean:
-	rm -f test.exe
diff --git a/winamp/Makefile b/winamp/Makefile
index d9075b52..4b578a02 100644
--- a/winamp/Makefile
+++ b/winamp/Makefile
@@ -1,43 +1,86 @@
-# optional parts
-VGM_ENABLE_FFMPEG=1
-ifeq ($(VGM_ENABLE_FFMPEG),1)
-FFMPEG_CC=-DVGM_USE_FFMPEG
-FFMPEG_LD=-lavcodec -lavformat -lavutil -lswresample
+#
+# Winamp plugin
+#
+
+ifneq ($(TARGET_OS),WIN32)
+$(error option must be built with TARGET_OS = WIN32)
 endif
 
-VGM_ENABLE_MAIATRAC3PLUS=0
+
+### main defs
+OUTPUT_WINAMP = in_vgmstream.dll
+
+CFLAGS += -Wall -O3 -DUSE_ALLOCA -DWIN32 -I../ext_includes $(EXTRA_CFLAGS)
+LDFLAGS += -L../src -L../ext_libs -lm -lvgmstream $(EXTRA_LDFLAGS)
+TARGET_EXT_LIBS = 
+
+
+### external libs
+ifeq ($(TARGET_OS),WIN32)
+
+VGM_ENABLE_VORBIS = 1
+ifeq ($(VGM_ENABLE_VORBIS),1)
+  #CFLAGS  += -DVGM_USE_VORBIS
+  LDFLAGS += -lvorbis
+  TARGET_EXT_LIBS += libvorbis.a
+else
+  CFLAGS  += -DVGM_DISABLE_VORBIS
+endif
+
+VGM_ENABLE_MPEG = 1
+ifeq ($(VGM_ENABLE_MPEG),1)
+  #CFLAGS  += -DVGM_USE_MPEG
+  LDFLAGS += -lmpg123-0
+  TARGET_EXT_LIBS += libmpg123-0.a
+else
+  CFLAGS  += -DVGM_DISABLE_MPEG
+endif
+
+VGM_ENABLE_G7221 = 1
+ifeq ($(VGM_ENABLE_G7221),1) 
+  CFLAGS  += -DVGM_USE_G7221
+  LDFLAGS += -lg7221_decode
+  TARGET_EXT_LIBS += libg7221_decode.a
+endif
+
+VGM_ENABLE_G719 = 1
+ifeq ($(VGM_ENABLE_G719),1) 
+  CFLAGS  += -DVGM_USE_G719
+  LDFLAGS += -lg719_decode
+  TARGET_EXT_LIBS += libg719_decode.a
+endif
+
+VGM_ENABLE_MAIATRAC3PLUS = 0
 ifeq ($(VGM_ENABLE_MAIATRAC3PLUS),1) 
-MAT3P_CC=-DVGM_USE_MAIATRAC3PLUS
-MAT3P_LD=-lat3plusdecoder
+  CFLAGS  += -DVGM_USE_MAIATRAC3PLUS
+  LDFLAGS += -lat3plusdecoder
+  TARGET_EXT_LIBS += libat3plusdecoder.a
 endif
 
-#MPEG_CC=-DVGM_USE_MPEG
-MPEG_LD=-lmpg123-0
-VGM_DISABLE_MPEG=0
-ifeq ($(VGM_DISABLE_MPEG),1)
-MPEG_CC=-DVGM_DISABLE_MPEG
-MPEG_LD=
+VGM_ENABLE_FFMPEG = 1
+ifeq ($(VGM_ENABLE_FFMPEG),1)
+  CFLAGS  += -DVGM_USE_FFMPEG
+  LDFLAGS += -lavcodec -lavformat -lavutil -lswresample
+  TARGET_EXT_LIBS += libavcodec.a libavformat.a libavutil.a libswresample.a
 endif
 
+VGM_ENABLE_ATRAC9 = 1
+ifeq ($(VGM_ENABLE_ATRAC9),1) 
+  CFLAGS  += -DVGM_USE_ATRAC9
+  LDFLAGS += -latrac9
+  TARGET_EXT_LIBS += libatrac9.a
+endif
 
-# config
-export SHELL = /bin/sh
-export CFLAGS=-Wall -O3 $(MPEG_CC) -DVGM_USE_G7221 -DVGM_USE_G719 $(MAT3P_CC) $(FFMPEG_CC) -DUSE_ALLOCA -DWIN32 -I../ext_includes $(EXTRA_CFLAGS)
-export LDFLAGS=-L../src -L../ext_libs -lvgmstream -lvorbis $(MPEG_LD) -lg7221_decode -lg719_decode $(MAT3P_LD) $(FFMPEG_LD) -lm $(EXTRA_LDFLAGS)
-export CC=i586-mingw32msvc-gcc
-export AR=i586-mingw32msvc-ar
-export STRIP=i586-mingw32msvc-strip
-export WINDRES=i586-mingw32msvc-windres
-#export CC=i686-w64-mingw32-gcc
-#export AR=i686-w64-mingw32-ar
-#export STRIP=i686-w64-mingw32-strip
-#export WINDRES=i686-w64-mingw32-windres
+endif #if WIN32
 
-.PHONY: libvgmstream.a libvorbis.a libmpg123-0.a libg7221_decode.a libg719_decode.a libat3plusdecoder.a libavcodec.a libavformat.a libavutil.a libswresample.a
+export CFLAGS LDFLAGS
 
-in_vgmstream.dll: libvgmstream.a libvorbis.a libmpg123-0.a libg7221_decode.a libg719_decode.a libat3plusdecoder.a libavcodec.a libavformat.a libavutil.a libswresample.a resource.o
-	$(CC) -shared -static-libgcc $(CFLAGS) "-DVERSION=\"`../version.sh`\"" in_vgmstream.c resource.o $(LDFLAGS) -o in_vgmstream.dll
-	$(STRIP) in_vgmstream.dll
+
+### targets
+
+in_vgmstream: libvgmstream.a  $(TARGET_EXT_LIBS) resource.o
+	$(CC) -shared -static-libgcc $(CFLAGS) "-DVERSION=\"`../version.sh`\"" in_vgmstream.c resource.o $(LDFLAGS) -o $(OUTPUT_WINAMP)
+	$(STRIP) $(OUTPUT_WINAMP)
 
 resource.o: resource.rc resource.h
 	$(WINDRES) -o resource.o resource.rc
@@ -45,32 +88,10 @@ resource.o: resource.rc resource.h
 libvgmstream.a:
 	$(MAKE) -C ../src $@
 
-libvorbis.a:
-	$(MAKE) -C ../ext_libs -f Makefile.mingw $@
-
-libmpg123-0.a:
-	$(MAKE) -C ../ext_libs -f Makefile.mingw $@
-
-libg7221_decode.a:
-	$(MAKE) -C ../ext_libs -f Makefile.mingw $@
-
-libg719_decode.a:
-	$(MAKE) -C ../ext_libs -f Makefile.mingw $@
-
-libat3plusdecoder.a:
-	$(MAKE) -C ../ext_libs -f Makefile.mingw $@
-
-libavcodec.a:
-	$(MAKE) -C ../ext_libs -f Makefile.mingw $@
-
-libavformat.a:
-	$(MAKE) -C ../ext_libs -f Makefile.mingw $@
-
-libavutil.a:
-	$(MAKE) -C ../ext_libs -f Makefile.mingw $@
-
-libswresample.a:
-	$(MAKE) -C ../ext_libs -f Makefile.mingw $@
+$(TARGET_EXT_LIBS):
+	$(MAKE) -C ../ext_libs $@
 
 clean:
-	rm -f in_vgmstream.dll resource.o
+	$(RMF) $(OUTPUT_WINAMP) resource.o
+
+.PHONY: clean in_vgmstream libvgmstream.a $(TARGET_EXT_LIBS)
diff --git a/xmplay/Makefile b/xmplay/Makefile
index a4a436be..cd762f69 100644
--- a/xmplay/Makefile
+++ b/xmplay/Makefile
@@ -1,69 +1,94 @@
-# optional parts
-VGM_ENABLE_FFMPEG=1
-ifeq ($(VGM_ENABLE_FFMPEG),1)
-FFMPEG_CC=-DVGM_USE_FFMPEG
-FFMPEG_LD=-lavcodec -lavformat -lavutil -lswresample
+#
+# XMPlay plugin
+#
+
+ifneq ($(TARGET_OS),WIN32)
+$(error option must be built with TARGET_OS = WIN32)
 endif
 
-VGM_ENABLE_MAIATRAC3PLUS=0
+
+### main defs
+OUTPUT_XMPLAY = xmp-vgmstream.dll
+
+CFLAGS += -Wall -O3 -DUSE_ALLOCA -DWIN32 -I../ext_includes $(EXTRA_CFLAGS)
+LDFLAGS += -L../src -L../ext_libs -lm -lvgmstream $(EXTRA_LDFLAGS)
+TARGET_EXT_LIBS = 
+
+
+### external libs
+ifeq ($(TARGET_OS),WIN32)
+
+VGM_ENABLE_VORBIS = 1
+ifeq ($(VGM_ENABLE_VORBIS),1)
+  #CFLAGS  += -DVGM_USE_VORBIS
+  LDFLAGS += -lvorbis
+  TARGET_EXT_LIBS += libvorbis.a
+else
+  CFLAGS  += -DVGM_DISABLE_VORBIS
+endif
+
+VGM_ENABLE_MPEG = 1
+ifeq ($(VGM_ENABLE_MPEG),1)
+  #CFLAGS  += -DVGM_USE_MPEG
+  LDFLAGS += -lmpg123-0
+  TARGET_EXT_LIBS += libmpg123-0.a
+else
+  CFLAGS  += -DVGM_DISABLE_MPEG
+endif
+
+VGM_ENABLE_G7221 = 1
+ifeq ($(VGM_ENABLE_G7221),1) 
+  CFLAGS  += -DVGM_USE_G7221
+  LDFLAGS += -lg7221_decode
+  TARGET_EXT_LIBS += libg7221_decode.a
+endif
+
+VGM_ENABLE_G719 = 1
+ifeq ($(VGM_ENABLE_G719),1) 
+  CFLAGS  += -DVGM_USE_G719
+  LDFLAGS += -lg719_decode
+  TARGET_EXT_LIBS += libg719_decode.a
+endif
+
+VGM_ENABLE_MAIATRAC3PLUS = 0
 ifeq ($(VGM_ENABLE_MAIATRAC3PLUS),1) 
-MAT3P_CC=-DVGM_USE_MAIATRAC3PLUS
-MAT3P_LD=-lat3plusdecoder
+  CFLAGS  += -DVGM_USE_MAIATRAC3PLUS
+  LDFLAGS += -lat3plusdecoder
+  TARGET_EXT_LIBS += libat3plusdecoder.a
 endif
 
-#MPEG_CC=-DVGM_USE_MPEG
-MPEG_LD=-lmpg123-0
-VGM_DISABLE_MPEG=0
-ifeq ($(VGM_DISABLE_MPEG),1)
-MPEG_CC=-DVGM_DISABLE_MPEG
-MPEG_LD=
+VGM_ENABLE_FFMPEG = 1
+ifeq ($(VGM_ENABLE_FFMPEG),1)
+  CFLAGS  += -DVGM_USE_FFMPEG
+  LDFLAGS += -lavcodec -lavformat -lavutil -lswresample
+  TARGET_EXT_LIBS += libavcodec.a libavformat.a libavutil.a libswresample.a
 endif
 
+VGM_ENABLE_ATRAC9 = 1
+ifeq ($(VGM_ENABLE_ATRAC9),1) 
+  CFLAGS  += -DVGM_USE_ATRAC9
+  LDFLAGS += -latrac9
+  TARGET_EXT_LIBS += libatrac9.a
+endif
 
-# config
-export SHELL = /bin/sh
-export CFLAGS=-Wall -O3 $(MPEG_CC) -DVGM_USE_G7221 -DVGM_USE_G719 $(MAT3P_CC) $(FFMPEG_CC) -DUSE_ALLOCA -DWIN32 -I../ext_includes $(EXTRA_CFLAGS)
-export LDFLAGS=-L../src -L../ext_libs -lvgmstream -lvorbis $(MPEG_LD) -lg7221_decode -lg719_decode $(MAT3P_LD) $(FFMPEG_LD) -lm $(EXTRA_LDFLAGS)
-export CC=gcc
-export AR=ar
-export STRIP=strip
+endif #if WIN32
+
+export CFLAGS LDFLAGS
 
 
-.PHONY: libvgmstream.a libvorbis.a libmpg123-0.a libg7221_decode.a libg719_decode.a libat3plusdecoder.a libavcodec.a libavformat.a libavutil.a libswresample.a
+### targets
 
-xmp-vgmstream.dll: libvgmstream.a libvorbis.a libmpg123-0.a libg7221_decode.a libg719_decode.a libat3plusdecoder.a libavcodec.a libavformat.a libavutil.a libswresample.a
-	$(CC) -shared -static-libgcc $(CFLAGS) "-DVERSION=\"`../version.sh`\"" xmp_vgmstream.c $(LDFLAGS) -o xmp-vgmstream.dll xmpin.def
-	$(STRIP) xmp-vgmstream.dll
+xmp_vgmstream: libvgmstream.a $(TARGET_EXT_LIBS)
+	$(CC) -shared -static-libgcc $(CFLAGS) "-DVERSION=\"`../version.sh`\"" xmp_vgmstream.c $(LDFLAGS) -o $(OUTPUT_XMPLAY) xmpin.def
+	$(STRIP) $(OUTPUT_XMPLAY)
 
 libvgmstream.a:
 	$(MAKE) -C ../src $@
 
-libvorbis.a:
-	$(MAKE) -C ../ext_libs -f Makefile.mingw $@
-
-libmpg123-0.a:
-	$(MAKE) -C ../ext_libs -f Makefile.mingw $@
-
-libg7221_decode.a:
-	$(MAKE) -C ../ext_libs -f Makefile.mingw $@
-
-libg719_decode.a:
-	$(MAKE) -C ../ext_libs -f Makefile.mingw $@
-
-libat3plusdecoder.a:
-	$(MAKE) -C ../ext_libs -f Makefile.mingw $@
-
-libavcodec.a:
-	$(MAKE) -C ../ext_libs -f Makefile.mingw $@
-
-libavformat.a:
-	$(MAKE) -C ../ext_libs -f Makefile.mingw $@
-
-libavutil.a:
-	$(MAKE) -C ../ext_libs -f Makefile.mingw $@
-
-libswresample.a:
-	$(MAKE) -C ../ext_libs -f Makefile.mingw $@
+$(TARGET_EXT_LIBS):
+	$(MAKE) -C ../ext_libs $@
 
 clean:
-	rm -f xmp-vgmstream.dll
+	$(RMF) $(OUTPUT_XMPLAY)
+
+.PHONY: clean xmp_vgmstream libvgmstream.a $(TARGET_EXT_LIBS)