+# cause the fancy $${@D} directory rules to work out
+.SECONDEXPANSION:
+
+B_DEBUG    := DEBUG
+B_FINAL    := FINAL
+B_WIN32    := WIN32
+
+# set this on the command line to get a WIN32 or a FINAL build
+G_BUILD    := ${B_DEBUG}
+
+ifeq (${G_BUILD},${B_DEBUG})
+else
+ifeq (${G_BUILD},${B_FINAL})
+else
+ifeq (${G_BUILD},${B_WIN32})
+else
+    $(error 'G_BUILD = ${G_BUILD}' is invalid. Valid types are '${B_DEBUG}', '${B_FINAL}' or '${B_WIN32}')
+endif
+endif
+endif
+
+
 T_OPTFLAGS := -O2
 T_DBGFLAGS := -ggdb
 T_PRFFLAGS := ${T_DBGFLAGS} -pg
 T_WARFLAGS := -Wall -Wextra -pedantic -ansi
 
 G_CXXFLAGS := ${T_WARFLAGS}
-ifeq (${BUILD},WIN32)
+ifeq (${G_BUILD},${B_DEBUG})
+    G_CXXFLAGS    += ${T_DBGFLAGS}
+else
+ifeq (${G_BUILD},${B_FINAL})
     G_CXXFLAGS    += ${T_OPTFLAGS}
 else
-ifeq (${BUILD},FINAL)
+ifeq (${G_BUILD},${B_WIN32})
     G_CXXFLAGS    += ${T_OPTFLAGS}
 else
-    G_CXXFLAGS    += ${T_DBGFLAGS}
+    $(error 'G_BUILD = ${G_BUILD}' is invalid.)
+endif
 endif
 endif
 
 
 G_LNKFLAGS :=
 
-ifeq (${BUILD},WIN32)
+ifeq (${G_BUILD},${B_WIN32})
     G_CXX := mingw32-g++
 else
     G_CXX := g++
 endif
 
-
-ifeq (${BUILD},WIN32)
+ifeq (${G_BUILD},${B_WIN32})
     G_LIBGL   := -lopengl32 -lglu32
     G_LIBSDL  := `/usr/mingw32/bin/sdl-config --libs`
 else
 G_SRCSDIR := src/
 G_DEPSDIR := deps/
 
-ifeq (${BUILD},WIN32)
-    G_OBJSDIR := objs-mingw32/
-    G_BINDIR  := bin-mingw32/
+ifeq (${G_BUILD},${B_DEBUG})
+    G_OBJSDIR := objsd/
+    G_BINDIR  := bind/
 else
-ifeq (${BUILD},FINAL)
+ifeq (${G_BUILD},${B_FINAL})
     G_OBJSDIR := objs/
     G_BINDIR  := bin/
 else
-    G_OBJSDIR := objsd/
-    G_BINDIR  := bind/
+ifeq (${G_BUILD},${B_WIN32})
+    G_OBJSDIR := objs-mingw32/
+    G_BINDIR  := bin-mingw32/
+else
+    $(error 'G_BUILD = ${G_BUILD}' is invalid.)
+endif
 endif
 endif
 
 
-ifeq (${BUILD},WIN32)
+ifeq (${G_BUILD},${B_WIN32})
     PRNTFMT := printf "%-12s: %s\n"
 else
     PRNTFMT := printf "%-8s: %s\n"
 endif
 
 
-ifeq (${BUILD},WIN32)
+ifeq (${G_BUILD},${B_WIN32})
     prefix      := /usr/mingw32
 else
     prefix      := /usr