Butterbur: Tesselation support for filling closed paths
[sdk] / Makefile
index 1e8a004..74f2eca 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -1,24 +1,65 @@
-.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
 
-include include.mk
+XBOOT := $(if $(CROSS_TARGET),GCC_PREFIX= TARGET_PLATFORM=$(HOST_PLATFORM) PLATFORM=$(HOST_PLATFORM),)
 
 LIBVER := .0.44
 
-ifdef WINDOWS
+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
+HOST_SOV := $(HOST_SO)$(LIBVER)
+endif
+
+ifdef WINDOWS_TARGET
 
 SOV := $(SO)
 
 ifndef DESTDIR
 
-ifdef ProgramFiles(x86)
-export DESTDIR=${ProgramFiles(x86)}/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
-ifdef ProgramFiles
-export DESTDIR=$(ProgramFiles)/Ecere SDK
-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
@@ -36,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
@@ -50,9 +93,14 @@ export EXTRASDIR=$(DESTDIR)$(prefix)/extras
 endif
 
 
-else # WINDOWS
+else # WINDOWS_TARGET
 
+ifdef OSX_TARGET
+# TODO: OSX soname
+SOV := $(SO)
+else
 SOV := $(SO)$(LIBVER)
+endif
 
 ifndef DESTDIR
 export DESTDIR=
@@ -66,26 +114,39 @@ ifndef DOCDIR
 export DOCDIR=$(DESTDIR)$(prefix)/share/ecere/doc
 endif
 
+ifndef MANDIR
+export MANDIR=$(DESTDIR)$(prefix)/share/man/
+endif
+
 ifndef BINDIR
 export BINDIR=$(DESTDIR)$(prefix)/bin
 endif
 
-HOSTTYPE := $(shell uname -m)
-
-ifndef LIBDIR
-ifeq "$(HOSTTYPE)" "x86_64"
-export LIBDIR=$(DESTDIR)$(prefix)/lib32
+ifdef LIBDIR
+ export PREFIXLIBDIR=$(LIBDIR)
 else
-export LIBDIR=$(DESTDIR)$(prefix)/lib
-endif
+ export PREFIXLIBDIR=$(prefix)/lib/$(TARGET_ARCH)
+
+ 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
 
-ifndef SLIBDIR
-ifeq "$(HOSTTYPE)" "x86_64"
-export SLIBDIR=$(DESTDIR)$(prefix)/lib32
+export CPPFLAGS
+CPPFLAGS += -DDEB_HOST_MULTIARCH=\"$(call escspace,$(PREFIXLIBDIR))\"
+
+DESTLIBDIR := $(DESTDIR)$(PREFIXLIBDIR)
+ifdef SLIBDIR
+DESTSLIBDIR := $(DESTDIR)$(SLIBDIR)
 else
-export SLIBDIR=$(DESTDIR)$(prefix)/lib
-endif
+DESTSLIBDIR := $(DESTLIBDIR)
 endif
 
 ifndef SAMPLESDIR
@@ -99,29 +160,60 @@ endif
 
 endif
 
-all: prepbinaries ide epj2make documentor eda codeguard
+OBJDIR := obj$(OBJALT)/
+OBJBINDIR := $(OBJDIR)$(PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/bin/
+OBJLIBDIR := $(OBJDIR)$(PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/lib/
+XOBJDIR := obj$(OBJALT)/
+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 ecereaudio
        @$(call echo,The Ecere SDK is fully built.)
 
 outputdirs:
-       $(if $(wildcard obj/),,$(call mkdirq,obj/))
-       $(if $(wildcard obj/$(PLATFORM)/bin/),,$(call mkdirq,obj/$(PLATFORM)/bin/))
-       $(if $(wildcard obj/$(PLATFORM)/lib/),,$(call mkdirq,obj/$(PLATFORM)/lib/))
+       $(if $(wildcard $(OBJDIR)),,$(call mkdir,$(OBJDIR)))
+       $(if $(wildcard $(OBJBINDIR)),,$(call mkdir,$(OBJBINDIR)))
+       $(if $(wildcard $(OBJLIBDIR)),,$(call mkdir,$(OBJLIBDIR)))
+ifdef CROSS_TARGET
+       $(if $(wildcard $(XOBJDIR)),,$(call mkdir,$(XOBJDIR)))
+       $(if $(wildcard $(XOBJBINDIR)),,$(call mkdir,$(XOBJBINDIR)))
+       $(if $(wildcard $(XOBJLIBDIR)),,$(call mkdir,$(XOBJLIBDIR)))
+endif
 
 bootstrap: outputdirs
-       cd compiler && $(MAKE) bootstrap
+       cd compiler && $(MAKE) $(XBOOT) bootstrap
 
 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
+       @$(call echo,Building 2nd stage ecere (host)...)
+else
        @$(call echo,Building 2nd stage ecere...)
-       cd ecere && $(MAKE) nores
-       cd ear && $(MAKE) nores
-       cd ecere && $(MAKE) cleantarget
+endif
+       cd ecere && $(MAKE) nores $(XBOOT)
+       cd ear && $(MAKE) nores $(XBOOT)
+       cd ecere && $(MAKE) cleaneceretarget
+ifdef CROSS_TARGET
+       @$(call echo,Building 2nd stage ecere...)
+endif
        cd ecere && $(MAKE)
 
 ecerecom: bootstrap
+ifdef CROSS_TARGET
+       @$(call echo,Building eC Core Runtime (host)...)
+       cd ecere && $(MAKE) -f Makefile.ecereCOM $(XBOOT)
+endif
        @$(call echo,Building eC Core Runtime...)
        cd ecere && $(MAKE) -f Makefile.ecereCOM
 
@@ -134,44 +226,89 @@ 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))
+       cd compiler && $(MAKE) $(XBOOT)
+endif
        @$(call echo,Building 2nd stage compiler)
        cd compiler && $(MAKE)
 
 prepbinaries: compiler ecerecom
        @$(call echo,Enabling 2nd stage binaries...)
-ifdef WINDOWS
-       $(call cpq,ecere/obj/release.$(PLATFORM)/$(LP)ecere$(SOV),obj/$(PLATFORM)/bin/)
-       $(call cpq,ecere/obj/ecereCOM.release.$(PLATFORM)/$(LP)ecereCOM$(SOV),obj/$(PLATFORM)/bin/)
-       $(call cpq,compiler/libec/obj/release.$(PLATFORM)/$(LP)ec$(SOV),obj/$(PLATFORM)/bin/)
-endif
-ifdef LINUX
-       $(call cpq,ecere/obj/release.$(PLATFORM)/$(LP)ecere$(SOV),obj/$(PLATFORM)/lib/)
-       $(call cpq,ecere/obj/ecereCOM.release.$(PLATFORM)/$(LP)ecereCOM$(SOV),obj/$(PLATFORM)/lib/)
-       $(call cpq,compiler/libec/obj/release.$(PLATFORM)/$(LP)ec$(SOV),obj/$(PLATFORM)/lib/)
-       ln -sf $(LP)ecere$(SOV) obj/$(PLATFORM)/lib/$(LP)ecere$(SO).0
-       ln -sf $(LP)ecereCOM$(SOV) obj/$(PLATFORM)/lib/$(LP)ecereCOM$(SO).0
-       ln -sf $(LP)ec$(SOV) obj/$(PLATFORM)/lib/$(LP)ec$(SO).0
-       ln -sf $(LP)ecere$(SOV) obj/$(PLATFORM)/lib/$(LP)ecere$(SO)
-       ln -sf $(LP)ecereCOM$(SOV) obj/$(PLATFORM)/lib/$(LP)ecereCOM$(SO)
-       ln -sf $(LP)ec$(SOV) obj/$(PLATFORM)/lib/$(LP)ec$(SO)
-endif
-ifndef WINDOWS
-ifndef LINUX
-       $(call cpq,ecere/obj/release.$(PLATFORM)/$(LP)ecere$(SO),obj/$(PLATFORM)/lib/)
-       $(call cpq,ecere/obj/ecereCOM.release.$(PLATFORM)/$(LP)ecereCOM$(SO),obj/$(PLATFORM)/lib/)
-       $(call cpq,compiler/libec/obj/release.$(PLATFORM)/$(LP)ec$(SO),obj/$(PLATFORM)/lib/)
-endif
-endif
-       $(call cpq,ear/cmd/obj/release.$(PLATFORM)/ear$(E),obj/$(PLATFORM)/bin/)
-       $(call cpq,compiler/ecc/obj/release.$(PLATFORM)/ecc$(E),obj/$(PLATFORM)/bin/)
-       $(call cpq,compiler/ecp/obj/release.$(PLATFORM)/ecp$(E),obj/$(PLATFORM)/bin/)
-       $(call cpq,compiler/ecs/obj/release.$(PLATFORM)/ecs$(E),obj/$(PLATFORM)/bin/)
+ifdef WINDOWS_TARGET
+       $(call cp,ecere/obj/release.$(PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/$(LP)ecere$(SOV),$(OBJBINDIR))
+       $(call cp,ecere/obj/ecereCOM.release.$(PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/$(LP)ecereCOM$(SOV),$(OBJBINDIR))
+       $(call cp,compiler/libec/obj/release.$(PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/$(LP)ec$(SOV),$(OBJBINDIR))
+endif
+ifdef LINUX_TARGET
+       $(call cp,ecere/obj/release.$(PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/$(LP)ecere$(SOV),$(OBJLIBDIR))
+       $(call cp,ecere/obj/ecereCOM.release.$(PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/$(LP)ecereCOM$(SOV),$(OBJLIBDIR))
+       $(call cp,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
+       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)
+endif
+ifndef WINDOWS_TARGET
+ifndef LINUX_TARGET
+       $(call cp,ecere/obj/release.$(PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/$(LP)ecere$(SO),$(OBJLIBDIR))
+       $(call cp,ecere/obj/ecereCOM.release.$(PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/$(LP)ecereCOM$(SO),$(OBJLIBDIR))
+       $(call cp,compiler/libec/obj/release.$(PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/$(LP)ec$(SO),$(OBJLIBDIR))
+endif
+endif
+       $(call cp,ear/cmd/obj/release.$(PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/ear$(E),$(OBJBINDIR))
+       $(call cp,compiler/ecc/obj/release.$(PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/ecc$(E),$(OBJBINDIR))
+       $(call cp,compiler/ecp/obj/release.$(PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/ecp$(E),$(OBJBINDIR))
+       $(call cp,compiler/ecs/obj/release.$(PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/ecs$(E),$(OBJBINDIR))
+
+ifdef CROSS_TARGET
+
+ifdef WINDOWS_HOST
+       $(call cp,ecere/obj/release.$(HOST_PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/$(HOST_LP)ecere$(HOST_SOV),$(XOBJBINDIR))
+       $(call cp,ecere/obj/ecereCOM.release.$(HOST_PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/$(HOST_LP)ecereCOM$(HOST_SOV),$(XOBJBINDIR))
+       $(call cp,compiler/libec/obj/release.$(HOST_PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/$(HOST_LP)ec$(HOST_SOV),$(XOBJBINDIR))
+endif
+ifdef WINDOWS_HOST
+       $(call cp,ecere/obj/release.$(HOST_PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/$(HOST_LP)ecere$(HOST_SOV),$(XOBJLIBDIR))
+       $(call cp,ecere/obj/ecereCOM.release.$(HOST_PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/$(HOST_LP)ecereCOM$(HOST_SOV),$(XOBJLIBDIR))
+       $(call cp,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
+       ln -sf $(HOST_LP)ecere$(HOST_SOV) $(XOBJLIBDIR)$(LP)ecere$(HOST_SO)
+       ln -sf $(HOST_LP)ecereCOM$(HOST_SOV) $(XOBJLIBDIR)$(LP)ecereCOM$(HOST_SO)
+       ln -sf $(HOST_LP)ec$(HOST_SOV) $(XOBJLIBDIR)$(LP)ec$(HOST_SO)
+endif
+ifndef WINDOWS_HOST
+ifndef LINUX_HOST
+       $(call cp,ecere/obj/release.$(HOST_PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/$(HOST_LP)ecere$(HOST_SO),$(XOBJLIBDIR))
+       $(call cp,ecere/obj/ecereCOM.release.$(HOST_PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/$(HOST_LP)ecereCOM$(HOST_SO),$(XOBJLIBDIR))
+       $(call cp,compiler/libec/obj/release.$(HOST_PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/$(HOST_LP)ec$(HOST_SO),$(XOBJLIBDIR))
+endif
+endif
+       $(call cp,ear/cmd/obj/release.$(HOST_PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/ear$(HOST_E),$(XOBJBINDIR))
+       $(call cp,compiler/ecc/obj/release.$(HOST_PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/ecc$(HOST_E),$(XOBJBINDIR))
+       $(call cp,compiler/ecp/obj/release.$(HOST_PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/ecp$(HOST_E),$(XOBJBINDIR))
+       $(call cp,compiler/ecs/obj/release.$(HOST_PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/ecs$(HOST_E),$(XOBJBINDIR))
+
+endif
 
 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)
@@ -188,203 +325,277 @@ endif
 
 prepcodeguard: eda
 ifdef CodeGuard
-ifdef WINDOWS
-       $(call cpq,eda/libeda/obj/release.$(PLATFORM)/$(LP)EDA$(SO),obj/$(PLATFORM)/bin/)
+ifdef WINDOWS_TARGET
+       $(call cp,eda/libeda/obj/release.$(PLATFORM)/$(LP)EDA$(SO),$(OBJBINDIR))
 endif
 
-ifdef LINUX
-       $(call cpq,eda/libeda/obj/release.$(PLATFORM)/$(LP)EDA$(SOV),obj/$(PLATFORM)/lib/)
-       ln -sf $(LP)EDA$(SOV) obj/$(PLATFORM)/lib/$(LP)EDA$(SO).0
-       ln -sf $(LP)EDA$(SOV) obj/$(PLATFORM)/lib/$(LP)EDA$(SO)
+ifdef LINUX_TARGET
+       $(call cp,eda/libeda/obj/release.$(PLATFORM)/$(LP)EDA$(SOV),$(OBJLIBDIR))
+       ln -sf $(LP)EDA$(SOV) $(OBJLIBDIR)$(LP)EDA$(SO).0
+       ln -sf $(LP)EDA$(SOV) $(OBJLIBDIR)$(LP)EDA$(SO)
 endif
 
-ifndef WINDOWS
-ifndef LINUX
-       $(call cpq,eda/libeda/obj/release.$(PLATFORM)/$(LP)EDA$(SO),obj/$(PLATFORM)/lib/)
+ifndef WINDOWS_TARGET
+ifndef LINUX_TARGET
+       $(call cp,eda/libeda/obj/release.$(PLATFORM)/$(LP)EDA$(SO),$(OBJLIBDIR))
 endif
 endif
 endif
 
 eda: prepbinaries
+ifdef CROSS_TARGET
+       @$(call echo,Building EDA (host))
+       cd eda && $(MAKE) $(XBOOT)
+endif
        @$(call echo,Building EDA...)
        cd eda && $(MAKE)
 
 emptyoutput: outputdirs
-       $(call rmq,obj/$(PLATFORM)/lib/libecereVanilla$(A))
-       $(call rmq,$(SODESTDIR)$(LP)ecere$(SO))
-       $(call rmq,$(SODESTDIR)$(LP)ecereCOM$(SO))
-       $(call rmq,$(SODESTDIR)$(LP)ec$(SO))
-       $(call rmq,$(SODESTDIR)$(LP)EDA$(SO))
-       $(call rmq,$(SODESTDIR)$(LP)EDASQLite$(SO))
+       $(call rm,$(OBJLIBDIR)libecereVanilla$(A))
+       $(call rm,$(SODESTDIR)$(LP)ecere$(SO))
+       $(call rm,$(SODESTDIR)$(LP)ecereCOM$(SO))
+       $(call rm,$(SODESTDIR)$(LP)ec$(SO))
+       $(call rm,$(SODESTDIR)$(LP)EDA$(SO))
+       $(call rm,$(SODESTDIR)$(LP)EDASQLite$(SO))
 ifdef EDASQLiteCipher
-       $(call rmq,$(SODESTDIR)$(LP)EDASQLiteCipher$(SO))
-endif
-ifdef LINUX
-       $(call rmq,$(SODESTDIR)$(LP)ecere$(SO).0)
-       $(call rmq,$(SODESTDIR)$(LP)ecereCOM$(SO).0)
-       $(call rmq,$(SODESTDIR)$(LP)ec$(SO).0)
-       $(call rmq,$(SODESTDIR)$(LP)EDA$(SO).0)
-       $(call rmq,$(SODESTDIR)$(LP)EDASQLite$(SO).0)
+       $(call rm,$(SODESTDIR)$(LP)EDASQLiteCipher$(SO))
+endif
+ifneq ($(ECERE_AUDIO),n)
+       $(call rm,$(SODESTDIR)$(LP)EcereAudio$(SO))
+endif
+ifdef LINUX_TARGET
+       $(call rm,$(SODESTDIR)$(LP)ecere$(SO).0)
+       $(call rm,$(SODESTDIR)$(LP)ecereCOM$(SO).0)
+       $(call rm,$(SODESTDIR)$(LP)ec$(SO).0)
+       $(call rm,$(SODESTDIR)$(LP)EDA$(SO).0)
+       $(call rm,$(SODESTDIR)$(LP)EDASQLite$(SO).0)
 ifdef EDASQLiteCipher
-       $(call rmq,$(SODESTDIR)$(LP)EDASQLiteCipher$(SO).0)
+       $(call rm,$(SODESTDIR)$(LP)EDASQLiteCipher$(SO).0)
+endif
+ifneq ($(ECERE_AUDIO),n)
+       $(call rm,$(SODESTDIR)$(LP)EcereAudio$(SO).0)
 endif
-       $(call rmq,$(SODESTDIR)$(LP)ecere$(SOV))
-       $(call rmq,$(SODESTDIR)$(LP)ecereCOM$(SOV))
-       $(call rmq,$(SODESTDIR)$(LP)ec$(SOV))
-       $(call rmq,$(SODESTDIR)$(LP)EDA$(SOV))
-       $(call rmq,$(SODESTDIR)$(LP)EDASQLite$(SOV))
+       $(call rm,$(SODESTDIR)$(LP)ecere$(SOV))
+       $(call rm,$(SODESTDIR)$(LP)ecereCOM$(SOV))
+       $(call rm,$(SODESTDIR)$(LP)ec$(SOV))
+       $(call rm,$(SODESTDIR)$(LP)EDA$(SOV))
+       $(call rm,$(SODESTDIR)$(LP)EDASQLite$(SOV))
 ifdef EDASQLiteCipher
-       $(call rmq,$(SODESTDIR)$(LP)EDASQLiteCipher$(SOV))
+       $(call rm,$(SODESTDIR)$(LP)EDASQLiteCipher$(SOV))
+endif
+ifneq ($(ECERE_AUDIO),n)
+       $(call rm,$(SODESTDIR)$(LP)EcereAudio$(SOV))
 endif
 endif  
-       $(call rmq,obj/$(PLATFORM)/bin/ear$(E))
-       $(call rmq,obj/$(PLATFORM)/bin/ecc$(E))
-       $(call rmq,obj/$(PLATFORM)/bin/ecp$(E))
-       $(call rmq,obj/$(PLATFORM)/bin/ecs$(E))
-       $(call rmq,obj/$(PLATFORM)/bin/epj2make$(E))
-       $(call rmq,obj/$(PLATFORM)/bin/ide$(E))
-       $(call rmq,obj/$(PLATFORM)/bin/documentor$(E))
-ifdef EDASQLiteCipher
-       $(call rmq,obj/$(PLATFORM)/bin/CodeGuard$(E))
+       $(call rm,$(OBJBINDIR)ear$(E))
+       $(call rm,$(OBJBINDIR)ecc$(E))
+       $(call rm,$(OBJBINDIR)ecp$(E))
+       $(call rm,$(OBJBINDIR)ecs$(E))
+       $(call rm,$(OBJBINDIR)epj2make$(E))
+       $(call rm,$(OBJBINDIR)ide$(E))
+       $(call rm,$(OBJBINDIR)documentor$(E))
+ifdef CodeGuard
+       $(call rm,$(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) realclean
+endif
 ifdef CodeGuard
        cd codeGuard && $(MAKE) realclean
 endif
        cd eda && $(MAKE) realclean
-       $(call rmrq,obj/$(PLATFORM)/)
+       $(call rmr,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
        cd eda && $(MAKE) distclean
-       $(call rmrq,obj/)
+       $(call rmr,obj/)
        @$(call echo,Done.)
 
-DOC = doc/tao.pdf doc/ecere.eCdoc doc/ecereCOM.eCdoc doc/EDA.eCdoc
+DOC = doc
 
 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 obj/$(PLATFORM)/bin/ and obj/$(PLATFORM)/lib/
-# Shared Libraries (in obj/$(PLATFORM)/bin/ on Windows and obj/$(PLATFORM)/lib/ otherwise)
+# Making sure everything is in $(OBJBINDIR) and $(OBJLIBDIR)
+# Shared Libraries (in $(OBJBINDIR) on Windows and $(OBJLIBDIR) otherwise)
 # Symlinks for libs on Linux
-# Binaries (always in obj/$(PLATFORM)/bin/) and Static Libraries (always in obj/$(PLATFORM)/lib/)
+# Binaries (always in $(OBJBINDIR)) and Static Libraries (always in $(OBJLIBDIR))
 prepinstall: $(DOC) $(BINARIES) outputdirs
 
-ifdef WINDOWS
-       $(call cpq,ecere/obj/release.$(PLATFORM)/$(LP)ecere$(SO),obj/$(PLATFORM)/bin/)
-       $(call cpq,ecere/obj/ecereCOM.release.$(PLATFORM)/$(LP)ecereCOM$(SO),obj/$(PLATFORM)/bin/)
-       $(call cpq,compiler/libec/obj/release.$(PLATFORM)/$(LP)ec$(SO),obj/$(PLATFORM)/bin/)
-       $(call cpq,eda/libeda/obj/release.$(PLATFORM)/$(LP)EDA$(SO),obj/$(PLATFORM)/bin/)
-       $(call cpq,eda/drivers/sqlite/obj/release.$(PLATFORM)/$(LP)EDASQLite$(SO),obj/$(PLATFORM)/bin/)
+ifdef WINDOWS_TARGET
+       $(call cp,ecere/obj/release.$(PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/$(LP)ecere$(SO),$(OBJBINDIR))
+       $(call cp,ecere/obj/ecereCOM.release.$(PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/$(LP)ecereCOM$(SO),$(OBJBINDIR))
+       $(call cp,compiler/libec/obj/release.$(PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/$(LP)ec$(SO),$(OBJBINDIR))
+       $(call cp,eda/libeda/obj/release.$(PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/$(LP)EDA$(SO),$(OBJBINDIR))
+       $(call cp,eda/drivers/sqlite/obj/release.$(PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/$(LP)EDASQLite$(SO),$(OBJBINDIR))
+ifneq ($(ECERE_AUDIO),n)
+       $(call cp,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),obj/$(PLATFORM)/bin/)
+       $(call cp,eda/drivers/sqliteCipher/obj/release.$(PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/$(LP)EDASQLiteCipher$(SO),$(OBJBINDIR))
 endif
 endif
 
-ifdef LINUX
-       $(call cpq,ecere/obj/release.$(PLATFORM)/$(LP)ecere$(SOV),obj/$(PLATFORM)/lib/)
-       $(call cpq,ecere/obj/ecereCOM.release.$(PLATFORM)/$(LP)ecereCOM$(SOV),obj/$(PLATFORM)/lib/)
-       $(call cpq,compiler/libec/obj/release.$(PLATFORM)/$(LP)ec$(SOV),obj/$(PLATFORM)/lib/)
-       $(call cpq,eda/libeda/obj/release.$(PLATFORM)/$(LP)EDA$(SOV),obj/$(PLATFORM)/lib/)
-       $(call cpq,eda/drivers/sqlite/obj/release.$(PLATFORM)/$(LP)EDASQLite$(SOV),obj/$(PLATFORM)/lib/)
+ifdef LINUX_TARGET
+       $(call cp,ecere/obj/release.$(PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/$(LP)ecere$(SOV),$(OBJLIBDIR))
+       $(call cp,ecere/obj/ecereCOM.release.$(PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/$(LP)ecereCOM$(SOV),$(OBJLIBDIR))
+       $(call cp,compiler/libec/obj/release.$(PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/$(LP)ec$(SOV),$(OBJLIBDIR))
+       $(call cp,eda/libeda/obj/release.$(PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/$(LP)EDA$(SOV),$(OBJLIBDIR))
+       $(call cp,eda/drivers/sqlite/obj/release.$(PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/$(LP)EDASQLite$(SOV),$(OBJLIBDIR))
+ifneq ($(ECERE_AUDIO),n)
+       $(call cp,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),obj/$(PLATFORM)/lib/)
+       $(call cp,eda/drivers/sqliteCipher/obj/release.$(PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/$(LP)EDASQLiteCipher$(SOV),$(OBJLIBDIR))
 endif
-       ln -sf $(LP)ecere$(SOV) obj/$(PLATFORM)/lib/$(LP)ecere$(SO).0
-       ln -sf $(LP)ecereCOM$(SOV) obj/$(PLATFORM)/lib/$(LP)ecereCOM$(SO).0
-       ln -sf $(LP)ec$(SOV) obj/$(PLATFORM)/lib/$(LP)ec$(SO).0
-       ln -sf $(LP)EDA$(SOV) obj/$(PLATFORM)/lib/$(LP)EDA$(SO).0
-       ln -sf $(LP)EDASQLite$(SOV) obj/$(PLATFORM)/lib/$(LP)EDASQLite$(SO).0
+       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
+       ln -sf $(LP)EDA$(SOV) $(OBJLIBDIR)$(LP)EDA$(SO).0
+       ln -sf $(LP)EDASQLite$(SOV) $(OBJLIBDIR)$(LP)EDASQLite$(SO).0
 ifdef EDASQLiteCipher
-       ln -sf $(LP)EDASQLiteCipher$(SOV) obj/$(PLATFORM)/lib/$(LP)EDASQLiteCipher$(SO).0
+       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) obj/$(PLATFORM)/lib/$(LP)ecere$(SO)
-       ln -sf $(LP)ecereCOM$(SOV) obj/$(PLATFORM)/lib/$(LP)ecereCOM$(SO)
-       ln -sf $(LP)ec$(SOV) obj/$(PLATFORM)/lib/$(LP)ec$(SO)
-       ln -sf $(LP)EDA$(SOV) obj/$(PLATFORM)/lib/$(LP)EDA$(SO)
-       ln -sf $(LP)EDASQLite$(SOV) obj/$(PLATFORM)/lib/$(LP)EDASQLite$(SO)
+
+       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)
+       ln -sf $(LP)EDA$(SOV) $(OBJLIBDIR)$(LP)EDA$(SO)
+       ln -sf $(LP)EDASQLite$(SOV) $(OBJLIBDIR)$(LP)EDASQLite$(SO)
 ifdef EDASQLiteCipher
-       ln -sf $(LP)EDASQLiteCipher$(SOV) obj/$(PLATFORM)/lib/$(LP)EDASQLiteCipher$(SO)
+       ln -sf $(LP)EDASQLiteCipher$(SOV) $(OBJLIBDIR)$(LP)EDASQLiteCipher$(SO)
 endif
+       ln -sf $(LP)EcereAudio$(SOV) $(OBJLIBDIR)$(LP)EcereAudio$(SO)
 endif
 
-ifndef WINDOWS
-ifndef LINUX
-       $(call cpq,ecere/obj/release.$(PLATFORM)/$(LP)ecere$(SO),obj/$(PLATFORM)/lib/)
-       $(call cpq,ecere/obj/ecereCOM.release.$(PLATFORM)/$(LP)ecereCOM$(SO),obj/$(PLATFORM)/lib/)
-       $(call cpq,compiler/libec/obj/release.$(PLATFORM)/$(LP)ec$(SO),obj/$(PLATFORM)/lib/)
-       $(call cpq,eda/libeda/obj/release.$(PLATFORM)/$(LP)EDA$(SO),obj/$(PLATFORM)/lib/)
-       $(call cpq,eda/drivers/sqlite/obj/release.$(PLATFORM)/$(LP)EDASQLite$(SO),obj/$(PLATFORM)/lib/)
+ifndef WINDOWS_TARGET
+ifndef LINUX_TARGET
+       $(call cp,ecere/obj/release.$(PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/$(LP)ecere$(SO),$(OBJLIBDIR))
+       $(call cp,ecere/obj/ecereCOM.release.$(PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/$(LP)ecereCOM$(SO),$(OBJLIBDIR))
+       $(call cp,compiler/libec/obj/release.$(PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/$(LP)ec$(SO),$(OBJLIBDIR))
+       $(call cp,eda/libeda/obj/release.$(PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/$(LP)EDA$(SO),$(OBJLIBDIR))
+       $(call cp,eda/drivers/sqlite/obj/release.$(PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/$(LP)EDASQLite$(SO),$(OBJLIBDIR))
+ifneq ($(ECERE_AUDIO),n)
+       $(call cp,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),obj/$(PLATFORM)/lib/)
+       $(call cp,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),obj/$(PLATFORM)/bin/)
-       $(call cpq,ear/cmd/obj/release.$(PLATFORM)/ear$(E),obj/$(PLATFORM)/bin/)
-       $(call cpq,compiler/ecc/obj/release.$(PLATFORM)/ecc$(E),obj/$(PLATFORM)/bin/)
-       $(call cpq,compiler/ecp/obj/release.$(PLATFORM)/ecp$(E),obj/$(PLATFORM)/bin/)
-       $(call cpq,compiler/ecs/obj/release.$(PLATFORM)/ecs$(E),obj/$(PLATFORM)/bin/)
-       $(call cpq,epj2make/obj/release.$(PLATFORM)/epj2make$(E),obj/$(PLATFORM)/bin/)
-       $(call cpq,documentor/obj/release.$(PLATFORM)/documentor$(E),obj/$(PLATFORM)/bin/)
+       $(call cp,ide/obj/release.$(PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/ide$(E),$(OBJBINDIR))
+       $(call cp,ear/cmd/obj/release.$(PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/ear$(E),$(OBJBINDIR))
+       $(call cp,compiler/ecc/obj/release.$(PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/ecc$(E),$(OBJBINDIR))
+       $(call cp,compiler/ecp/obj/release.$(PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/ecp$(E),$(OBJBINDIR))
+       $(call cp,compiler/ecs/obj/release.$(PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/ecs$(E),$(OBJBINDIR))
+       $(call cp,epj2make/obj/release.$(PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/epj2make$(E),$(OBJBINDIR))
+       $(call cp,documentor/obj/release.$(PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/documentor$(E),$(OBJBINDIR))
 ifdef CodeGuard
-       $(call cpq,codeGuard/obj/release.$(PLATFORM)/CodeGuard$(E),obj/$(PLATFORM)/bin/)
+       $(call cp,codeGuard/obj/release.$(PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/CodeGuard$(E),$(OBJBINDIR))
 endif
-       $(call cpq,ecere/obj/vanilla.$(PLATFORM)/libecereVanilla$(A),obj/$(PLATFORM)/lib/)
+       $(call cp,ecere/obj/vanilla.$(PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/libecereVanilla$(A),$(OBJLIBDIR))
 
 #TODO: Samples?
 install: prepinstall actualinstall
@@ -394,186 +605,295 @@ copyonlyinstall: actualinstall
        @$(call echo,The Ecere SDK has been installed. copyonlyinstall.)
 
 actualinstall:
-ifdef WINDOWS
-       $(call mkdirq,"$(BINDIR)/")
-       $(call mkdirq,"$(SLIBDIR)/")
-       $(call mkdirq,"$(DOCDIR)/")
-       $(call cpq,obj/$(PLATFORM)/bin/$(LP)ecere$(SO),"$(LIBDIR)/")
-       $(call cpq,obj/$(PLATFORM)/bin/$(LP)ecereCOM$(SO),"$(LIBDIR)/")
-       $(call cpq,obj/$(PLATFORM)/bin/$(LP)ec$(SO),"$(LIBDIR)/")
-       $(call cpq,obj/$(PLATFORM)/bin/$(LP)EDA$(SO),"$(LIBDIR)/")
-       $(call cpq,obj/$(PLATFORM)/bin/$(LP)EDASQLite$(SO),"$(LIBDIR)/")
+ifdef WINDOWS_TARGET
+       $(call mkdir,"$(BINDIR)/")
+       $(call mkdir,"$(DESTSLIBDIR)/")
+       $(call mkdir,"$(DOCDIR)/")
+       $(call cp,$(OBJBINDIR)$(LP)ecere$(SO),"$(DESTLIBDIR)/")
+       $(call cp,$(OBJBINDIR)$(LP)ecereCOM$(SO),"$(DESTLIBDIR)/")
+       $(call cp,$(OBJBINDIR)$(LP)ec$(SO),"$(DESTLIBDIR)/")
+       $(call cp,$(OBJBINDIR)$(LP)EDA$(SO),"$(DESTLIBDIR)/")
+       $(call cp,$(OBJBINDIR)$(LP)EDASQLite$(SO),"$(DESTLIBDIR)/")
 ifdef EDASQLiteCipher
-       $(call cpq,obj/$(PLATFORM)/bin/$(LP)EDASQLiteCipher$(SO),"$(LIBDIR)/")
-endif
-       $(call cpq,obj/$(PLATFORM)/bin/ide$(E),"$(BINDIR)/")
-       $(call cpq,obj/$(PLATFORM)/bin/ear$(E),"$(BINDIR)/")
-       $(call cpq,obj/$(PLATFORM)/bin/ecc$(E),"$(BINDIR)/")
-       $(call cpq,obj/$(PLATFORM)/bin/ecp$(E),"$(BINDIR)/")
-       $(call cpq,obj/$(PLATFORM)/bin/ecs$(E),"$(BINDIR)/")
-       $(call cpq,obj/$(PLATFORM)/bin/epj2make$(E),"$(BINDIR)/")
-       $(call cpq,obj/$(PLATFORM)/bin/documentor$(E),"$(BINDIR)/")
+       $(call cp,$(OBJBINDIR)$(LP)EDASQLiteCipher$(SO),"$(DESTLIBDIR)/")
+endif
+ifneq ($(ECERE_AUDIO),n)
+       $(call cp,$(OBJBINDIR)$(LP)EcereAudio$(SO),"$(DESTLIBDIR)/")
+endif
+       $(call cp,$(OBJBINDIR)ide$(E),"$(BINDIR)/")
+       $(call cp,$(OBJBINDIR)ear$(E),"$(BINDIR)/")
+       $(call cp,$(OBJBINDIR)ecc$(E),"$(BINDIR)/")
+       $(call cp,$(OBJBINDIR)ecp$(E),"$(BINDIR)/")
+       $(call cp,$(OBJBINDIR)ecs$(E),"$(BINDIR)/")
+       $(call cp,$(OBJBINDIR)epj2make$(E),"$(BINDIR)/")
+       $(call cp,$(OBJBINDIR)documentor$(E),"$(BINDIR)/")
 ifdef CodeGuard
-       $(call cpq,obj/$(PLATFORM)/bin/CodeGuard$(E),"$(BINDIR)/")
+       $(call cp,$(OBJBINDIR)CodeGuard$(E),"$(BINDIR)/")
 endif
-       $(call cpq,obj/$(PLATFORM)/lib/libecereVanilla$(A),"$(SLIBDIR)/")
-       $(call cpq,doc/tao.pdf,"$(DOCDIR)/Ecere Tao of Programming [work in progress].pdf")
-       $(call cpq,doc/ecere.eCdoc,"$(DOCDIR)/")
-       $(call cpq,doc/ecereCOM.eCdoc,"$(DOCDIR)/")
-       $(call cpq,doc/EDA.eCdoc,"$(DOCDIR)/")
+       $(call cp,$(OBJLIBDIR)libecereVanilla$(A),"$(DESTSLIBDIR)/")
+       $(call cp,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 cpr,$(DOC)/*.econ,"$(DOCDIR)/")
 endif
 
-ifdef OSX 
-       install obj/$(PLATFORM)/lib/$(LP)ecere$(SO) $(LIBDIR)/
-       install obj/$(PLATFORM)/lib/$(LP)ecereCOM$(SO) $(LIBDIR)/
-       install obj/$(PLATFORM)/lib/$(LP)ec$(SO) $(LIBDIR)/
-       install obj/$(PLATFORM)/lib/$(LP)EDA$(SO) $(LIBDIR)/
-       install obj/$(PLATFORM)/lib/$(LP)EDASQLite$(SO) $(LIBDIR)/
+ifdef OSX_TARGET
+       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 obj/$(PLATFORM)/lib/$(LP)EDASQLiteCipher$(SO) $(LIBDIR)/
-endif
-       install obj/$(PLATFORM)/bin/ide$(E) $(BINDIR)/
-       install obj/$(PLATFORM)/bin/ear$(E) $(BINDIR)/
-       install obj/$(PLATFORM)/bin/ecc$(E) $(BINDIR)/
-       install obj/$(PLATFORM)/bin/ecp$(E) $(BINDIR)/
-       install obj/$(PLATFORM)/bin/ecs$(E) $(BINDIR)/
-       install obj/$(PLATFORM)/bin/epj2make$(E) $(BINDIR)/
-       install obj/$(PLATFORM)/bin/documentor$(E) $(BINDIR)/
+       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)/
+       install $(OBJBINDIR)ecc$(E) $(BINDIR)/
+       install $(OBJBINDIR)ecp$(E) $(BINDIR)/
+       install $(OBJBINDIR)ecs$(E) $(BINDIR)/
+       install $(OBJBINDIR)epj2make$(E) $(BINDIR)/
+       install $(OBJBINDIR)documentor$(E) $(BINDIR)/
 ifdef CodeGuard
-       install obj/$(PLATFORM)/bin/CodeGuard$(E) $(BINDIR)/
+       install $(OBJBINDIR)CodeGuard$(E) $(BINDIR)/
 endif
-       install obj/$(PLATFORM)/lib/libecereVanilla$(A) $(SLIBDIR)/
+       install $(OBJLIBDIR)libecereVanilla$(A) $(DESTSLIBDIR)/
        install -d $(DOCDIR)/
-       install doc/tao.pdf $(DOCDIR)/"Ecere Tao of Programming [work in progress].pdf"
-       install doc/ecere.eCdoc $(DOCDIR)/
-       install doc/ecereCOM.eCdoc $(DOCDIR)/
-       install doc/EDA.eCdoc $(DOCDIR)/
-       mkdir -p -m 777 $(SAMPLESDIR)
+       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"
+       $(call cpr,$(DOC)/*.econ,"$(DOCDIR)/")
+       mkdir -p $(MANDIR)/man1
+       cp -pRf share/man/man1/* $(MANDIR)/man1
+       mkdir -p $(SAMPLESDIR)
        cp -pRf samples/* $(SAMPLESDIR)
-       mkdir -p -m 777 $(EXTRASDIR)
+       find $(SAMPLESDIR) -type d -exec chmod 777 {} \;
+       mkdir -p $(EXTRASDIR)
        cp -pRf extras/* $(EXTRASDIR)
 endif
 
-ifndef OSX
-ifndef WINDOWS
-ifdef LINUX
-       install -D obj/$(PLATFORM)/lib/$(LP)ecere$(SOV) $(LIBDIR)/$(LP)ecere$(SOV)
-       install -D obj/$(PLATFORM)/lib/$(LP)ecereCOM$(SOV) $(LIBDIR)/$(LP)ecereCOM$(SOV)
-       install -D obj/$(PLATFORM)/lib/$(LP)ec$(SOV) $(LIBDIR)/$(LP)ec$(SOV)
-       install -D obj/$(PLATFORM)/lib/$(LP)EDA$(SOV) $(LIBDIR)/$(LP)EDA$(SOV)
-       install -D obj/$(PLATFORM)/lib/$(LP)EDASQLite$(SOV) $(LIBDIR)/$(LP)EDASQLite$(SOV)
+ifndef OSX_TARGET
+ifndef WINDOWS_TARGET
+ifdef LINUX_TARGET
+       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 obj/$(PLATFORM)/lib/$(LP)EDASQLiteCipher$(SOV) $(LIBDIR)/$(LP)EDASQLiteCipher$(SOV)
+       install $(INSTALL_FLAGS) $(OBJLIBDIR)$(LP)EDASQLiteCipher$(SOV) $(DESTLIBDIR)/ec/$(LP)EDASQLiteCipher$(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
-ifdef EDASQLiteCipher
-       ln -sf $(LP)EDASQLiteCipher$(SOV) $(LIBDIR)/$(LP)EDASQLiteCipher$(SO).0
+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)
-       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)
+       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)
-endif
-       install -D share/pixmaps/ecere.png $(DESTDIR)$(prefix)/share/pixmaps/ecere.png
-       install -D share/applications/ecere.desktop $(DESTDIR)$(prefix)/share/applications/ecere.desktop
-else
-       install -D obj/$(PLATFORM)/lib/$(LP)ecere$(SO) $(LIBDIR)/$(LP)ecere$(SO)
-       install -D obj/$(PLATFORM)/lib/$(LP)ecereCOM$(SO) $(LIBDIR)/$(LP)ecereCOM$(SO)
-       install -D obj/$(PLATFORM)/lib/$(LP)ec$(SO) $(LIBDIR)/$(LP)ec$(SO)
-       install -D obj/$(PLATFORM)/lib/$(LP)EDA$(SO) $(LIBDIR)/$(LP)EDA$(SO)
-       install -D obj/$(PLATFORM)/lib/$(LP)EDASQLite$(SO) $(LIBDIR)/$(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
-       install -D obj/$(PLATFORM)/lib/$(LP)EDASQLiteCipher$(SO) $(LIBDIR)/$(LP)EDASQLiteCipher$(SO)
+       ln -sf $(LP)EDASQLiteCipher$(SOV) $(DESTLIBDIR)/ec/$(LP)EDASQLiteCipher$(SO)
+endif
+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 obj/$(PLATFORM)/bin/ide$(E) $(BINDIR)/ide$(E)
-       install -D obj/$(PLATFORM)/bin/ear$(E) $(BINDIR)/ear$(E)
-       install -D obj/$(PLATFORM)/bin/ecc$(E) $(BINDIR)/ecc$(E)
-       install -D obj/$(PLATFORM)/bin/ecp$(E) $(BINDIR)/ecp$(E)
-       install -D obj/$(PLATFORM)/bin/ecs$(E) $(BINDIR)/ecs$(E)
-       install -D obj/$(PLATFORM)/bin/epj2make$(E) $(BINDIR)/epj2make$(E)
-       install -D obj/$(PLATFORM)/bin/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 obj/$(PLATFORM)/bin/CodeGuard$(E) $(BINDIR)/CodeGuard$(E)
-endif
-       install -D obj/$(PLATFORM)/lib/libecereVanilla$(A) $(SLIBDIR)/libecereVanilla$(A)
-       install -D doc/tao.pdf $(DOCDIR)/"Ecere Tao of Programming [work in progress].pdf"
-       install -D doc/ecere.eCdoc $(DOCDIR)/ecere.eCdoc
-       install -D doc/ecereCOM.eCdoc $(DOCDIR)/ecereCOM.eCdoc
-       install -D doc/EDA.eCdoc $(DOCDIR)/EDA.eCdoc
-       mkdir -p -m 777 $(SAMPLESDIR)
+       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/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"
+       $(call cpr,$(DOC)/*.econ,"$(DOCDIR)/")
+       mkdir -p $(MANDIR)/man1
+       cp -pRf share/man/man1/* $(MANDIR)/man1
+       mkdir -p $(SAMPLESDIR)
        cp -pRf samples/* $(SAMPLESDIR)
-       mkdir -p -m 777 $(EXTRASDIR)
-       cp -pRf extras/* $(EXTRASDIR)
+       find $(SAMPLESDIR) -type d -exec chmod 777 {} \;
+       mkdir -p $(EXTRASDIR)
+       cp $(CPFLAGS) extras/* $(EXTRASDIR)
+ifdef DEBIAN_PACKAGE
+       mkdir -p $(DESTDIR)$(prefix)/share/doc/libecere0
+       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
+       cp $(DESTDIR)$(prefix)/share/doc/libecere0/changelog.gz $(DESTDIR)$(prefix)/share/doc/ecere-extras/
+       mkdir -p $(DESTDIR)$(prefix)/share/doc/ecere-samples
+       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/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 rm,"$(DESTLIBDIR)/$(LP)ecere$(SO)")
+       $(call rm,"$(DESTLIBDIR)/$(LP)ecereCOM$(SO)")
+       $(call rm,"$(DESTLIBDIR)/$(LP)ec$(SO)")
+       $(call rm,"$(DESTLIBDIR)/$(LP)EDA$(SO)")
+ifdef LINUX_TARGET
+       $(call rm,"$(DESTLIBDIR)/ec/$(LP)EDASQLite$(SO)")
 ifdef EDASQLiteCipher
-       $(call rmq,"$(LIBDIR)/$(LP)EDASQLiteCipher$(SO)")
-endif
-       $(call rmq,"$(BINDIR)/ide$(E)")
-       $(call rmq,"$(BINDIR)/ear$(E)")
-       $(call rmq,"$(BINDIR)/ecc$(E)")
-       $(call rmq,"$(BINDIR)/ecp$(E)")
-       $(call rmq,"$(BINDIR)/ecs$(E)")
-       $(call rmq,"$(BINDIR)/epj2make$(E)")
-       $(call rmq,"$(BINDIR)/documentor$(E)")
-ifdef CodeGuard
-       $(call rmq,"$(BINDIR)/CodeGuard$(E)")
-endif
-       $(call rmq,"$(SLIBDIR)/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
-       $(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 rm,"$(DESTLIBDIR)/ec/$(LP)EDASQLiteCipher$(SO)")
+endif
+ifneq ($(ECERE_AUDIO),n)
+       $(call rm,"$(DESTLIBDIR)/ec/$(LP)EcereAudio$(SO)")
+endif
+else
+       $(call rm,"$(DESTLIBDIR)/$(LP)EDASQLite$(SO)")
 ifdef EDASQLiteCipher
-       $(call rmq,"$(LIBDIR)/$(LP)EDASQLiteCipher$(SO).0")
+       $(call rm,"$(DESTLIBDIR)/$(LP)EDASQLiteCipher$(SO)")
+endif
+ifneq ($(ECERE_AUDIO),n)
+       $(call rm,"$(DESTLIBDIR)/$(LP)EcereAudio$(SO)")
 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)")
+endif
+       $(call rm,"$(BINDIR)/ide$(E)")
+       $(call rm,"$(BINDIR)/ear$(E)")
+       $(call rm,"$(BINDIR)/ecc$(E)")
+       $(call rm,"$(BINDIR)/ecp$(E)")
+       $(call rm,"$(BINDIR)/ecs$(E)")
+       $(call rm,"$(BINDIR)/epj2make$(E)")
+       $(call rm,"$(BINDIR)/documentor$(E)")
+ifdef CodeGuard
+       $(call rm,"$(BINDIR)/CodeGuard$(E)")
+endif
+       $(call rm,"$(DESTSLIBDIR)/libecereVanilla$(A)")
+       $(call rm,"$(DOCDIR)/Ecere Tao of Programming [work in progress].pdf")
+       $(call rm,"$(DOCDIR)/ecere.eCdoc")
+       $(call rm,"$(DOCDIR)/ecereCOM.eCdoc")
+       $(call rm,"$(DOCDIR)/EDA.eCdoc")
+       $(call rmr,"$(DOCDIR)/ecere")
+       $(call rmr,"$(DOCDIR)/ecereCOM")
+       $(call rmr,"$(DOCDIR)/EDA")
+ifdef LINUX_TARGET
+       $(call rm,"$(DESTLIBDIR)/$(LP)ecere$(SO).0")
+       $(call rm,"$(DESTLIBDIR)/$(LP)ecereCOM$(SO).0")
+       $(call rm,"$(DESTLIBDIR)/ec/$(LP)ec$(SO).0")
+       $(call rm,"$(DESTLIBDIR)/ec/$(LP)EDA$(SO).0")
+       $(call rm,"$(DESTLIBDIR)/ec/$(LP)EDASQLite$(SO).0")
+ifdef EDASQLiteCipher
+       $(call rm,"$(DESTLIBDIR)/ec/$(LP)EDASQLiteCipher$(SO).0")
+endif
+       $(call rm,"$(DESTLIBDIR)/ec/$(LP)EcereaAudio$(SO).0")
+       $(call rm,"$(DESTLIBDIR)/$(LP)ecere$(SOV)")
+       $(call rm,"$(DESTLIBDIR)/$(LP)ecereCOM$(SOV)")
+       $(call rm,"$(DESTLIBDIR)/ec/$(LP)ec$(SOV)")
+       $(call rm,"$(DESTLIBDIR)/ec/$(LP)EDA$(SOV)")
+       $(call rm,"$(DESTLIBDIR)/ec/$(LP)EDASQLite$(SOV)")
 ifdef EDASQLiteCipher
-       $(call rmq,"$(LIBDIR)/$(LP)EDASQLiteCipher$(SOV)")
+       $(call rm,"$(DESTLIBDIR)/ec/$(LP)EDASQLiteCipher$(SOV)")
 endif
-       $(call rmq,"$(DESTDIR)$(prefix)/share/pixmaps/ecere.png")
-       $(call rmq,"$(DESTDIR)$(prefix)/share/applications/ecere.desktop")
+ifneq ($(ECERE_AUDIO),n)
+       $(call rm,"$(DESTLIBDIR)/ec/$(LP)EcereAudio$(SOV)")
 endif
-       $(call rmdirq,"$(BINDIR)/")
-       $(call rmdirq,"$(LIBDIR)/")
-       $(call rmdirq,"$(SLIBDIR)/")
-       $(call rmdirq,"$(DOCDIR)/")
-ifdef WINDOWS
-       $(call rmdirq,"$(DESTDIR)/")
+       $(call rm,"$(DESTDIR)$(prefix)/share/pixmaps/ecere.png")
+       $(call rm,"$(DESTDIR)$(prefix)/share/applications/ecere.desktop")
+endif
+       $(call rmdir,"$(BINDIR)/")
+       $(call rmdir,"$(DESTLIBDIR)/")
+       $(call rmdir,"$(DESTSLIBDIR)/")
+       $(call rmdir,"$(DOCDIR)/")
+ifdef WINDOWS_TARGET
+       $(call rmdir,"$(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 cp,ecere/obj/bootstrap.$(PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/*.c,compiler/bootstrap/ecere/bootstrap)
+       $(call cp,compiler/libec/obj/bootstrap.$(PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/*.c,compiler/bootstrap/libec/bootstrap)
+       $(call cp,compiler/ecp/obj/bootstrap.$(PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/*.c,compiler/bootstrap/ecp/bootstrap)
+       $(call cp,compiler/ecc/obj/bootstrap.$(PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/*.c,compiler/bootstrap/ecc/bootstrap)
+       $(call cp,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=$(TARGET_PLATFORM))
+       @$(call echo,PLATFORM=$(PLATFORM))
+       @$(call echo,LINUX_HOST=$(LINUX_HOST))
+       @$(call echo,LINUX_TARGET=$(LINUX_TARGET))
+       @$(call echo,OSX_HOST=$(OSX_HOST))
+       @$(call echo,OSX_TARGET=$(OSX_TARGET))
+       @$(call echo,WINDOWS_HOST=$(WINDOWS_HOST))
+       @$(call echo,WINDOWS_TARGET=$(WINDOWS_TARGET))
+       @$(call echo,BSD_HOST=$(BSD_HOST))
+       @$(call echo,BSD_TARGET=$(BSD_TARGET))
        @$(call echo,CCACHE=$(CCACHE))
        @$(call echo,CCACHE_COMPILE=$(CCACHE_COMPILE))
        @$(call echo,CCACHE_PREFIX=$(CCACHE_PREFIX))
        @$(call echo,DISTCC=$(DISTCC))
+       @$(call echo,GCC_PREFIX=$(GCC_PREFIX))
        @$(call echo,CC=$(CC))
        @$(call echo,CPP=$(CPP))
        @$(call echo,ECP=$(ECP))
@@ -585,3 +905,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))