Unstaged changes (WIP)
[sdk] / Makefile
index 8e05ce0..56fd5e3 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -1,13 +1,37 @@
-.PHONY: all clean realclean distclean emptyoutput prepinstall actualinstall install copyonlyinstall uninstall troubleshoot outputdirs bootstrap deps ecere ecerecom ecerevanilla ear compiler prepbinaries epj2make ide documentor eda prepcodeguard codeguard
+.PHONY: all clean realclean distclean emptyoutput prepinstall actualinstall install copyonlyinstall uninstall troubleshoot outputdirs bootstrap deps ecere ecerecom ecerevanilla ear compiler prepbinaries epj2make ide documentor eda prepcodeguard codeguard fixprecompile cleantarget pots installer regenbootstrap updatebootstrap update_ecere update_libec update_ecp update_ecc update_ecs ecereaudio
+ifneq "$(V)" "1"
 .SILENT:
+endif
 
 include crossplatform.mk
 include default.cf
 
+ifdef BSD_HOST
+INSTALL_FLAGS :=
+CPFLAGS := -pRf
+else
+INSTALL_FLAGS := -D
+CPFLAGS := -dpRf
+endif
+
 XBOOT := $(if $(CROSS_TARGET),GCC_PREFIX= TARGET_PLATFORM=$(HOST_PLATFORM) PLATFORM=$(HOST_PLATFORM),)
 
 LIBVER := .0.44
 
+ifndef ECERE_AUDIO
+ECERE_AUDIO := n
+
+ifdef WINDOWS_TARGET
+ECERE_AUDIO := y
+endif
+
+ifdef LINUX_TARGET
+ifndef BSD_TARGET
+ECERE_AUDIO := y
+endif
+endif
+endif
+
 ifdef WINDOWS_HOST
 HOST_SOV := $(HOST_SO)
 else
@@ -20,14 +44,22 @@ SOV := $(SO)
 
 ifndef DESTDIR
 
-ifdef ProgramFiles(x86)
-export DESTDIR=${ProgramFiles(x86)}/Ecere SDK
-else
-ifdef ProgramFiles
-export DESTDIR=$(ProgramFiles)/Ecere SDK
+ifeq "$(TARGET_ARCH)" "x86_64"
+   ifneq "$(wildcard $(SystemDrive)/Program\ Files )" ""
+      export DESTDIR=$(SystemDrive)/Program Files/Ecere SDK
+   else
+      export DESTDIR=$(SystemDrive)/Ecere SDK
+   endif
 else
-export DESTDIR=$(SystemDrive)/Ecere SDK
-endif
+   ifdef ProgramFiles(x86)
+      export DESTDIR=${ProgramFiles(x86)}/Ecere SDK
+   else
+      ifdef ProgramFiles
+         export DESTDIR=$(ProgramFiles)/Ecere SDK
+      else
+         export DESTDIR=$(SystemDrive)/Ecere SDK
+      endif
+   endif
 endif
 
 endif # DESTDIR
@@ -45,10 +77,12 @@ endif
 ifndef LIBDIR
 export LIBDIR=$(BINDIR)
 endif
+export DESTLIBDIR=$(LIBDIR)
 
 ifndef SLIBDIR
 export SLIBDIR=$(DESTDIR)$(prefix)/lib
 endif
+export DESTSLIBDIR=$(SLIBDIR)
 
 ifndef SAMPLESDIR
 export SAMPLESDIR=$(DESTDIR)$(prefix)/samples
@@ -61,7 +95,12 @@ endif
 
 else # WINDOWS_TARGET
 
+ifdef OSX_TARGET
+# TODO: OSX soname
+SOV := $(SO)
+else
 SOV := $(SO)$(LIBVER)
+endif
 
 ifndef DESTDIR
 export DESTDIR=
@@ -83,25 +122,31 @@ ifndef BINDIR
 export BINDIR=$(DESTDIR)$(prefix)/bin
 endif
 
-HOSTTYPE := $(shell uname -m)
-
 ifdef LIBDIR
-export PREFIXLIBDIR=$(LIBDIR)
+ export PREFIXLIBDIR=$(LIBDIR)
 else
+ export PREFIXLIBDIR=$(prefix)/lib/$(TARGET_ARCH)
 
-ifeq "$(HOSTTYPE)" "x86_64"
-export PREFIXLIBDIR=$(prefix)/lib32
-else
-export PREFIXLIBDIR=$(prefix)/lib
-endif
+ ifeq "$(wildcard $(prefix)/lib/$(TARGET_ARCH) )" ""
+  export PREFIXLIBDIR=$(prefix)/lib
+
+  ifeq "$(TARGET_ARCH)" "i386-linux-gnu"
+   ifneq "$(wildcard $(prefix)/lib32 )" ""
+    export PREFIXLIBDIR=$(prefix)/lib32
+   endif
+  endif
 
+ endif
 endif
 
-LIBDIR := $(DESTDIR)$(PREFIXLIBDIR)
+export CPPFLAGS
+CPPFLAGS += -DDEB_HOST_MULTIARCH=\"$(call escspace,$(PREFIXLIBDIR))\"
+
+DESTLIBDIR := $(DESTDIR)$(PREFIXLIBDIR)
 ifdef SLIBDIR
-SLIBDIR := $(DESTDIR)$(SLIBDIR)
+DESTSLIBDIR := $(DESTDIR)$(SLIBDIR)
 else
-SLIBDIR := $(LIBDIR)
+DESTSLIBDIR := $(DESTLIBDIR)
 endif
 
 ifndef SAMPLESDIR
@@ -116,13 +161,13 @@ endif
 endif
 
 OBJDIR := obj$(OBJALT)/
-OBJBINDIR := $(OBJDIR)$(PLATFORM)/bin/
-OBJLIBDIR := $(OBJDIR)$(PLATFORM)/lib/
+OBJBINDIR := $(OBJDIR)$(PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/bin/
+OBJLIBDIR := $(OBJDIR)$(PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/lib/
 XOBJDIR := obj$(OBJALT)/
-XOBJBINDIR := $(OBJDIR)$(HOST_PLATFORM)/bin/
-XOBJLIBDIR := $(OBJDIR)$(HOST_PLATFORM)/lib/
+XOBJBINDIR := $(OBJDIR)$(HOST_PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/bin/
+XOBJLIBDIR := $(OBJDIR)$(HOST_PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/lib/
 
-all: prepbinaries ide epj2make documentor eda codeguard
+all: prepbinaries ide epj2make documentor eda codeguard ecereaudio
        @$(call echo,The Ecere SDK is fully built.)
 
 outputdirs:
@@ -140,11 +185,15 @@ bootstrap: outputdirs
 
 deps:
 ifdef CROSS_TARGET
+ifndef LINUX_HOST
        @$(call echo,Building dependencies (host)...)
        cd deps && $(MAKE) $(XBOOT)
 endif
+endif
+ifndef LINUX_TARGET
        @$(call echo,Building dependencies...)
        cd deps && $(MAKE)
+endif
 
 ecere: bootstrap deps
 ifdef CROSS_TARGET
@@ -154,7 +203,7 @@ else
 endif
        cd ecere && $(MAKE) nores $(XBOOT)
        cd ear && $(MAKE) nores $(XBOOT)
-       cd ecere && $(MAKE) cleantarget
+       cd ecere && $(MAKE) cleaneceretarget
 ifdef CROSS_TARGET
        @$(call echo,Building 2nd stage ecere...)
 endif
@@ -177,6 +226,9 @@ ear: ecere ecerevanilla
        cd ear && cd cmd && $(MAKE) cleantarget
        cd ear && $(MAKE)
 
+fixprecompile:
+       cd compiler && $(MAKE) fixprecompile
+
 compiler: ecere ear
 ifdef CROSS_TARGET
        @$(call echo,Building 2nd stage compiler (host))
@@ -188,14 +240,14 @@ endif
 prepbinaries: compiler ecerecom
        @$(call echo,Enabling 2nd stage binaries...)
 ifdef WINDOWS_TARGET
-       $(call cpq,ecere/obj/release.$(PLATFORM)/$(LP)ecere$(SOV),$(OBJBINDIR))
-       $(call cpq,ecere/obj/ecereCOM.release.$(PLATFORM)/$(LP)ecereCOM$(SOV),$(OBJBINDIR))
-       $(call cpq,compiler/libec/obj/release.$(PLATFORM)/$(LP)ec$(SOV),$(OBJBINDIR))
+       $(call cpq,ecere/obj/release.$(PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/$(LP)ecere$(SOV),$(OBJBINDIR))
+       $(call cpq,ecere/obj/ecereCOM.release.$(PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/$(LP)ecereCOM$(SOV),$(OBJBINDIR))
+       $(call cpq,compiler/libec/obj/release.$(PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/$(LP)ec$(SOV),$(OBJBINDIR))
 endif
 ifdef LINUX_TARGET
-       $(call cpq,ecere/obj/release.$(PLATFORM)/$(LP)ecere$(SOV),$(OBJLIBDIR))
-       $(call cpq,ecere/obj/ecereCOM.release.$(PLATFORM)/$(LP)ecereCOM$(SOV),$(OBJLIBDIR))
-       $(call cpq,compiler/libec/obj/release.$(PLATFORM)/$(LP)ec$(SOV),$(OBJLIBDIR))
+       $(call cpq,ecere/obj/release.$(PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/$(LP)ecere$(SOV),$(OBJLIBDIR))
+       $(call cpq,ecere/obj/ecereCOM.release.$(PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/$(LP)ecereCOM$(SOV),$(OBJLIBDIR))
+       $(call cpq,compiler/libec/obj/release.$(PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/$(LP)ec$(SOV),$(OBJLIBDIR))
        ln -sf $(LP)ecere$(SOV) $(OBJLIBDIR)$(LP)ecere$(SO).0
        ln -sf $(LP)ecereCOM$(SOV) $(OBJLIBDIR)$(LP)ecereCOM$(SO).0
        ln -sf $(LP)ec$(SOV) $(OBJLIBDIR)$(LP)ec$(SO).0
@@ -205,27 +257,27 @@ ifdef LINUX_TARGET
 endif
 ifndef WINDOWS_TARGET
 ifndef LINUX_TARGET
-       $(call cpq,ecere/obj/release.$(PLATFORM)/$(LP)ecere$(SO),$(OBJLIBDIR))
-       $(call cpq,ecere/obj/ecereCOM.release.$(PLATFORM)/$(LP)ecereCOM$(SO),$(OBJLIBDIR))
-       $(call cpq,compiler/libec/obj/release.$(PLATFORM)/$(LP)ec$(SO),$(OBJLIBDIR))
+       $(call cpq,ecere/obj/release.$(PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/$(LP)ecere$(SO),$(OBJLIBDIR))
+       $(call cpq,ecere/obj/ecereCOM.release.$(PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/$(LP)ecereCOM$(SO),$(OBJLIBDIR))
+       $(call cpq,compiler/libec/obj/release.$(PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/$(LP)ec$(SO),$(OBJLIBDIR))
 endif
 endif
-       $(call cpq,ear/cmd/obj/release.$(PLATFORM)/ear$(E),$(OBJBINDIR))
-       $(call cpq,compiler/ecc/obj/release.$(PLATFORM)/ecc$(E),$(OBJBINDIR))
-       $(call cpq,compiler/ecp/obj/release.$(PLATFORM)/ecp$(E),$(OBJBINDIR))
-       $(call cpq,compiler/ecs/obj/release.$(PLATFORM)/ecs$(E),$(OBJBINDIR))
+       $(call cpq,ear/cmd/obj/release.$(PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/ear$(E),$(OBJBINDIR))
+       $(call cpq,compiler/ecc/obj/release.$(PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/ecc$(E),$(OBJBINDIR))
+       $(call cpq,compiler/ecp/obj/release.$(PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/ecp$(E),$(OBJBINDIR))
+       $(call cpq,compiler/ecs/obj/release.$(PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/ecs$(E),$(OBJBINDIR))
 
 ifdef CROSS_TARGET
 
 ifdef WINDOWS_HOST
-       $(call cpq,ecere/obj/release.$(HOST_PLATFORM)/$(HOST_LP)ecere$(HOST_SOV),$(XOBJBINDIR))
-       $(call cpq,ecere/obj/ecereCOM.release.$(HOST_PLATFORM)/$(HOST_LP)ecereCOM$(HOST_SOV),$(XOBJBINDIR))
-       $(call cpq,compiler/libec/obj/release.$(HOST_PLATFORM)/$(HOST_LP)ec$(HOST_SOV),$(XOBJBINDIR))
+       $(call cpq,ecere/obj/release.$(HOST_PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/$(HOST_LP)ecere$(HOST_SOV),$(XOBJBINDIR))
+       $(call cpq,ecere/obj/ecereCOM.release.$(HOST_PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/$(HOST_LP)ecereCOM$(HOST_SOV),$(XOBJBINDIR))
+       $(call cpq,compiler/libec/obj/release.$(HOST_PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/$(HOST_LP)ec$(HOST_SOV),$(XOBJBINDIR))
 endif
 ifdef WINDOWS_HOST
-       $(call cpq,ecere/obj/release.$(HOST_PLATFORM)/$(HOST_LP)ecere$(HOST_SOV),$(XOBJLIBDIR))
-       $(call cpq,ecere/obj/ecereCOM.release.$(HOST_PLATFORM)/$(HOST_LP)ecereCOM$(HOST_SOV),$(XOBJLIBDIR))
-       $(call cpq,compiler/libec/obj/release.$(HOST_PLATFORM)/$(HOST_LP)ec$(HOST_SOV),$(XOBJLIBDIR))
+       $(call cpq,ecere/obj/release.$(HOST_PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/$(HOST_LP)ecere$(HOST_SOV),$(XOBJLIBDIR))
+       $(call cpq,ecere/obj/ecereCOM.release.$(HOST_PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/$(HOST_LP)ecereCOM$(HOST_SOV),$(XOBJLIBDIR))
+       $(call cpq,compiler/libec/obj/release.$(HOST_PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/$(HOST_LP)ec$(HOST_SOV),$(XOBJLIBDIR))
        ln -sf $(HOST_LP)ecere$(HOST_SOV) $(XOBJLIBDIR)$(LP)ecere$(HOST_SO).0
        ln -sf $(HOST_LP)ecereCOM$(HOST_SOV) $(XOBJLIBDIR)$(LP)ecereCOM$(HOST_SO).0
        ln -sf $(HOST_LP)ec$(HOST_SOV) $(XOBJLIBDIR)$(LP)ec$(HOST_SO).0
@@ -235,15 +287,15 @@ ifdef WINDOWS_HOST
 endif
 ifndef WINDOWS_HOST
 ifndef LINUX_HOST
-       $(call cpq,ecere/obj/release.$(HOST_PLATFORM)/$(HOST_LP)ecere$(HOST_SO),$(XOBJLIBDIR))
-       $(call cpq,ecere/obj/ecereCOM.release.$(HOST_PLATFORM)/$(HOST_LP)ecereCOM$(HOST_SO),$(XOBJLIBDIR))
-       $(call cpq,compiler/libec/obj/release.$(HOST_PLATFORM)/$(HOST_LP)ec$(HOST_SO),$(XOBJLIBDIR))
+       $(call cpq,ecere/obj/release.$(HOST_PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/$(HOST_LP)ecere$(HOST_SO),$(XOBJLIBDIR))
+       $(call cpq,ecere/obj/ecereCOM.release.$(HOST_PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/$(HOST_LP)ecereCOM$(HOST_SO),$(XOBJLIBDIR))
+       $(call cpq,compiler/libec/obj/release.$(HOST_PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/$(HOST_LP)ec$(HOST_SO),$(XOBJLIBDIR))
 endif
 endif
-       $(call cpq,ear/cmd/obj/release.$(HOST_PLATFORM)/ear$(HOST_E),$(XOBJBINDIR))
-       $(call cpq,compiler/ecc/obj/release.$(HOST_PLATFORM)/ecc$(HOST_E),$(XOBJBINDIR))
-       $(call cpq,compiler/ecp/obj/release.$(HOST_PLATFORM)/ecp$(HOST_E),$(XOBJBINDIR))
-       $(call cpq,compiler/ecs/obj/release.$(HOST_PLATFORM)/ecs$(HOST_E),$(XOBJBINDIR))
+       $(call cpq,ear/cmd/obj/release.$(HOST_PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/ear$(HOST_E),$(XOBJBINDIR))
+       $(call cpq,compiler/ecc/obj/release.$(HOST_PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/ecc$(HOST_E),$(XOBJBINDIR))
+       $(call cpq,compiler/ecp/obj/release.$(HOST_PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/ecp$(HOST_E),$(XOBJBINDIR))
+       $(call cpq,compiler/ecs/obj/release.$(HOST_PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/ecs$(HOST_E),$(XOBJBINDIR))
 
 endif
 
@@ -251,6 +303,12 @@ epj2make: prepbinaries
        @$(call echo,Building epj2make...)
        cd epj2make && $(MAKE)
 
+ecereaudio: prepbinaries
+ifneq "$(ECERE_AUDIO)" "n"
+       @$(call echo,Building EcereAudio...)
+       cd audio && $(MAKE)
+endif
+
 ide: prepbinaries
        @$(call echo,Building IDE...)
        cd ide && $(MAKE)
@@ -285,6 +343,10 @@ endif
 endif
 
 eda: prepbinaries
+ifdef CROSS_TARGET
+       @$(call echo,Building EDA (host))
+       cd eda && $(MAKE) $(XBOOT)
+endif
        @$(call echo,Building EDA...)
        cd eda && $(MAKE)
 
@@ -298,6 +360,9 @@ emptyoutput: outputdirs
 ifdef EDASQLiteCipher
        $(call rmq,$(SODESTDIR)$(LP)EDASQLiteCipher$(SO))
 endif
+ifneq "$(ECERE_AUDIO)" "n"
+       $(call rmq,$(SODESTDIR)$(LP)EcereAudio$(SO))
+endif
 ifdef LINUX_TARGET
        $(call rmq,$(SODESTDIR)$(LP)ecere$(SO).0)
        $(call rmq,$(SODESTDIR)$(LP)ecereCOM$(SO).0)
@@ -307,6 +372,9 @@ ifdef LINUX_TARGET
 ifdef EDASQLiteCipher
        $(call rmq,$(SODESTDIR)$(LP)EDASQLiteCipher$(SO).0)
 endif
+ifneq "$(ECERE_AUDIO)" "n"
+       $(call rmq,$(SODESTDIR)$(LP)EcereAudio$(SO).0)
+endif
        $(call rmq,$(SODESTDIR)$(LP)ecere$(SOV))
        $(call rmq,$(SODESTDIR)$(LP)ecereCOM$(SOV))
        $(call rmq,$(SODESTDIR)$(LP)ec$(SOV))
@@ -315,6 +383,9 @@ endif
 ifdef EDASQLiteCipher
        $(call rmq,$(SODESTDIR)$(LP)EDASQLiteCipher$(SOV))
 endif
+ifneq "$(ECERE_AUDIO)" "n"
+       $(call rmq,$(SODESTDIR)$(LP)EcereAudio$(SOV))
+endif
 endif  
        $(call rmq,$(OBJBINDIR)ear$(E))
        $(call rmq,$(OBJBINDIR)ecc$(E))
@@ -323,32 +394,70 @@ endif
        $(call rmq,$(OBJBINDIR)epj2make$(E))
        $(call rmq,$(OBJBINDIR)ide$(E))
        $(call rmq,$(OBJBINDIR)documentor$(E))
-ifdef EDASQLiteCipher
+ifdef CodeGuard
        $(call rmq,$(OBJBINDIR)CodeGuard$(E))
 endif
 
+cleantarget:
+       cd compiler && $(MAKE) cleantarget
+       cd documentor && $(MAKE) cleantarget
+       cd ear && $(MAKE) cleantarget
+       cd ecere && $(MAKE) cleantarget
+       cd eda && $(MAKE) cleantarget
+       cd epj2make && $(MAKE) cleantarget
+       cd ide && $(MAKE) cleantarget
+       cd installer && $(MAKE) cleantarget
+ifneq "$(ECERE_AUDIO)" "n"
+       cd audio && $(MAKE) cleantarget
+endif
+
+pots: cleantarget
+       $(MAKE) OUTPUT_POT=1
+       cd installer && $(MAKE) OUTPUT_POT=1 pots
+
+ifdef WINDOWS_TARGET
+installer:
+       $(MAKE) prepinstall ARCH=
+       $(MAKE) prepinstall ARCH=x32
+       @$(call echo,Building Ecere runtime for installer...)
+       cd ecere && @$(MAKE) -f Makefile.installer ARCH=x32
+       @$(call echo,Building Installer for Windows...)
+       cd installer && @$(MAKE) ARCH=x32
+       @$(call echo,The Ecere SDK Windows Installer is fully built.)
+endif
+
 clean: emptyoutput
+ifndef LINUX_TARGET
        cd deps && $(MAKE) clean
+endif
        cd ecere && $(MAKE) clean
        cd compiler && $(MAKE) clean
        cd ear && $(MAKE) clean
        cd epj2make && $(MAKE) clean
        cd ide && $(MAKE) clean
        cd documentor && $(MAKE) clean
+ifneq "$(ECERE_AUDIO)" "n"
+       cd audio && $(MAKE) clean
+endif
 ifdef CodeGuard
        cd codeGuard && $(MAKE) clean
 endif
        cd eda && $(MAKE) clean
        @$(call echo,Done.)
 
-realclean:
+realclean: outputdirs
+ifndef LINUX_TARGET
        cd deps && $(MAKE) realclean
+endif
        cd ecere && $(MAKE) realclean
        cd compiler && $(MAKE) realclean
        cd ear && $(MAKE) realclean
        cd epj2make && $(MAKE) realclean
        cd ide && $(MAKE) realclean
        cd documentor && $(MAKE) realclean
+ifneq "$(ECERE_AUDIO)" "n"
+       cd audio && $(MAKE) realclan
+endif
 ifdef CodeGuard
        cd codeGuard && $(MAKE) realclean
 endif
@@ -356,14 +465,19 @@ endif
        $(call rmrq,obj/$(PLATFORM)/)
        @$(call echo,Done.)
 
-distclean:
+distclean: outputdirs
+ifndef LINUX_TARGET
        cd deps && $(MAKE) distclean
+endif
        cd ecere && $(MAKE) distclean
        cd compiler && $(MAKE) distclean
        cd ear && $(MAKE) distclean
        cd epj2make && $(MAKE) distclean
        cd ide && $(MAKE) distclean
        cd documentor && $(MAKE) distclean
+ifneq "$(ECERE_AUDIO)" "n"
+       cd audio && $(MAKE) distclean
+endif
 ifdef CodeGuard
        cd codeGuard && $(MAKE) distclean
 endif
@@ -374,26 +488,30 @@ endif
 DOC = doc/ecere.eCdoc doc/ecereCOM.eCdoc doc/EDA.eCdoc
 
 BINARIES = \
-       ecere/obj/release.$(PLATFORM)/$(LP)ecere$(SOV) \
-       ecere/obj/ecereCOM.release.$(PLATFORM)/$(LP)ecereCOM$(SOV) \
-       ecere/obj/vanilla.$(PLATFORM)/libecereVanilla$(A) \
-       compiler/libec/obj/release.$(PLATFORM)/$(LP)ec$(SOV) \
-       compiler/ecp/obj/release.$(PLATFORM)/ecp$(E) \
-       compiler/ecc/obj/release.$(PLATFORM)/ecc$(E) \
-       compiler/ecs/obj/release.$(PLATFORM)/ecs$(E) \
-       ear/cmd/obj/release.$(PLATFORM)/ear$(E) \
-       epj2make/obj/release.$(PLATFORM)/epj2make$(E) \
-       documentor/obj/release.$(PLATFORM)/documentor$(E) \
-       ide/obj/release.$(PLATFORM)/ide$(E) \
-       eda/libeda/obj/release.$(PLATFORM)/$(LP)EDA$(SOV) \
-       eda/drivers/sqlite/obj/release.$(PLATFORM)/$(LP)EDASQLite$(SOV)
+       ecere/obj/release.$(PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/$(LP)ecere$(SOV) \
+       ecere/obj/ecereCOM.release.$(PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/$(LP)ecereCOM$(SOV) \
+       ecere/obj/vanilla.$(PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/libecereVanilla$(A) \
+       compiler/libec/obj/release.$(PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/$(LP)ec$(SOV) \
+       compiler/ecp/obj/release.$(PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/ecp$(E) \
+       compiler/ecc/obj/release.$(PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/ecc$(E) \
+       compiler/ecs/obj/release.$(PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/ecs$(E) \
+       ear/cmd/obj/release.$(PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/ear$(E) \
+       epj2make/obj/release.$(PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/epj2make$(E) \
+       documentor/obj/release.$(PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/documentor$(E) \
+       ide/obj/release.$(PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/ide$(E) \
+       eda/libeda/obj/release.$(PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/$(LP)EDA$(SOV) \
+       eda/drivers/sqlite/obj/release.$(PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/$(LP)EDASQLite$(SOV)
+
+ifneq "$(ECERE_AUDIO)" "n"
+BINARIES += audio/obj/release.$(PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/$(LP)EcereAudio$(SOV)
+endif
 
 ifdef CodeGuard
-BINARIES += codeGuard/obj/release.$(PLATFORM)/CodeGuard$(E)
+BINARIES += codeGuard/obj/release.$(PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/CodeGuard$(E)
 endif
 
 ifdef EDASQLiteCipher
-BINARIES += eda/drivers/sqliteCipher/obj/release.$(PLATFORM)/$(LP)EDASQLiteCipher$(SOV)
+BINARIES += eda/drivers/sqliteCipher/obj/release.$(PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/$(LP)EDASQLiteCipher$(SOV)
 endif
 
 # Making sure everything is in $(OBJBINDIR) and $(OBJLIBDIR)
@@ -403,24 +521,30 @@ endif
 prepinstall: $(DOC) $(BINARIES) outputdirs
 
 ifdef WINDOWS_TARGET
-       $(call cpq,ecere/obj/release.$(PLATFORM)/$(LP)ecere$(SO),$(OBJBINDIR))
-       $(call cpq,ecere/obj/ecereCOM.release.$(PLATFORM)/$(LP)ecereCOM$(SO),$(OBJBINDIR))
-       $(call cpq,compiler/libec/obj/release.$(PLATFORM)/$(LP)ec$(SO),$(OBJBINDIR))
-       $(call cpq,eda/libeda/obj/release.$(PLATFORM)/$(LP)EDA$(SO),$(OBJBINDIR))
-       $(call cpq,eda/drivers/sqlite/obj/release.$(PLATFORM)/$(LP)EDASQLite$(SO),$(OBJBINDIR))
+       $(call cpq,ecere/obj/release.$(PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/$(LP)ecere$(SO),$(OBJBINDIR))
+       $(call cpq,ecere/obj/ecereCOM.release.$(PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/$(LP)ecereCOM$(SO),$(OBJBINDIR))
+       $(call cpq,compiler/libec/obj/release.$(PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/$(LP)ec$(SO),$(OBJBINDIR))
+       $(call cpq,eda/libeda/obj/release.$(PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/$(LP)EDA$(SO),$(OBJBINDIR))
+       $(call cpq,eda/drivers/sqlite/obj/release.$(PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/$(LP)EDASQLite$(SO),$(OBJBINDIR))
+ifneq "$(ECERE_AUDIO)" "n"
+       $(call cpq,audio/obj/release.$(PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/$(LP)EcereAudio$(SO),$(OBJBINDIR))
+endif
 ifdef EDASQLiteCipher
-       $(call cpq,eda/drivers/sqliteCipher/obj/release.$(PLATFORM)/$(LP)EDASQLiteCipher$(SO),$(OBJBINDIR))
+       $(call cpq,eda/drivers/sqliteCipher/obj/release.$(PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/$(LP)EDASQLiteCipher$(SO),$(OBJBINDIR))
 endif
 endif
 
 ifdef LINUX_TARGET
-       $(call cpq,ecere/obj/release.$(PLATFORM)/$(LP)ecere$(SOV),$(OBJLIBDIR))
-       $(call cpq,ecere/obj/ecereCOM.release.$(PLATFORM)/$(LP)ecereCOM$(SOV),$(OBJLIBDIR))
-       $(call cpq,compiler/libec/obj/release.$(PLATFORM)/$(LP)ec$(SOV),$(OBJLIBDIR))
-       $(call cpq,eda/libeda/obj/release.$(PLATFORM)/$(LP)EDA$(SOV),$(OBJLIBDIR))
-       $(call cpq,eda/drivers/sqlite/obj/release.$(PLATFORM)/$(LP)EDASQLite$(SOV),$(OBJLIBDIR))
+       $(call cpq,ecere/obj/release.$(PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/$(LP)ecere$(SOV),$(OBJLIBDIR))
+       $(call cpq,ecere/obj/ecereCOM.release.$(PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/$(LP)ecereCOM$(SOV),$(OBJLIBDIR))
+       $(call cpq,compiler/libec/obj/release.$(PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/$(LP)ec$(SOV),$(OBJLIBDIR))
+       $(call cpq,eda/libeda/obj/release.$(PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/$(LP)EDA$(SOV),$(OBJLIBDIR))
+       $(call cpq,eda/drivers/sqlite/obj/release.$(PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/$(LP)EDASQLite$(SOV),$(OBJLIBDIR))
+ifneq "$(ECERE_AUDIO)" "n"
+       $(call cpq,audio/obj/release.$(PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/$(LP)EcereAudio$(SOV),$(OBJLIBDIR))
+endif
 ifdef EDASQLiteCipher
-       $(call cpq,eda/drivers/sqliteCipher/obj/release.$(PLATFORM)/$(LP)EDASQLiteCipher$(SOV),$(OBJLIBDIR))
+       $(call cpq,eda/drivers/sqliteCipher/obj/release.$(PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/$(LP)EDASQLiteCipher$(SOV),$(OBJLIBDIR))
 endif
        ln -sf $(LP)ecere$(SOV) $(OBJLIBDIR)$(LP)ecere$(SO).0
        ln -sf $(LP)ecereCOM$(SOV) $(OBJLIBDIR)$(LP)ecereCOM$(SO).0
@@ -430,6 +554,10 @@ endif
 ifdef EDASQLiteCipher
        ln -sf $(LP)EDASQLiteCipher$(SOV) $(OBJLIBDIR)$(LP)EDASQLiteCipher$(SO).0
 endif
+ifneq "$(ECERE_AUDIO)" "n"
+       ln -sf $(LP)EcereAudio$(SOV) $(OBJLIBDIR)$(LP)EcereAudio$(SO).0
+endif
+
        ln -sf $(LP)ecere$(SOV) $(OBJLIBDIR)$(LP)ecere$(SO)
        ln -sf $(LP)ecereCOM$(SOV) $(OBJLIBDIR)$(LP)ecereCOM$(SO)
        ln -sf $(LP)ec$(SOV) $(OBJLIBDIR)$(LP)ec$(SO)
@@ -438,32 +566,36 @@ endif
 ifdef EDASQLiteCipher
        ln -sf $(LP)EDASQLiteCipher$(SOV) $(OBJLIBDIR)$(LP)EDASQLiteCipher$(SO)
 endif
+       ln -sf $(LP)EcereAudio$(SOV) $(OBJLIBDIR)$(LP)EcereAudio$(SO)
 endif
 
 ifndef WINDOWS_TARGET
 ifndef LINUX_TARGET
-       $(call cpq,ecere/obj/release.$(PLATFORM)/$(LP)ecere$(SO),$(OBJLIBDIR))
-       $(call cpq,ecere/obj/ecereCOM.release.$(PLATFORM)/$(LP)ecereCOM$(SO),$(OBJLIBDIR))
-       $(call cpq,compiler/libec/obj/release.$(PLATFORM)/$(LP)ec$(SO),$(OBJLIBDIR))
-       $(call cpq,eda/libeda/obj/release.$(PLATFORM)/$(LP)EDA$(SO),$(OBJLIBDIR))
-       $(call cpq,eda/drivers/sqlite/obj/release.$(PLATFORM)/$(LP)EDASQLite$(SO),$(OBJLIBDIR))
+       $(call cpq,ecere/obj/release.$(PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/$(LP)ecere$(SO),$(OBJLIBDIR))
+       $(call cpq,ecere/obj/ecereCOM.release.$(PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/$(LP)ecereCOM$(SO),$(OBJLIBDIR))
+       $(call cpq,compiler/libec/obj/release.$(PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/$(LP)ec$(SO),$(OBJLIBDIR))
+       $(call cpq,eda/libeda/obj/release.$(PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/$(LP)EDA$(SO),$(OBJLIBDIR))
+       $(call cpq,eda/drivers/sqlite/obj/release.$(PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/$(LP)EDASQLite$(SO),$(OBJLIBDIR))
+ifneq "$(ECERE_AUDIO)" "n"
+       $(call cpq,audio/obj/release.$(PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/$(LP)EcereAudio$(SO),$(OBJLIBDIR))
+endif
 ifdef EDASQLiteCipher
-       $(call cpq,eda/drivers/sqliteCipher/obj/release.$(PLATFORM)/$(LP)EDASQLiteCipher$(SO),$(OBJLIBDIR))
+       $(call cpq,eda/drivers/sqliteCipher/obj/release.$(PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/$(LP)EDASQLiteCipher$(SO),$(OBJLIBDIR))
 endif
 endif
 endif
 
-       $(call cpq,ide/obj/release.$(PLATFORM)/ide$(E),$(OBJBINDIR))
-       $(call cpq,ear/cmd/obj/release.$(PLATFORM)/ear$(E),$(OBJBINDIR))
-       $(call cpq,compiler/ecc/obj/release.$(PLATFORM)/ecc$(E),$(OBJBINDIR))
-       $(call cpq,compiler/ecp/obj/release.$(PLATFORM)/ecp$(E),$(OBJBINDIR))
-       $(call cpq,compiler/ecs/obj/release.$(PLATFORM)/ecs$(E),$(OBJBINDIR))
-       $(call cpq,epj2make/obj/release.$(PLATFORM)/epj2make$(E),$(OBJBINDIR))
-       $(call cpq,documentor/obj/release.$(PLATFORM)/documentor$(E),$(OBJBINDIR))
+       $(call cpq,ide/obj/release.$(PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/ide$(E),$(OBJBINDIR))
+       $(call cpq,ear/cmd/obj/release.$(PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/ear$(E),$(OBJBINDIR))
+       $(call cpq,compiler/ecc/obj/release.$(PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/ecc$(E),$(OBJBINDIR))
+       $(call cpq,compiler/ecp/obj/release.$(PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/ecp$(E),$(OBJBINDIR))
+       $(call cpq,compiler/ecs/obj/release.$(PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/ecs$(E),$(OBJBINDIR))
+       $(call cpq,epj2make/obj/release.$(PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/epj2make$(E),$(OBJBINDIR))
+       $(call cpq,documentor/obj/release.$(PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/documentor$(E),$(OBJBINDIR))
 ifdef CodeGuard
-       $(call cpq,codeGuard/obj/release.$(PLATFORM)/CodeGuard$(E),$(OBJBINDIR))
+       $(call cpq,codeGuard/obj/release.$(PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/CodeGuard$(E),$(OBJBINDIR))
 endif
-       $(call cpq,ecere/obj/vanilla.$(PLATFORM)/libecereVanilla$(A),$(OBJLIBDIR))
+       $(call cpq,ecere/obj/vanilla.$(PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/libecereVanilla$(A),$(OBJLIBDIR))
 
 #TODO: Samples?
 install: prepinstall actualinstall
@@ -475,15 +607,18 @@ copyonlyinstall: actualinstall
 actualinstall:
 ifdef WINDOWS_TARGET
        $(call mkdirq,"$(BINDIR)/")
-       $(call mkdirq,"$(SLIBDIR)/")
+       $(call mkdirq,"$(DESTSLIBDIR)/")
        $(call mkdirq,"$(DOCDIR)/")
-       $(call cpq,$(OBJBINDIR)$(LP)ecere$(SO),"$(LIBDIR)/")
-       $(call cpq,$(OBJBINDIR)$(LP)ecereCOM$(SO),"$(LIBDIR)/")
-       $(call cpq,$(OBJBINDIR)$(LP)ec$(SO),"$(LIBDIR)/")
-       $(call cpq,$(OBJBINDIR)$(LP)EDA$(SO),"$(LIBDIR)/")
-       $(call cpq,$(OBJBINDIR)$(LP)EDASQLite$(SO),"$(LIBDIR)/")
+       $(call cpq,$(OBJBINDIR)$(LP)ecere$(SO),"$(DESTLIBDIR)/")
+       $(call cpq,$(OBJBINDIR)$(LP)ecereCOM$(SO),"$(DESTLIBDIR)/")
+       $(call cpq,$(OBJBINDIR)$(LP)ec$(SO),"$(DESTLIBDIR)/")
+       $(call cpq,$(OBJBINDIR)$(LP)EDA$(SO),"$(DESTLIBDIR)/")
+       $(call cpq,$(OBJBINDIR)$(LP)EDASQLite$(SO),"$(DESTLIBDIR)/")
 ifdef EDASQLiteCipher
-       $(call cpq,$(OBJBINDIR)$(LP)EDASQLiteCipher$(SO),"$(LIBDIR)/")
+       $(call cpq,$(OBJBINDIR)$(LP)EDASQLiteCipher$(SO),"$(DESTLIBDIR)/")
+endif
+ifneq "$(ECERE_AUDIO)" "n"
+       $(call cpq,$(OBJBINDIR)$(LP)EcereAudio$(SO),"$(DESTLIBDIR)/")
 endif
        $(call cpq,$(OBJBINDIR)ide$(E),"$(BINDIR)/")
        $(call cpq,$(OBJBINDIR)ear$(E),"$(BINDIR)/")
@@ -495,7 +630,7 @@ endif
 ifdef CodeGuard
        $(call cpq,$(OBJBINDIR)CodeGuard$(E),"$(BINDIR)/")
 endif
-       $(call cpq,$(OBJLIBDIR)libecereVanilla$(A),"$(SLIBDIR)/")
+       $(call cpq,$(OBJLIBDIR)libecereVanilla$(A),"$(DESTSLIBDIR)/")
        $(call cpq,doc/tao.pdf,"$(DOCDIR)/Ecere Tao of Programming [work in progress].pdf") || echo "The Ecere Tao of Programming is available at http://ecere.com/tao.pdf"
        $(call cpq,doc/ecere.eCdoc,"$(DOCDIR)/")
        $(call cpq,doc/ecereCOM.eCdoc,"$(DOCDIR)/")
@@ -503,13 +638,16 @@ endif
 endif
 
 ifdef OSX_TARGET
-       install $(OBJLIBDIR)$(LP)ecere$(SO) $(LIBDIR)/
-       install $(OBJLIBDIR)$(LP)ecereCOM$(SO) $(LIBDIR)/
-       install $(OBJLIBDIR)$(LP)ec$(SO) $(LIBDIR)/
-       install $(OBJLIBDIR)$(LP)EDA$(SO) $(LIBDIR)/
-       install $(OBJLIBDIR)$(LP)EDASQLite$(SO) $(LIBDIR)/
+       install $(OBJLIBDIR)$(LP)ecere$(SO) $(DESTLIBDIR)/
+       install $(OBJLIBDIR)$(LP)ecereCOM$(SO) $(DESTLIBDIR)/
+       install $(OBJLIBDIR)$(LP)ec$(SO) $(DESTLIBDIR)/
+       install $(OBJLIBDIR)$(LP)EDA$(SO) $(DESTLIBDIR)/
+       install $(OBJLIBDIR)$(LP)EDASQLite$(SO) $(DESTLIBDIR)/
 ifdef EDASQLiteCipher
-       install $(OBJLIBDIR)$(LP)EDASQLiteCipher$(SO) $(LIBDIR)/
+       install $(OBJLIBDIR)$(LP)EDASQLiteCipher$(SO) $(DESTLIBDIR)/
+endif
+ifneq "$(ECERE_AUDIO)" "n"
+       install $(OBJLIBDIR)$(LP)EcereAudio$(SO) $(DESTLIBDIR)/
 endif
        install $(OBJBINDIR)ide$(E) $(BINDIR)/
        install $(OBJBINDIR)ear$(E) $(BINDIR)/
@@ -521,93 +659,98 @@ endif
 ifdef CodeGuard
        install $(OBJBINDIR)CodeGuard$(E) $(BINDIR)/
 endif
-       install $(OBJLIBDIR)libecereVanilla$(A) $(SLIBDIR)/
+       install $(OBJLIBDIR)libecereVanilla$(A) $(DESTSLIBDIR)/
        install -d $(DOCDIR)/
        install doc/tao.pdf $(DOCDIR)/"Ecere Tao of Programming [work in progress].pdf" >/dev/null 2>&1 || echo "The Ecere Tao of Programming is available at http://ecere.com/tao.pdf"
        install doc/ecere.eCdoc $(DOCDIR)/
        install doc/ecereCOM.eCdoc $(DOCDIR)/
        install doc/EDA.eCdoc $(DOCDIR)/
+       mkdir -p $(MANDIR)/man1
+       cp -pRf share/man/man1/* $(MANDIR)/man1
        mkdir -p $(SAMPLESDIR)
        cp -pRf samples/* $(SAMPLESDIR)
        find $(SAMPLESDIR) -type d -exec chmod 777 {} \;
        mkdir -p $(EXTRASDIR)
        cp -pRf extras/* $(EXTRASDIR)
-       chmod 777 $(EXTRASDIR)/audio
 endif
 
 ifndef OSX_TARGET
 ifndef WINDOWS_TARGET
 ifdef LINUX_TARGET
-       install -D $(OBJLIBDIR)$(LP)ecere$(SOV) $(LIBDIR)/$(LP)ecere$(SOV)
-       install -D $(OBJLIBDIR)$(LP)ecereCOM$(SOV) $(LIBDIR)/$(LP)ecereCOM$(SOV)
-       install -D $(OBJLIBDIR)$(LP)ec$(SOV) $(LIBDIR)/$(LP)ec$(SOV)
-       install -D $(OBJLIBDIR)$(LP)EDA$(SOV) $(LIBDIR)/$(LP)EDA$(SOV)
-       install -D $(OBJLIBDIR)$(LP)EDASQLite$(SOV) $(LIBDIR)/$(LP)EDASQLite$(SOV)
+       mkdir -p $(DESTLIBDIR)/ec
+       install $(INSTALL_FLAGS) $(OBJLIBDIR)$(LP)ecere$(SOV) $(DESTLIBDIR)/$(LP)ecere$(SOV)
+       install $(INSTALL_FLAGS) $(OBJLIBDIR)$(LP)ecereCOM$(SOV) $(DESTLIBDIR)/$(LP)ecereCOM$(SOV)
+       install $(INSTALL_FLAGS) $(OBJLIBDIR)$(LP)ec$(SOV) $(DESTLIBDIR)/ec/$(LP)ec$(SOV)
+       install $(INSTALL_FLAGS) $(OBJLIBDIR)$(LP)EDA$(SOV) $(DESTLIBDIR)/ec/$(LP)EDA$(SOV)
+       install $(INSTALL_FLAGS) $(OBJLIBDIR)$(LP)EDASQLite$(SOV) $(DESTLIBDIR)/ec/$(LP)EDASQLite$(SOV)
 ifdef EDASQLiteCipher
-       install -D $(OBJLIBDIR)$(LP)EDASQLiteCipher$(SOV) $(LIBDIR)/$(LP)EDASQLiteCipher$(SOV)
+       install $(INSTALL_FLAGS) $(OBJLIBDIR)$(LP)EDASQLiteCipher$(SOV) $(DESTLIBDIR)/ec/$(LP)EDASQLiteCipher$(SOV)
+endif
+ifneq "$(ECERE_AUDIO)" "n"
+       install $(INSTALL_FLAGS) $(OBJLIBDIR)$(LP)EcereAudio$(SO) $(DESTLIBDIR)/ec/$(LP)EcereAudio$(SOV)
 endif
-       ln -sf $(LP)ecere$(SOV) $(LIBDIR)/$(LP)ecere$(SO).0
-       ln -sf $(LP)ecereCOM$(SOV) $(LIBDIR)/$(LP)ecereCOM$(SO).0
-       ln -sf $(LP)ec$(SOV) $(LIBDIR)/$(LP)ec$(SO).0
-       ln -sf $(LP)EDA$(SOV) $(LIBDIR)/$(LP)EDA$(SO).0
-       ln -sf $(LP)EDASQLite$(SOV) $(LIBDIR)/$(LP)EDASQLite$(SO).0
+       ln -sf $(LP)ecere$(SOV) $(DESTLIBDIR)/$(LP)ecere$(SO).0
+       ln -sf $(LP)ecereCOM$(SOV) $(DESTLIBDIR)/$(LP)ecereCOM$(SO).0
+       ln -sf $(LP)ec$(SOV) $(DESTLIBDIR)/ec/$(LP)ec$(SO).0
+       ln -sf $(LP)EDA$(SOV) $(DESTLIBDIR)/ec/$(LP)EDA$(SO).0
+       ln -sf $(LP)EDASQLite$(SOV) $(DESTLIBDIR)/ec/$(LP)EDASQLite$(SO).0
 ifdef EDASQLiteCipher
-       ln -sf $(LP)EDASQLiteCipher$(SOV) $(LIBDIR)/$(LP)EDASQLiteCipher$(SO).0
-endif
-       ln -sf $(LP)ecere$(SOV) $(LIBDIR)/$(LP)ecere$(SO)
-       ln -sf $(LP)ecereCOM$(SOV) $(LIBDIR)/$(LP)ecereCOM$(SO)
-       ln -sf $(LP)ec$(SOV) $(LIBDIR)/$(LP)ec$(SO)
-       ln -sf $(LP)EDA$(SOV) $(LIBDIR)/$(LP)EDA$(SO)
-       ln -sf $(LP)EDASQLite$(SOV) $(LIBDIR)/$(LP)EDASQLite$(SO)
-       mkdir -p $(DESTDIR)$(prefix)/lib/ec
-       ln -sf $(PREFIXLIBDIR)/$(LP)ecere$(SOV) $(DESTDIR)$(prefix)/lib/ec/$(LP)ecere$(SO)
-       ln -sf $(PREFIXLIBDIR)/$(LP)ecereCOM$(SOV) $(DESTDIR)$(prefix)/lib/ec/$(LP)ecereCOM$(SO)
-       ln -sf $(PREFIXLIBDIR)/$(LP)ec$(SOV) $(DESTDIR)$(prefix)/lib/ec/$(LP)ec$(SO)
-       ln -sf $(PREFIXLIBDIR)/$(LP)EDA$(SOV) $(DESTDIR)$(prefix)/lib/ec/$(LP)EDA$(SO)
-       ln -sf $(PREFIXLIBDIR)/$(LP)EDASQLite$(SOV) $(DESTDIR)$(prefix)/lib/ec/$(LP)EDASQLite$(SO)
+       ln -sf $(LP)EDASQLiteCipher$(SOV) $(DESTLIBDIR)/ec/$(LP)EDASQLiteCipher$(SO).0
+endif
+ifneq "$(ECERE_AUDIO)" "n"
+       ln -sf $(LP)EcereAudio$(SOV) $(DESTLIBDIR)/ec/$(LP)EcereAudio$(SO).0
+endif
+       ln -sf $(LP)ecere$(SOV) $(DESTLIBDIR)/$(LP)ecere$(SO)
+       ln -sf $(LP)ecereCOM$(SOV) $(DESTLIBDIR)/$(LP)ecereCOM$(SO)
+       ln -sf $(LP)ec$(SOV) $(DESTLIBDIR)/ec/$(LP)ec$(SO)
+       ln -sf $(LP)EDA$(SOV) $(DESTLIBDIR)/ec/$(LP)EDA$(SO)
+       ln -sf $(LP)EDASQLite$(SOV) $(DESTLIBDIR)/ec/$(LP)EDASQLite$(SO)
+       ln -sf ../$(LP)ecere$(SOV) $(DESTLIBDIR)/ec/$(LP)ecere$(SO)
+       ln -sf ../$(LP)ecereCOM$(SOV) $(DESTLIBDIR)/ec/$(LP)ecereCOM$(SO)
 ifdef EDASQLiteCipher
-       ln -sf $(LP)EDASQLiteCipher$(SOV) $(LIBDIR)/$(LP)EDASQLiteCipher$(SO)
+       ln -sf $(LP)EDASQLiteCipher$(SOV) $(DESTLIBDIR)/ec/$(LP)EDASQLiteCipher$(SO)
 endif
-       install -D -m 644 share/pixmaps/ecere.png $(DESTDIR)$(prefix)/share/pixmaps/ecere.png
-       install -D -m 644 share/applications/ecere.desktop $(DESTDIR)$(prefix)/share/applications/ecere.desktop
-else
-       install -D $(OBJLIBDIR)$(LP)ecere$(SO) $(LIBDIR)/$(LP)ecere$(SO)
-       install -D $(OBJLIBDIR)$(LP)ecereCOM$(SO) $(LIBDIR)/$(LP)ecereCOM$(SO)
-       install -D $(OBJLIBDIR)$(LP)ec$(SO) $(LIBDIR)/$(LP)ec$(SO)
-       install -D $(OBJLIBDIR)$(LP)EDA$(SO) $(LIBDIR)/$(LP)EDA$(SO)
-       install -D $(OBJLIBDIR)$(LP)EDASQLite$(SO) $(LIBDIR)/$(LP)EDASQLite$(SO)
-ifdef EDASQLiteCipher
-       install -D $(OBJLIBDIR)$(LP)EDASQLiteCipher$(SO) $(LIBDIR)/$(LP)EDASQLiteCipher$(SO)
+ifneq "$(ECERE_AUDIO)" "n"
+       ln -sf $(LP)EcereAudio$(SOV) $(DESTLIBDIR)/ec/$(LP)EcereAudio$(SO)
 endif
+ifndef BSD_HOST
+       install $(INSTALL_FLAGS) -m 644 share/pixmaps/ecere.png $(DESTDIR)$(prefix)/share/pixmaps/ecere.png
+       install $(INSTALL_FLAGS) -m 644 share/applications/ecere.desktop $(DESTDIR)$(prefix)/share/applications/ecere.desktop
 endif
-       install -D $(OBJBINDIR)ide$(E) $(BINDIR)/ide$(E)
-       install -D $(OBJBINDIR)ear$(E) $(BINDIR)/ear$(E)
-       install -D $(OBJBINDIR)ecc$(E) $(BINDIR)/ecc$(E)
-       install -D $(OBJBINDIR)ecp$(E) $(BINDIR)/ecp$(E)
-       install -D $(OBJBINDIR)ecs$(E) $(BINDIR)/ecs$(E)
-       install -D $(OBJBINDIR)epj2make$(E) $(BINDIR)/epj2make$(E)
-       install -D $(OBJBINDIR)documentor$(E) $(BINDIR)/documentor$(E)
+else
+       install $(INSTALL_FLAGS) $(OBJLIBDIR)$(LP)ecere$(SO) $(DESTLIBDIR)/$(LP)ecere$(SO)
+       install $(INSTALL_FLAGS) $(OBJLIBDIR)$(LP)ecereCOM$(SO) $(DESTLIBDIR)/$(LP)ecereCOM$(SO)
+endif
+       install $(INSTALL_FLAGS) $(OBJBINDIR)ide$(E) $(BINDIR)/ide$(E)
+       install $(INSTALL_FLAGS) $(OBJBINDIR)ear$(E) $(BINDIR)/ear$(E)
+       install $(INSTALL_FLAGS) $(OBJBINDIR)ecc$(E) $(BINDIR)/ecc$(E)
+       install $(INSTALL_FLAGS) $(OBJBINDIR)ecp$(E) $(BINDIR)/ecp$(E)
+       install $(INSTALL_FLAGS) $(OBJBINDIR)ecs$(E) $(BINDIR)/ecs$(E)
+       install $(INSTALL_FLAGS) $(OBJBINDIR)epj2make$(E) $(BINDIR)/epj2make$(E)
+       install $(INSTALL_FLAGS) $(OBJBINDIR)documentor$(E) $(BINDIR)/documentor$(E)
 ifdef CodeGuard
-       install -D $(OBJBINDIR)CodeGuard$(E) $(BINDIR)/CodeGuard$(E)
-endif
-       install -D $(OBJLIBDIR)libecereVanilla$(A) $(SLIBDIR)/libecereVanilla$(A)
-       install -D -m 644 doc/EDA.eCdoc $(DOCDIR)/EDA.eCdoc
-       install -D -m 644 doc/tao.pdf $(DOCDIR)/"Ecere Tao of Programming [work in progress].pdf" >/dev/null 2>&1 || echo "The Ecere Tao of Programming is available at http://ecere.com/tao.pdf"
-       install -D -m 644 doc/ecere.eCdoc $(DOCDIR)/ecere.eCdoc
-       install -D -m 644 doc/ecereCOM.eCdoc $(DOCDIR)/ecereCOM.eCdoc
-       install -D -m 644 doc/EDA.eCdoc $(DOCDIR)/EDA.eCdoc
+       install $(INSTALL_FLAGS) $(OBJBINDIR)CodeGuard$(E) $(BINDIR)/CodeGuard$(E)
+endif
+       install $(INSTALL_FLAGS) $(OBJLIBDIR)libecereVanilla$(A) $(DESTSLIBDIR)/libecereVanilla$(A)
+ifdef BSD_HOST
+       install $(INSTALL_FLAGS) -d $(DOCDIR)
+endif
+       install $(INSTALL_FLAGS) -m 644 doc/EDA.eCdoc $(DOCDIR)/EDA.eCdoc
+       install $(INSTALL_FLAGS) -m 644 doc/tao.pdf $(DOCDIR)/"Ecere Tao of Programming [work in progress].pdf" >/dev/null 2>&1 || echo "The Ecere Tao of Programming is available at http://ecere.com/tao.pdf"
+       install $(INSTALL_FLAGS) -m 644 doc/ecere.eCdoc $(DOCDIR)/ecere.eCdoc
+       install $(INSTALL_FLAGS) -m 644 doc/ecereCOM.eCdoc $(DOCDIR)/ecereCOM.eCdoc
+       install $(INSTALL_FLAGS) -m 644 doc/EDA.eCdoc $(DOCDIR)/EDA.eCdoc
        mkdir -p $(MANDIR)/man1
        cp -pRf share/man/man1/* $(MANDIR)/man1
        mkdir -p $(SAMPLESDIR)
        cp -pRf samples/* $(SAMPLESDIR)
        find $(SAMPLESDIR) -type d -exec chmod 777 {} \;
        mkdir -p $(EXTRASDIR)
-       cp -dpRf extras/* $(EXTRASDIR)
-       chmod 777 $(EXTRASDIR)/audio
+       cp $(CPFLAGS) extras/* $(EXTRASDIR)
 ifdef DEBIAN_PACKAGE
        mkdir -p $(DESTDIR)$(prefix)/share/doc/libecere0
-       install -D -m644 NEWS $(DESTDIR)$(prefix)/share/doc/libecere0/changelog
-       gzip -f -9 $(DESTDIR)$(prefix)/share/doc/libecere0/changelog
+       install $(INSTALL_FLAG) -m644 NEWS $(DESTDIR)$(prefix)/share/doc/libecere0/changelog
+       gzip -n -f -9 $(DESTDIR)$(prefix)/share/doc/libecere0/changelog
        mkdir -p $(DESTDIR)$(prefix)/share/doc/ecere-dev
        ln -sf ../libecere0/changelog.gz $(DESTDIR)$(prefix)/share/doc/ecere-dev/
        mkdir -p $(DESTDIR)$(prefix)/share/doc/ecere-extras
@@ -616,26 +759,41 @@ ifdef DEBIAN_PACKAGE
        cp $(DESTDIR)$(prefix)/share/doc/libecere0/changelog.gz $(DESTDIR)$(prefix)/share/doc/ecere-samples/
        mkdir -p $(DESTDIR)$(prefix)/share/doc/ecere-sdk
        cp $(DESTDIR)$(prefix)/share/doc/libecere0/changelog.gz $(DESTDIR)$(prefix)/share/doc/ecere-sdk/
-       mkdir -p $(DESTDIR)$(prefix)/share/doc/libec0
-       ln -sf ../libecere0/changelog.gz $(DESTDIR)$(prefix)/share/doc/libec0/
+       mkdir -p $(DESTDIR)$(prefix)/share/doc/libecc0
+       ln -sf ../libecere0/changelog.gz $(DESTDIR)$(prefix)/share/doc/libecc0/
        mkdir -p $(DESTDIR)$(prefix)/share/doc/libecerecom0
        cp $(DESTDIR)$(prefix)/share/doc/libecere0/changelog.gz $(DESTDIR)$(prefix)/share/doc/libecerecom0/
        mkdir -p $(DESTDIR)$(prefix)/share/doc/libeda0
        ln -sf ../libecere0/changelog.gz $(DESTDIR)$(prefix)/share/doc/libeda0/
        mkdir -p $(DESTDIR)$(prefix)/share/doc/libedasqlite0
        ln -sf ../libecere0/changelog.gz $(DESTDIR)$(prefix)/share/doc/libedasqlite0/
+       mkdir -p $(DESTDIR)$(prefix)/share/doc/libecereaudio0
+       ln -sf ../libecere0/changelog.gz $(DESTDIR)$(prefix)/share/doc/libecereaudio0/
 endif
 endif
 endif
 
 uninstall:
-       $(call rmq,"$(LIBDIR)/$(LP)ecere$(SO)")
-       $(call rmq,"$(LIBDIR)/$(LP)ecereCOM$(SO)")
-       $(call rmq,"$(LIBDIR)/$(LP)ec$(SO)")
-       $(call rmq,"$(LIBDIR)/$(LP)EDA$(SO)")
-       $(call rmq,"$(LIBDIR)/$(LP)EDASQLite$(SO)")
+       $(call rmq,"$(DESTLIBDIR)/$(LP)ecere$(SO)")
+       $(call rmq,"$(DESTLIBDIR)/$(LP)ecereCOM$(SO)")
+       $(call rmq,"$(DESTLIBDIR)/$(LP)ec$(SO)")
+       $(call rmq,"$(DESTLIBDIR)/$(LP)EDA$(SO)")
+ifdef LINUX_TARGET
+       $(call rmq,"$(DESTLIBDIR)/ec/$(LP)EDASQLite$(SO)")
+ifdef EDASQLiteCipher
+       $(call rmq,"$(DESTLIBDIR)/ec/$(LP)EDASQLiteCipher$(SO)")
+endif
+ifneq "$(ECERE_AUDIO)" "n"
+       $(call rmq,"$(DESTLIBDIR)/ec/$(LP)EcereAudio$(SO)")
+endif
+else
+       $(call rmq,"$(DESTLIBDIR)/$(LP)EDASQLite$(SO)")
 ifdef EDASQLiteCipher
-       $(call rmq,"$(LIBDIR)/$(LP)EDASQLiteCipher$(SO)")
+       $(call rmq,"$(DESTLIBDIR)/$(LP)EDASQLiteCipher$(SO)")
+endif
+ifneq "$(ECERE_AUDIO)" "n"
+       $(call rmq,"$(DESTLIBDIR)/$(LP)EcereAudio$(SO)")
+endif
 endif
        $(call rmq,"$(BINDIR)/ide$(E)")
        $(call rmq,"$(BINDIR)/ear$(E)")
@@ -647,44 +805,85 @@ endif
 ifdef CodeGuard
        $(call rmq,"$(BINDIR)/CodeGuard$(E)")
 endif
-       $(call rmq,"$(SLIBDIR)/libecereVanilla$(A)")
+       $(call rmq,"$(DESTSLIBDIR)/libecereVanilla$(A)")
        $(call rmq,"$(DOCDIR)/Ecere Tao of Programming [work in progress].pdf")
        $(call rmq,"$(DOCDIR)/ecere.eCdoc")
        $(call rmq,"$(DOCDIR)/ecereCOM.eCdoc")
        $(call rmq,"$(DOCDIR)/EDA.eCdoc")
 ifdef LINUX_TARGET
-       $(call rmq,"$(LIBDIR)/$(LP)ecere$(SO).0")
-       $(call rmq,"$(LIBDIR)/$(LP)ecereCOM$(SO).0")
-       $(call rmq,"$(LIBDIR)/$(LP)ec$(SO).0")
-       $(call rmq,"$(LIBDIR)/$(LP)EDA$(SO).0")
-       $(call rmq,"$(LIBDIR)/$(LP)EDASQLite$(SO).0")
+       $(call rmq,"$(DESTLIBDIR)/$(LP)ecere$(SO).0")
+       $(call rmq,"$(DESTLIBDIR)/$(LP)ecereCOM$(SO).0")
+       $(call rmq,"$(DESTLIBDIR)/ec/$(LP)ec$(SO).0")
+       $(call rmq,"$(DESTLIBDIR)/ec/$(LP)EDA$(SO).0")
+       $(call rmq,"$(DESTLIBDIR)/ec/$(LP)EDASQLite$(SO).0")
 ifdef EDASQLiteCipher
-       $(call rmq,"$(LIBDIR)/$(LP)EDASQLiteCipher$(SO).0")
-endif
-       $(call rmq,"$(LIBDIR)/$(LP)ecere$(SOV)")
-       $(call rmq,"$(LIBDIR)/$(LP)ecereCOM$(SOV)")
-       $(call rmq,"$(LIBDIR)/$(LP)ec$(SOV)")
-       $(call rmq,"$(LIBDIR)/$(LP)EDA$(SOV)")
-       $(call rmq,"$(LIBDIR)/$(LP)EDASQLite$(SOV)")
+       $(call rmq,"$(DESTLIBDIR)/ec/$(LP)EDASQLiteCipher$(SO).0")
+endif
+       $(call rmq,"$(DESTLIBDIR)/ec/$(LP)EcereaAudio$(SO).0")
+       $(call rmq,"$(DESTLIBDIR)/$(LP)ecere$(SOV)")
+       $(call rmq,"$(DESTLIBDIR)/$(LP)ecereCOM$(SOV)")
+       $(call rmq,"$(DESTLIBDIR)/ec/$(LP)ec$(SOV)")
+       $(call rmq,"$(DESTLIBDIR)/ec/$(LP)EDA$(SOV)")
+       $(call rmq,"$(DESTLIBDIR)/ec/$(LP)EDASQLite$(SOV)")
 ifdef EDASQLiteCipher
-       $(call rmq,"$(LIBDIR)/$(LP)EDASQLiteCipher$(SOV)")
+       $(call rmq,"$(DESTLIBDIR)/ec/$(LP)EDASQLiteCipher$(SOV)")
+endif
+ifneq "$(ECERE_AUDIO)" "n"
+       $(call rmq,"$(DESTLIBDIR)/ec/$(LP)EcereAudio$(SOV)")
 endif
        $(call rmq,"$(DESTDIR)$(prefix)/share/pixmaps/ecere.png")
        $(call rmq,"$(DESTDIR)$(prefix)/share/applications/ecere.desktop")
 endif
        $(call rmdirq,"$(BINDIR)/")
-       $(call rmdirq,"$(LIBDIR)/")
-       $(call rmdirq,"$(SLIBDIR)/")
+       $(call rmdirq,"$(DESTLIBDIR)/")
+       $(call rmdirq,"$(DESTSLIBDIR)/")
        $(call rmdirq,"$(DOCDIR)/")
 ifdef WINDOWS_TARGET
        $(call rmdirq,"$(DESTDIR)/")
 endif
        @$(call echo,The Ecere SDK has been uninstalled.)
 
+regenbootstrap: update_ecere update_libec update_ecp update_ecc update_ecs
+       @echo Bootstrap regenerated.
+
+updatebootstrap: regenbootstrap
+       @echo Copying files...
+       $(call cpq,ecere/obj/bootstrap.$(PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/*.c,compiler/bootstrap/ecere/bootstrap)
+       $(call cpq,compiler/libec/obj/bootstrap.$(PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/*.c,compiler/bootstrap/libec/bootstrap)
+       $(call cpq,compiler/ecp/obj/bootstrap.$(PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/*.c,compiler/bootstrap/ecp/bootstrap)
+       $(call cpq,compiler/ecc/obj/bootstrap.$(PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/*.c,compiler/bootstrap/ecc/bootstrap)
+       $(call cpq,compiler/ecs/obj/bootstrap.$(PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/*.c,compiler/bootstrap/ecs/bootstrap)
+       @echo Bootstrap updated.
+
+update_ecere:
+       @echo Regenerating ecere bootstrapper...
+       cd ecere && $(MAKE) -f Makefile.bootstrap clean
+       cd ecere && $(MAKE) -f Makefile.bootstrap
+
+update_libec:
+       @echo Regenerating ec bootstrapper...
+       cd compiler/libec && $(MAKE) -f Makefile.bootstrap clean
+       cd compiler/libec && $(MAKE) -f Makefile.bootstrap
+
+update_ecp:
+       @echo Regenerating ecp bootstrapper...
+       cd compiler/ecp && $(MAKE) -f Makefile.bootstrap clean
+       cd compiler/ecp && $(MAKE) -f Makefile.bootstrap
+
+update_ecc:
+       @echo Regenerating ecc bootstrapper...
+       cd compiler/ecc && $(MAKE) -f Makefile.bootstrap clean
+       cd compiler/ecc && $(MAKE) -f Makefile.bootstrap
+
+update_ecs:
+       @echo Regenerating ecs bootstrapper...
+       cd compiler/ecs && $(MAKE) -f Makefile.bootstrap clean
+       cd compiler/ecs && $(MAKE) -f Makefile.bootstrap
+
 troubleshoot:
        @$(call echo,Printing values of some variables.)
        @$(call echo,HOST_PLATFORM=$(HOST_PLATFORM))
-       @$(call echo,TARGET_PLATFORM=$(HOST_PLATFORM))
+       @$(call echo,TARGET_PLATFORM=$(TARGET_PLATFORM))
        @$(call echo,PLATFORM=$(PLATFORM))
        @$(call echo,LINUX_HOST=$(LINUX_HOST))
        @$(call echo,LINUX_TARGET=$(LINUX_TARGET))
@@ -710,3 +909,12 @@ troubleshoot:
        @$(call echo,AR=$(AR))
        @$(call echo,STRIP=$(STRIP))
        @$(call echo,UPX=$(UPX))
+       @$(call echo,TARGET_ARCH=$(TARGET_ARCH))
+       @$(call echo,DESTDIR=$(DESTDIR))
+       @$(call echo,PREFIXLIBDIR=$(PREFIXLIBDIR))
+       @$(call echo,ARCH=$(ARCH))
+       @$(call echo,ARCH_FLAGS=$(ARCH_FLAGS))
+       @$(call echo,GIT_REPOSITORY=$(GIT_REPOSITORY))
+       @$(call echo,DIR_VER=$(DIR_VER))
+       @$(call echo,REPOSITORY_VER=$(REPOSITORY_VER))
+       @$(call echo,CPPFLAGS=$(CPPFLAGS))