sdk/Build System: Improved the bootstrap Makefiles
[sdk] / Makefile
index 4017111..4e887d0 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -1,11 +1,20 @@
 .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
 .SILENT:
 
-include include.mk
+include crossplatform.mk
+include default.cf
+
+XBOOT := $(if $(CROSS_TARGET),GCC_PREFIX= TARGET_PLATFORM=$(HOST_PLATFORM) PLATFORM=$(HOST_PLATFORM),)
 
 LIBVER := .0.44
 
-ifdef WINDOWS
+ifdef WINDOWS_HOST
+HOST_SOV := $(HOST_SO)
+else
+HOST_SOV := $(HOST_SO)$(LIBVER)
+endif
+
+ifdef WINDOWS_TARGET
 
 SOV := $(SO)
 
@@ -50,7 +59,7 @@ export EXTRASDIR=$(DESTDIR)$(prefix)/extras
 endif
 
 
-else # WINDOWS
+else # WINDOWS_TARGET
 
 SOV := $(SO)$(LIBVER)
 
@@ -79,8 +88,10 @@ HOSTTYPE := $(shell uname -m)
 ifndef LIBDIR
 ifeq "$(HOSTTYPE)" "x86_64"
 export LIBDIR=$(DESTDIR)$(prefix)/lib32
+export PREFIXLIBDIR=$(prefix)/lib32
 else
 export LIBDIR=$(DESTDIR)$(prefix)/lib
+export PREFIXLIBDIR=$(prefix)/lib
 endif
 endif
 
@@ -106,6 +117,9 @@ endif
 OBJDIR := obj$(OBJALT)/
 OBJBINDIR := $(OBJDIR)$(PLATFORM)/bin/
 OBJLIBDIR := $(OBJDIR)$(PLATFORM)/lib/
+XOBJDIR := obj$(OBJALT)/
+XOBJBINDIR := $(OBJDIR)$(HOST_PLATFORM)/bin/
+XOBJLIBDIR := $(OBJDIR)$(HOST_PLATFORM)/lib/
 
 all: prepbinaries ide epj2make documentor eda codeguard
        @$(call echo,The Ecere SDK is fully built.)
@@ -114,22 +128,42 @@ outputdirs:
        $(if $(wildcard $(OBJDIR)),,$(call mkdirq,$(OBJDIR)))
        $(if $(wildcard $(OBJBINDIR)),,$(call mkdirq,$(OBJBINDIR)))
        $(if $(wildcard $(OBJLIBDIR)),,$(call mkdirq,$(OBJLIBDIR)))
+ifdef CROSS_TARGET
+       $(if $(wildcard $(XOBJDIR)),,$(call mkdirq,$(XOBJDIR)))
+       $(if $(wildcard $(XOBJBINDIR)),,$(call mkdirq,$(XOBJBINDIR)))
+       $(if $(wildcard $(XOBJLIBDIR)),,$(call mkdirq,$(XOBJLIBDIR)))
+endif
 
 bootstrap: outputdirs
-       cd compiler && $(MAKE) bootstrap
+       cd compiler && $(MAKE) $(XBOOT) bootstrap
 
 deps:
+ifdef CROSS_TARGET
+       @$(call echo,Building dependencies (host)...)
+       cd deps && $(MAKE) $(XBOOT)
+endif
        @$(call echo,Building dependencies...)
        cd deps && $(MAKE)
 
 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
+endif
+       cd ecere && $(MAKE) nores $(XBOOT)
+       cd ear && $(MAKE) nores $(XBOOT)
        cd ecere && $(MAKE) cleantarget
+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
 
@@ -143,17 +177,21 @@ ear: ecere ecerevanilla
        cd ear && $(MAKE)
 
 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
+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))
 endif
-ifdef LINUX
+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))
@@ -164,8 +202,8 @@ ifdef LINUX
        ln -sf $(LP)ecereCOM$(SOV) $(OBJLIBDIR)$(LP)ecereCOM$(SO)
        ln -sf $(LP)ec$(SOV) $(OBJLIBDIR)$(LP)ec$(SO)
 endif
-ifndef WINDOWS
-ifndef LINUX
+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))
@@ -176,6 +214,38 @@ endif
        $(call cpq,compiler/ecp/obj/release.$(PLATFORM)/ecp$(E),$(OBJBINDIR))
        $(call cpq,compiler/ecs/obj/release.$(PLATFORM)/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))
+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))
+       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 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))
+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))
+
+endif
+
 epj2make: prepbinaries
        @$(call echo,Building epj2make...)
        cd epj2make && $(MAKE)
@@ -196,18 +266,18 @@ endif
 
 prepcodeguard: eda
 ifdef CodeGuard
-ifdef WINDOWS
+ifdef WINDOWS_TARGET
        $(call cpq,eda/libeda/obj/release.$(PLATFORM)/$(LP)EDA$(SO),$(OBJBINDIR))
 endif
 
-ifdef LINUX
+ifdef LINUX_TARGET
        $(call cpq,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
+ifndef WINDOWS_TARGET
+ifndef LINUX_TARGET
        $(call cpq,eda/libeda/obj/release.$(PLATFORM)/$(LP)EDA$(SO),$(OBJLIBDIR))
 endif
 endif
@@ -227,7 +297,7 @@ emptyoutput: outputdirs
 ifdef EDASQLiteCipher
        $(call rmq,$(SODESTDIR)$(LP)EDASQLiteCipher$(SO))
 endif
-ifdef LINUX
+ifdef LINUX_TARGET
        $(call rmq,$(SODESTDIR)$(LP)ecere$(SO).0)
        $(call rmq,$(SODESTDIR)$(LP)ecereCOM$(SO).0)
        $(call rmq,$(SODESTDIR)$(LP)ec$(SO).0)
@@ -331,7 +401,7 @@ endif
 # Binaries (always in $(OBJBINDIR)) and Static Libraries (always in $(OBJLIBDIR))
 prepinstall: $(DOC) $(BINARIES) outputdirs
 
-ifdef WINDOWS
+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))
@@ -342,7 +412,7 @@ ifdef EDASQLiteCipher
 endif
 endif
 
-ifdef LINUX
+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))
@@ -369,8 +439,8 @@ ifdef EDASQLiteCipher
 endif
 endif
 
-ifndef WINDOWS
-ifndef LINUX
+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))
@@ -402,7 +472,7 @@ copyonlyinstall: actualinstall
        @$(call echo,The Ecere SDK has been installed. copyonlyinstall.)
 
 actualinstall:
-ifdef WINDOWS
+ifdef WINDOWS_TARGET
        $(call mkdirq,"$(BINDIR)/")
        $(call mkdirq,"$(SLIBDIR)/")
        $(call mkdirq,"$(DOCDIR)/")
@@ -431,7 +501,7 @@ endif
        $(call cpq,doc/EDA.eCdoc,"$(DOCDIR)/")
 endif
 
-ifdef OSX 
+ifdef OSX_TARGET
        install $(OBJLIBDIR)$(LP)ecere$(SO) $(LIBDIR)/
        install $(OBJLIBDIR)$(LP)ecereCOM$(SO) $(LIBDIR)/
        install $(OBJLIBDIR)$(LP)ec$(SO) $(LIBDIR)/
@@ -462,9 +532,9 @@ endif
        cp -pRf extras/* $(EXTRASDIR)
 endif
 
-ifndef OSX
-ifndef WINDOWS
-ifdef LINUX
+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)
@@ -487,11 +557,11 @@ endif
        ln -sf $(LP)EDA$(SOV) $(LIBDIR)/$(LP)EDA$(SO)
        ln -sf $(LP)EDASQLite$(SOV) $(LIBDIR)/$(LP)EDASQLite$(SO)
        mkdir -p -m 777 $(DESTDIR)$(prefix)/lib/ec
-       ln -sf $(LIBDIR)/$(LP)ecere$(SOV) $(prefix)/lib/ec/$(LP)ecere$(SO)
-       ln -sf $(LIBDIR)/$(LP)ecereCOM$(SOV) $(prefix)/lib/ec/$(LP)ecereCOM$(SO)
-       ln -sf $(LIBDIR)/$(LP)ec$(SOV) $(prefix)/lib/ec/$(LP)ec$(SO)
-       ln -sf $(LIBDIR)/$(LP)EDA$(SOV) $(prefix)/lib/ec/$(LP)EDA$(SO)
-       ln -sf $(LIBDIR)/$(LP)EDASQLite$(SOV) $(prefix)/lib/ec/$(LP)EDASQLite$(SO)
+       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)
 ifdef EDASQLiteCipher
        ln -sf $(LP)EDASQLiteCipher$(SOV) $(LIBDIR)/$(LP)EDASQLiteCipher$(SO)
 endif
@@ -536,15 +606,15 @@ ifdef DEBIAN_PACKAGE
        mkdir -p -m 777 $(DESTDIR)$(prefix)/share/doc/ecere-dev
        ln -sf ../libecere0/changelog.gz $(DESTDIR)$(prefix)/share/doc/ecere-dev/
        mkdir -p -m 777 $(DESTDIR)$(prefix)/share/doc/ecere-extras
-       ln -sf ../libecere0/changelog.gz $(DESTDIR)$(prefix)/share/doc/ecere-extras/
+       cp $(DESTDIR)$(prefix)/share/doc/libecere0/changelog.gz $(DESTDIR)$(prefix)/share/doc/ecere-extras/
        mkdir -p -m 777 $(DESTDIR)$(prefix)/share/doc/ecere-samples
-       ln -sf ../libecere0/changelog.gz $(DESTDIR)$(prefix)/share/doc/ecere-samples/
+       cp $(DESTDIR)$(prefix)/share/doc/libecere0/changelog.gz $(DESTDIR)$(prefix)/share/doc/ecere-samples/
        mkdir -p -m 777 $(DESTDIR)$(prefix)/share/doc/ecere-sdk
-       ln -sf ../libecere0/changelog.gz $(DESTDIR)$(prefix)/share/doc/ecere-sdk/
+       cp $(DESTDIR)$(prefix)/share/doc/libecere0/changelog.gz $(DESTDIR)$(prefix)/share/doc/ecere-sdk/
        mkdir -p -m 777 $(DESTDIR)$(prefix)/share/doc/libec0
        ln -sf ../libecere0/changelog.gz $(DESTDIR)$(prefix)/share/doc/libec0/
        mkdir -p -m 777 $(DESTDIR)$(prefix)/share/doc/libecerecom0
-       ln -sf ../libecere0/changelog.gz $(DESTDIR)$(prefix)/share/doc/libecerecom0/
+       cp $(DESTDIR)$(prefix)/share/doc/libecere0/changelog.gz $(DESTDIR)$(prefix)/share/doc/libecerecom0/
        mkdir -p -m 777 $(DESTDIR)$(prefix)/share/doc/libeda0
        ln -sf ../libecere0/changelog.gz $(DESTDIR)$(prefix)/share/doc/libeda0/
        mkdir -p -m 777 $(DESTDIR)$(prefix)/share/doc/libedasqlite0
@@ -577,7 +647,7 @@ endif
        $(call rmq,"$(DOCDIR)/ecere.eCdoc")
        $(call rmq,"$(DOCDIR)/ecereCOM.eCdoc")
        $(call rmq,"$(DOCDIR)/EDA.eCdoc")
-ifdef LINUX
+ifdef LINUX_TARGET
        $(call rmq,"$(LIBDIR)/$(LP)ecere$(SO).0")
        $(call rmq,"$(LIBDIR)/$(LP)ecereCOM$(SO).0")
        $(call rmq,"$(LIBDIR)/$(LP)ec$(SO).0")
@@ -601,17 +671,29 @@ endif
        $(call rmdirq,"$(LIBDIR)/")
        $(call rmdirq,"$(SLIBDIR)/")
        $(call rmdirq,"$(DOCDIR)/")
-ifdef WINDOWS
+ifdef WINDOWS_TARGET
        $(call rmdirq,"$(DESTDIR)/")
 endif
        @$(call echo,The Ecere SDK has been uninstalled.)
 
 troubleshoot:
        @$(call echo,Printing values of some variables.)
+       @$(call echo,HOST_PLATFORM=$(HOST_PLATFORM))
+       @$(call echo,TARGET_PLATFORM=$(HOST_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))