# $Id: Makefile 1426 2004-05-02 22:55:07Z bird $
#
# Top level makefile.
#
# InnoTek Systemberatung GmbH confidential
#
# Copyright (c) 2003-2004 Knut St. Osmundsen
# Copyright (c) 2003-2004 InnoTek Systemberatung GmbH
# Author: knut st. osmundsen <bird@anduin.net>
#
# All Rights Reserved
#

			
###############################################################################
##   Global Variables
##   (D = no drive)
###############################################################################
PWD            := $(shell pwd)
PWDD           := $(shell pwd|sed 's/^[a-zA-Z]://')
MAKEFILE		= $(PWD)/Makefile

ifndef BUILD_MODE
export BUILD_MODE=DEBUG
endif

ifndef PATH_TOP
export PATH_TOP  := $(PWD)
endif
ifndef PATH_TOPD
export PATH_TOPD := $(PWDD)
endif


export PATH_BIN        = $(PATH_TOP)/bin/$(BUILD_PLATFORM)/$(BUILD_MODE)
export PATH_BIND       = $(PATH_TOPD)/bin/$(BUILD_PLATFORM)/$(BUILD_MODE)
export PATH_OBJ        = $(PATH_TOP)/obj/$(BUILD_PLATFORM)/$(BUILD_MODE)
export PATH_OBJD       = $(PATH_TOPD)/obj/$(BUILD_PLATFORM)/$(BUILD_MODE)
export PATH_BUILTTOOLS = $(PATH_OBJ)/builttools
export PATH_BUILTTOOLSD= $(PATH_OBJD)/builttools
PATH_BUILTTOOLS_TMP    = $(PATH_OBJ)/builttools.tmp
PATH_BUILTTOOLS_TMPD   = $(PATH_OBJD)/builttools.tmp

# Debug info or not (when ever we feel like passing down such options).
# Several ways to do this it seems.
ifeq "$(BUILD_MODE)" "RELEASE"
BUILD_DEBUGINFO = -s
BUILD_ENABLE_SYMBOLS = --disable-symbols
BUILD_OPTIMIZE	= -O2 -mcpu=pentium -mpreferred-stack-boundary=2 -malign-strings=0 -falign-loops=2 -falign-jumps=2 -falign-functions=2
else
BUILD_OPTIMIZE	= -O0
BUILD_DEBUGINFO = -g
BUILD_ENABLE_SYMBOLS = --enable-symbols
endif	


# Version and CVS defines - real stuff in env.cmd.
export GCC_VERSION              ?= 3.3.3
export GCC_VERSION_SHORT        ?= 333
export GCC_RELEASE_ID           ?= beta5
export GCC_CVS_VENDOR			?= GNU
export GCC_CVS_REL				?= GCC_3-3-3
export BINUTILS_VERSION 		?= 2.14
export BINUTILS_VERSION_SHORT	?= 214
export BINUTILS_CVS_VENDOR		?= GNU
export BINUTILS_CVS_REL			?= BINUTILS_2-14
export EMX_VERSION				?= 0.9d-fix04
export EMX_VERSION_SHORT        ?= 9d04
export EMX_CVS_VENDOR			?= EMX
export EMX_CVS_REL				?= EMX_0-9D-FIX04
export LIBC_VERSION             ?= 0.6.0
export LIBC_VERSION_SHORT       ?= 06

# innotek version and timestamp
ifndef BUILD_TS
export BUILD_TS					:= $(shell date '+%Y-%m-%d %H:%M')
else
export BUILD_TS
endif
export INNOTEK_VERSION			?= (Innotek Build $(BUILD_TS))

			
#    			
# For builds on Linux Host builds we do the environment setup here.
# This is essentially a mimicking of what we do on OS/2.
#
ifndef BUILD_PLATFORM
ifeq "$(shell uname -s)" "Linux"
export BUILD_PLATFORM       ?= LINUX
export BUILD_PROJECT        ?= GCCOS2
export SH                   ?= /bin/sh
export ASH                  ?= /bin/ash
export BASH                 ?= /bin/bash
export AWK                  ?= /bin/gawk
export GAWK                 ?= /bin/gawk
export CONFIG_SHELL         ?= $(SH)
export MAKESHELL            ?= $(SH)
export PATH_EMX             ?= /usr
export PATH_IGCC            ?= /usr
export TMP                  ?= /tmp
export TMPDIR               ?= /tmp
endif
endif
export PATH_IGCC            ?= $(PATH_EMXPGCC)
export PATH_EMXPGCC         ?= $(PATH_IGCC)



# Misc Helpers
ALL_PREFIX                  = $(PATH_BIND)/$(GCC_VERSION)-$(GCC_RELEASE_ID)/usr
TOOL_CVS_DIFF_TREE          = -cvs diff -R -N -w -u -r
ifeq "$(BUILD_PLATFORM)" "OS2"
NICE						= nice -i
else
NICE						=
endif

							


###############################################################################
###############################################################################
###############################################################################
###############################################################################
#
#    M a i n   R u l e z
#
###############################################################################
###############################################################################
###############################################################################
###############################################################################

# default is quick
all: all-quick
all-logged: all-quick-logged

# release builds are built 'double quick'.
all-double-quick:



# old bootstrap building.
bootstrap all-boostrap:	
	mkdir -p $(PATH_OBJ)
	$(NICE) $(MAKE) $(MAKEOPT) -j 1 -C . all-bootstrap-logged 2>&1 | $(UNIXROOT)/usr/bin/tee $(PATH_OBJ)/build-`date +"%Y%m%d-%H%M%S"`.log

all-bootstrap-logged:	\
        all-banner-start \
		all-env \
		all-sanity \
		all-preload \
		all-versionstamps \
		all-symlinks \
		\
        all-stage1 \
        all-stage2 \
		\
		all-install \
		\
		all-symlinks-unlink \
		all-preload-unload
	@echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
	@echo "+ Make Ended Successfully: $(shell date)"
	@echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"

#
# banners
#
		
all-banner-start:
	@echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
	@echo "+ Make started: $(shell date)"
	@echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
		
all-banner-stage1:
	@echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
	@echo "+ Stage 1 - starting: $(shell date)"
	@echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"

all-banner-stage2:
	@echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
	@echo "+ Stage 2 - starting: $(shell date)"
	@echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
	
all-banner-builttools-initial:
	@echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
	@echo "+ Initializing builttools tree"
	@echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
		
all-banner-builttools-stage2:
	@echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
	@echo "+ Copying stage2 builttools"
	@echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"

all-banner-install:
	@echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
	@echo "+ Install - starting: $(shell date)"
	@echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
	
all-banner-install-done:
	@echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
	@echo "+ Install - done: $(shell date)"
	@echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"

all-banner-symlinks-start:
	@echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
	@echo "+ symlinks - staring: $(shell date)"
	@echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
		
all-banner-symlinks-done:
	@echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
	@echo "+ symlinks - done: $(shell date)"
	@echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"

all-banner-symlinks-unlink-start:
	@echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
	@echo "+ symlinks unlinking - staring: $(shell date)"
	@echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
		
all-banner-symlinks-unlink-done:
	@echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
	@echo "+ symlinks unlinking - done: $(shell date)"
	@echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
								
		
#
# Sanity and environment dumps - to make it easier to figure out make bugs.
#

.PHONY: all-env
all-env:	
	@echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
	@echo "Variables:"
	@echo "    PWD                  = $(PWD)"
	@echo "    PWDD                 = $(PWDD)"
	@echo "    PATH_TOP             = $(PATH_TOP)"
	@echo "    PATH_TOPD            = $(PATH_TOPD)"
	@echo "    PATH_OBJ             = $(PATH_OBJ)"
	@echo "    PATH_OBJD            = $(PATH_OBJD)"
	@echo "    PATH_BIN             = $(PATH_BIN)"
	@echo "    PATH_BIND            = $(PATH_BIND)"
	@echo "    ALL_PREFIX           = $(ALL_PREFIX)"
	@echo "    PATH_IGCC         = $(PATH_IGCC)"
	@echo "    PATH_EMX             = $(PATH_EMX)"
	@echo "    BUILD_MODE           = $(BUILD_MODE)"
	@echo "    BUILD_PLATFORM       = $(BUILD_PLATFORM)"
	@echo "    BUILD_PROJECT        = $(BUILD_PROJECT)"
	@echo "    GCC_VERSION          = $(GCC_VERSION)"
	@echo "    GCC_VERSION_SHORT    = $(GCC_VERSION_SHORT)"
	@echo "    GCC_CVS_VENDOR       = $(GCC_CVS_VENDOR)"
	@echo "    GCC_CVS_REL          = $(GCC_CVS_REL)"
	@echo "    BINUTILS_VERSION     = $(BINUTILS_VERSION)"
	@echo "    BINUTILS_VERSION_SHORT = $(BINUTILS_VERSION_SHORT)"
	@echo "    BINUTILS_CVS_VENDOR  = $(BINUTILS_CVS_VENDOR)"
	@echo "    BINUTILS_CVS_REL     = $(BINUTILS_CVS_REL)"
	@echo "    EMX_VERSION          = $(EMX_VERSION)"
	@echo "    EMX_VERSION_SHORT    = $(EMX_VERSION_SHORT)"
	@echo "    EMX_CVS_VENDOR       = $(EMX_CVS_VENDOR)"
	@echo "    EMX_CVS_REL          = $(EMX_CVS_REL)"
	@echo "    MAKEFILE             = $(MAKEFILE)"
	@echo "    UNIXROOT             = $(UNIXROOT)"
	@echo "    AC_PREFIX            = $(AC_PREFIX)"
	@echo "    AC_MACRODIR          = $(AC_MACRODIR)"
	@echo "    HOSTNAME             = $(HOSTNAME)"
	@echo "    USER                 = $(USER)"
	@echo "    LOGNAME              = $(LOGNAME)"
	@echo "    TMP                  = $(TMP)"
	@echo "    TMPDIR               = $(TMPDIR)"
	@echo "    USER                 = $(USER)"
	@echo "    AWK                  = $(AWK)"
	@echo "    GAWK                 = $(GAWK)"
	@echo "    SH                   = $(SH)"
	@echo "    ASH                  = $(ASH)"
	@echo "    BASH                 = $(BASH)"
	@echo "    CONFIG_SHELL         = $(CONFIG_SHELL)"
	@echo "    MAKESHELL            = $(MAKESHELL)"
	@echo "    EMXSHELL             = $(EMXSHELL)"
	@echo "    SHELL                = $(SHELL)"
	@echo "    MAKE                 = $(MAKE)"
	@echo "    MAKEOPT              = $(MAKEOPT)"
	@echo "    PATH                 = $(PATH)"
	@echo "    C_INCLUDE_PATH       = $(C_INCLUDE_PATH)"
	@echo "    CPLUS_INCLUDE_PATH   = $(CPLUS_INCLUDE_PATH)"
	@echo "    OBJC_INCLUDE_PATH    = $(OBJC_INCLUDE_PATH)"
	@echo "    LIBRARY_PATH         = $(LIBRARY_PATH)"
	@echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
	@echo "Content of PATH_OBJ:"
	-ls -la $(PATH_OBJ)/
	@echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
	@echo "Content of PATH_BIN:"
	-ls -la $(PATH_BIN)/
	@echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
	
	
.PHONY: all-sanity
all-sanity:
	@echo -n "Checking build environment sanity... "
	@if [ "x$(BUILD_PROJECT)" != "xGCCOS2" ]; then \
		echo ""; echo "Error: BUILD_PROJECT is wrong or isn't defined!"; \
		exit 8; \
	fi
	@if [ "x$(BUILD_PLATFORM)" != "xOS2" -a "x$(BUILD_PLATFORM)" != "xLINUX" ]; then \
		echo ""; echo "Error: BUILD_PLATFORM is wrong or isn't defined!"; \
		exit 8; \
	fi
	@if [ "x$(BUILD_PLATFORM)" = "xOS2" -a "x$(UNIXROOT)" = "x" ]; then \
		echo ""; echo "Error: UNIXROOT isn't defined!"; \
		exit 8; \
	fi
	@if [ "x$(BUILD_PLATFORM)" != "xOS2" -a "x$(UNIXROOT)" != "x" ]; then \
		echo ""; echo "Error: UNIXROOT is defined!"; \
		exit 8; \
	fi
ifeq "$(BUILD_PLATFORM)" "OS2"
	@if gcc --version | grep -qe ".*[3]\.[2-9]\.[0-9]"; then \
		true; \
	else \
		echo ""; echo "Warning: GCC v3.2.x or higher is recommended!"; \
	fi
	@if ar --version | grep -qe ".*2\.11\.[2-9]" -e ".*[2]\.1[2-9][.0-9]*"; then \
		true; \
	else \
		echo ""; echo "Warning: AR v2.11.2 or higher is recommended!"; \
	fi
endif
	@echo "ok"
	

#
# Preload tools we commonly use this speeds up stuff.
#   									
PRELOADED_TOOLS = bin/sh.exe bin/echo.exe bin/true.exe usr/bin/test.exe usr/bin/expr.exe \
     usr/bin/gawk.exe bin/sed.exe bin/rm.exe bin/cat.exe bin/cp.exe bin/mkdir.exe bin/rm.exe
	
.PHONY: all-preload-unload all-preload
all-preload:
	@echo "Preloading tools:"
ifeq "$(BUILD_PLATFORM)" "OS2"
	@for tool in $(PRELOADED_TOOLS); do \
	    echo -n " $$tool";	\
		emxload -e $(UNIXROOT)/$$tool;	\
	done
	@echo ""
	emxload -e gcc.exe g++.exe ld.exe as.exe ar.exe ld.exe emxomfld.exe emxomf.exe emxomfar.exe \
		`gcc -print-prog-name=cc1` \
		`gcc -print-prog-name=as` \
		`gcc -print-prog-name=cc1plus`
endif
	@echo ""
	
all-preload-unload:
ifeq "$(BUILD_PLATFORM)" "OS2"
	emxload -qw
endif


#
# Version stamping/branding.
# 	Update various version strings which are printed from the tools to tell
#	the build date and that's our built. This helps us tell releases apart.
#
# IMPORTANT! Take care not to commit the changed files
# (TODO! Try make these changes to non-cvs backed files. (long-term-goal))
.PHONY: all-versionstamps
all-versionstamps: $(PATH_OBJ)/.ts.versionstamped
$(PATH_OBJ)/.ts.versionstamped:	
	echo '#define INNOTEK_VERSION  "$(INNOTEK_VERSION)"' > include/innotekversion.h
	$(MAKE) $(MAKEOPT) -j 1 -f $(MAKEFILE) "INNOTEK_VERSION=$(INNOTEK_VERSION)" gcc-versionstamps binutils-versionstamps emx-versionstamps
	mkdir -p $(@D)
	touch $@


#
# Stages
#	A rebuild with the new toolsuite is usually required when there is ABI
# 	changes and other vital changes done to the tools.
#	

.PHONY: all-stage1 all-stage1-it
all-stage1: $(PATH_OBJ)/.all-stage1
$(PATH_OBJ)/.all-stage1:
	$(MAKE) $(MAKEOPT) -j 1 -f $(MAKEFILE) all-stage1-it
	echo "$(@F)" > $(PATH_OBJ)/.last-stage
	touch $@
	@echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
	@echo "+ Stage 1 - done: $(shell date)"
	@echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"

all-stage1-it: \
		all-banner-stage1 \
		all-builttools-initial \
        all-binutils \
		all-gcc	\
		all-emx
		
.PHONY: all-stage2 all-stage2-it
all-stage2: $(PATH_OBJ)/.all-stage2
$(PATH_OBJ)/.all-stage2: \
		$(PATH_OBJ)/.all-stage2.save-stage1
	$(MAKE) $(MAKEOPT) -j 1 -f $(MAKEFILE) all-stage2-it
	echo "$(@F)" > $(PATH_OBJ)/.last-stage
	touch $@
	@echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
	@echo "+ Stage 2 - done: $(shell date)"
	@echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"

$(PATH_OBJ)/.all-stage2.save-stage1:
	@echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
	@echo "+ Saving Stage 1 - Starting: $(shell date)"
	@echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
	$(MAKE) $(MAKEOPT) -j 1 -f $(MAKEFILE) all-preload-unload
	$(MAKE) $(MAKEOPT) -j 1 -f $(MAKEFILE) all-builttools-stage2
	rm -Rf $(PATH_OBJ)/stage1
	mkdir -p $(PATH_OBJ)/stage1
	if [ -d $(PATH_OBJ)/gcc ] ; then mv $(PATH_OBJ)/gcc $(PATH_OBJ)/stage1/gcc; fi
	if [ -d $(PATH_OBJ)/emx ] ; then mv $(PATH_OBJ)/emx $(PATH_OBJ)/stage1/emx; fi
	$(MAKE) $(MAKEOPT) -j 1 -f $(MAKEFILE) all-preload
	touch $@
	@echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
	@echo "+ Saving Stage 1 - done: $(shell date)"
	@echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
	
all-stage2-it: \
		all-banner-stage2 \
        all-binutils \
		all-gcc \
        all-emx


#
# Install to bin tree makeing it ready for packing.
#
.PHONY: all-install
all-install: \
	all-banner-install \
	gcc-install	\
	emx-install \
	misc-install \
	all-strip-install \
	all-banner-install-done \

# strips release build installations.
.PHONY: all-strip-install
all-strip-install:
ifeq ($(BUILD_MODE), RELEASE)
	echo "Stripping installed binaries..."
	exes="`find $(PATH_BIN) -name '*.exe' | sed -e 's,/,\\\\,g'`"; \
	dlls="`find $(PATH_BIN) -name '*.dll' | sed -e 's,/,\\\\,g'`"; \
	for i in $$exes $$dlls; \
	do \
		if lxlite /F+ /AP:4096 /MRN /MLN /MF1 $$i; then true; \
		else exit 1; \
		fi; \
	done
endif	

	
#
# Generate all the diffs we have to supply.
#
.PHONY: all-diff
all-diff: \
	gcc-diff \
	binutils-diff \
	emx-diff \
	
										
	
	

###############################################################################
###############################################################################
###############################################################################
#
#    Q u i c k   b o o t s t r a p p i n g
#
###############################################################################
###############################################################################
###############################################################################

# This is the default buildtype now.
# It requires a very up-to-date gcc build, not good for bootstrapping from old GCCs.
.PHONY: quick all-quick
quick all-quick:
	mkdir -p $(PATH_OBJ)
	$(NICE) $(MAKE) $(MAKEOPT) -j 1 -C . all-quick-logged 2>&1 | $(UNIXROOT)/usr/bin/tee $(PATH_OBJ)/build-`date +"%Y%m%d-%H%M%S"`.log

all-quick-banner-start:
	@echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
	@echo "+ Quick Bootstrap started:            $(shell date)"
	@echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
.PHONY: all-quick-logged	
all-quick-logged: \
        all-quick-banner-start \
		all-env \
		all-sanity \
		all-quick-builttools-initial \
		all-versionstamps \
		all-symlinks-unlink \
		\
		all-quick-step1 \
		all-quick-step2 \
		all-quick-step3 \
		all-quick-step4 \
		\
		all-quick-install \
		all-preload-unload
	@echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
	@echo "+ Quick Bootstrap Ended Successfully: $(shell date)"
	@echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
	
.PHONY: all-quick-builttools-initial
all-quick-builttools-initial: $(PATH_OBJ)/.quick-builttools-initial
all-quick-builttools-initial-it: \
		all-preload-unload \
		all-builttools-initial \
		all-preload
$(PATH_OBJ)/.quick-builttools-initial:
	$(MAKE) $(MAKEOPT) -f $(MAKEFILE) all-quick-builttools-initial-it
	touch $@
		

# This build type is used for release builds.
# We're doing two quick builds here to ensure everything is alright.
.PHONY: double-quick all-double-quick
double-quick all-double-quick:
	mkdir -p $(PATH_OBJ)
	$(NICE) $(MAKE) $(MAKEOPT) -j 1 -C . all-double-quick-logged 2>&1 | $(UNIXROOT)/usr/bin/tee $(PATH_OBJ)/build-`date +"%Y%m%d-%H%M%S"`.log

all-double-quick-banner-start:
	@echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
	@echo "+ Double Quick Bootstrap started:            $(shell date)"
	@echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
PHONY: all-double-quick-logged
all-double-quick-logged: \
        all-double-quick-banner-start \
		all-env \
		all-sanity \
		all-preload-unload \
		all-double-quick-builttools-initial \
		all-preload \
		all-versionstamps \
		all-symlinks-unlink \
		\
		all-double-quick-stage1 \
		all-preload-unload \
		all-double-quick-save-stage1 \
		all-preload \
		all-double-quick-stage2 \
		\
		all-quick-install \
		all-preload-unload
	@echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
	@echo "+ Double Quick Bootstrap Ended Successfully: $(shell date)"
	@echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"

.PHONY: all-double-quick-builttools-initial
all-double-quick-builttools-initial: $(PATH_OBJ)/.doublequick-builttools-initial
all-double-quick-builttools-initial-it: \
		all-preload-unload \
		all-builttools-initial \
		all-preload
$(PATH_OBJ)/.doublequick-builttools-initial:
	$(MAKE) $(MAKEOPT) -f $(MAKEFILE) all-double-quick-builttools-initial-it
	touch $@
	
# stage1
.PHONY: all-double-quick-stage1 all-double-quick-stage1-it
all-double-quick-stage1: $(PATH_OBJ)/.doublequick-stage1
all-double-quick-stage1-it: \
		all-quick-step1 \
		all-quick-step2 \
		all-quick-step3 \
		all-quick-step4
$(PATH_OBJ)/.doublequick-stage1:
	@echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
	@echo "+ Double Quick Bootstrap Stage 1 - starting: $(shell date)"
	@echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
	$(MAKE) $(MAKEOPT) -f $(MAKEFILE) all-double-quick-stage1-it
	@echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
	@echo "+ Double Quick Bootstrap Stage 1 - done:     $(shell date)"
	@echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
	touch $@	
	
# save stage1	
.PHONY: all-double-quick-save-stage1 all-double-quick-save-stage1-it
all-double-quick-save-stage1: $(PATH_OBJ)/.doublequick-stage1-saved
all-double-quick-save-stage1-it: all-preload-unload
	mkdir -p $(PATH_OBJ)/stage1
	if [ -d $(PATH_OBJ)/emx      ]; then rm -Rf $(PATH_OBJ)/stage1/emx      && mv $(PATH_OBJ)/emx      $(PATH_OBJ)/stage1/emx;      fi
	if [ -d $(PATH_OBJ)/binutils ]; then rm -Rf $(PATH_OBJ)/stage1/binutils && mv $(PATH_OBJ)/binutils $(PATH_OBJ)/stage1/binutils; fi
	if [ -d $(PATH_OBJ)/gcc      ]; then rm -Rf $(PATH_OBJ)/stage1/gcc      && mv $(PATH_OBJ)/gcc      $(PATH_OBJ)/stage1/gcc;      fi
	if [ -f $(PATH_OBJ)/.quick-last-step ]; then mv -f $(PATH_OBJ)/.quick-last-step  $(PATH_OBJ)/stage1; fi
	rm -f $(PATH_OBJ)/.quick*
$(PATH_OBJ)/.doublequick-stage1-saved:
	@echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
	@echo "+ Double Quick Bootstrap Saving Stage 1 - starting:  $(shell date)"
	@echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
	$(MAKE) $(MAKEOPT) -f $(MAKEFILE) all-double-quick-save-stage1-it
	@echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
	@echo "+ Double Quick Bootstrap Saving Stage 1 - done:      $(shell date)"
	@echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
	touch $@

# stage2	
.PHONY: all-double-quick-stage2 all-double-quick-stage2-it
all-double-quick-stage2: $(PATH_OBJ)/.doublequick-stage2
all-double-quick-stage2-it: \
		all-quick-step1 \
		all-quick-step2 \
		all-quick-step3 \
		all-quick-step4
$(PATH_OBJ)/.doublequick-stage2:
	@echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
	@echo "+ Double Quick Bootstrap Stage 2 - starting: $(shell date)"
	@echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
	$(MAKE) $(MAKEOPT) -f $(MAKEFILE) all-double-quick-stage2-it
	@echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
	@echo "+ Double Quick Bootstrap Stage 2 - done:     $(shell date)"
	@echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
	touch $@	
	
		
# step 1 builds the base libraries.	
.PHONY: all-quick-step1 all-quick-step1-it
all-quick-step1: $(PATH_OBJ)/.quick-step1
all-quick-step1-it: \
		all-preload \
        emx-quick-libs \
		all-preload-unload \
		emx-quick-libs-install \
		all-preload
$(PATH_OBJ)/.quick-step1:
	@echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
	@echo "+ Quick Bootstrap Step 1 - starting: $(shell date)"
	@echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
	$(MAKE) $(MAKEOPT) -f $(MAKEFILE) all-quick-step1-it
	echo "$(@F)" > $(PATH_OBJ)/.quick-last-step
	touch $@
	@echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
	@echo "+ Quick Bootstrap Step 1 - done:     $(shell date)"
	@echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"

# step 2 builds the emx base utilities.
.PHONY: all-quick-step2 all-quick-step2-it
all-quick-step2: $(PATH_OBJ)/.quick-step2
all-quick-step2-it: \
        emx-quick-rest \
		all-preload-unload \
		emx-quick-rest-install \
		all-preload
$(PATH_OBJ)/.quick-step2:
	@echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
	@echo "+ Quick Bootstrap Step 2 - starting: $(shell date)"
	@echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
	$(MAKE) $(MAKEOPT) -f $(MAKEFILE) all-quick-step2-it
	echo "$(@F)" > $(PATH_OBJ)/.quick-last-step
	touch $@
	@echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
	@echo "+ Quick Bootstrap Step 2 - done:     $(shell date)"
	@echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"

# step 3 builds all the binutil utilities and libraries.
.PHONY: all-quick-step3 all-quick-step3-it
all-quick-step3: $(PATH_OBJ)/.quick-step3
all-quick-step3-it: \
        binutils-quick \
		all-preload-unload \
		binutils-quick-installstage \
		all-preload
$(PATH_OBJ)/.quick-step3:
	@echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
	@echo "+ Quick Bootstrap Step 3 - starting: $(shell date)"
	@echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
	$(MAKE) $(MAKEOPT) -f $(MAKEFILE) all-quick-step3-it
	echo "$(@F)" > $(PATH_OBJ)/.quick-last-step
	touch $@
	@echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
	@echo "+ Quick Bootstrap Step 3 - done:     $(shell date)"
	@echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"

# step 4 builds gcc.
.PHONY: all-quick-step4 all-quick-step4-it
all-quick-step4: $(PATH_OBJ)/.quick-step4
all-quick-step4-it: \
        gcc-quick \
		all-preload-unload \
		gcc-quick-installstage \
		all-preload
$(PATH_OBJ)/.quick-step4:
	@echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
	@echo "+ Quick Bootstrap Step 4 - starting: $(shell date)"
	@echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
	$(MAKE) $(MAKEOPT) -f $(MAKEFILE) all-quick-step4-it
	echo "$(@F)" > $(PATH_OBJ)/.quick-last-step
	touch $@
	@echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
	@echo "+ Quick Bootstrap Step 4 - done:     $(shell date)"
	@echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"


# Installs the stuff we've built.			
.PHONY: all-quick-install
all-quick-install: \
		all-banner-install \
		gcc-install	\
		binutils-install \
		emx-install \
		misc-install \
		all-strip-install \
		all-banner-install-done
		
	
###############################################################################
###############################################################################
###############################################################################
#
#    B u i l t   T o o l s
#
###############################################################################
###############################################################################
###############################################################################
		
all-builttools-initial: \
		all-banner-builttools-initial \
		all-builttools-clean \
        all-builttools-dirs \
		$(PATH_BUILTTOOLS)/bin/dllar.cmd \
		$(PATH_BUILTTOOLS)/omfhack/ar.exe \
		$(PATH_BUILTTOOLS)/omfhack/realar.exe \
		$(PATH_BUILTTOOLS)/omfhack/ranlib.exe
		
all-builttools-clean: \
		all-preload-unload
	rm -Rf $(PATH_BUILTTOOLS)
	
all-builttools-dirs:
	mkdir -p $(PATH_BUILTTOOLS)/bin $(PATH_BUILTTOOLS)/lib $(PATH_BUILTTOOLS)/include $(PATH_BUILTTOOLS)/omfhack
	
$(PATH_BUILTTOOLS)/bin/dllar.cmd $(PATH_BUILTTOOLS_TMP)/bin/dllar.cmd: $(PATH_TOP)/src/misc/dllar.cmd
	cp $< $@
$(PATH_BUILTTOOLS)/omfhack/ranlib.exe $(PATH_BUILTTOOLS_TMP)/omfhack/ranlib.exe: $(PATH_TOP)/tools/bin/true.exe
	cp $< $@
$(PATH_BUILTTOOLS)/omfhack/ar.exe: $(PATH_IGCC)/bin/emxomfar.exe
	cp $< $@
$(PATH_BUILTTOOLS_TMP)/omfhack/ar.exe: $(PATH_BUILTTOOLS_TMP)/bin/emxomfar.exe
	cp $< $@
$(PATH_BUILTTOOLS)/omfhack/realar.exe $(PATH_BUILTTOOLS_TMP)/omfhack/realar.exe: $(PATH_IGCC)/bin/ar.exe
	cp $< $@
$(PATH_BUILTTOOLS_TMP)/omfhack:
	mkdir -p $@
	
all-builttools-stage2: \
		all-banner-builttools-stage2 \
		gcc-builttools-stage2 \
		emx-builttools-stage2 \
		all-builttools-stage2-libs \
		$(PATH_BUILTTOOLS_TMP)/bin/dllar.cmd \
		$(PATH_BUILTTOOLS_TMP)/omfhack \
		$(PATH_BUILTTOOLS_TMP)/omfhack/ar.exe \
		$(PATH_BUILTTOOLS_TMP)/omfhack/realar.exe \
		$(PATH_BUILTTOOLS_TMP)/omfhack/ranlib.exe \
		all-builttools-clean
	mv -f $(PATH_BUILTTOOLS_TMP) $(PATH_BUILTTOOLS)
	
all-builttools-stage2-libs:
	-for aoutlib in `find $(PATH_BUILTTOOLS_TMP) -name "*.a" | sed -e 's/\.a$$//' `; \
	do \
		if [ ! -f $(aoutlib).lib ]; then \
			echo "  $${aoutlib}"; \
			$(PATH_BUILTTOOLS_TMP)/bin/emxomf.exe -p256 $${aoutlib}.a; \
		fi;\
	done


###############################################################################
###############################################################################
###############################################################################
#
#    S y m l i n k s
#
#
#		We use symlinking of binutils stuff into the gcc tree so we can
#		build everything in one go and take advantage of the gcc
#		makesystem which will use the binutils we built when doing the
#		gcc libraries and such.
#
#		On OS/2 symlinks doesn't exist so, we'll copy the source trees.
#		Copy because this will for directories work ok with cvs, moving
#		directories would cause 'cvs update -d' to refetch stuff.
#
#		IMPORTANT! Take care, the 'symlined' stuff will be removed at the
#		end of the build. Remeber to do all-symlinks-unlink before a fresh
#		build is started as the duplicated binutils things doesn't get
#		updated by cvs.
#
#
#w##############################################################################
###############################################################################
###############################################################################
all-symlinks: \
		all-banner-symlinks-start \
		all-symlinks-binutils \
		all-banner-symlinks-done

all-symlinks-unlink: \
		all-banner-symlinks-unlink-start \
		all-symlinks-unlink-binutils \
		all-banner-symlinks-unlink-done
		
		
ifeq "$(BUILD_PLATFORM)" "OS2"
TOOL_SYMLINK_FILE   = cp -p
TOOL_SYMLINK_DIR    = cp -pRf
TOOL_SYMLINK_MKDIR  = mkdir
TOOL_UNSYMLINK_DIR  = rm -Rf
else
TOOL_SYMLINK_FILE   = ln -fs
TOOL_SYMLINK_DIR    = ln -fs
TOOL_SYMLINK_MKDIR  = true
TOOL_UNSYMLINK_DIR  = rm
endif

# ld is broken, so don't use it!	
# ld \

SYMLINKS_BINUTILS_TO_GCC_DIRS = \
bfd \
binutils \
etc \
gas \
gprof \
intl \
opcodes \
texinfo \
libiberty \
include/aout \
include/coff \
include/elf	\
include/gdb	\
include/mpw	\
include/nlm	\
include/opcode \
include/regs \

SYMLINKS_BINUTILS_TO_GCC_FILES = \
include/alloca-conf.h \
include/ansidecl.h \
include/bfdlink.h \
include/bin-bugs.h \
include/bout.h \
include/ChangeLog \
include/COPYING \
include/demangle.h \
include/dis-asm.h \
include/dyn-string.h \
include/fibheap.h \
include/filenames.h \
include/floatformat.h \
include/fnmatch.h \
include/fopen-bin.h \
include/fopen-same.h \
include/fopen-vms.h \
include/gdbm.h \
include/getopt.h \
include/hashtab.h \
include/hp-symtab.h \
include/ieee.h \
include/libiberty.h \
include/MAINTAINERS \
include/md5.h \
include/oasys.h \
include/objalloc.h \
include/obstack.h \
include/os9k.h \
include/partition.h \
include/progress.h \
include/safe-ctype.h \
include/sort.h \
include/splay-tree.h \
include/symcat.h \
include/ternary.h \
include/xregex.h \
include/xregex2.h \
include/xtensa-config.h \
include/xtensa-isa-internal.h \
include/xtensa-isa.h \

	
# Symlink binutils stuff to gcc.
# 	Note the test should've been "! -e", but that doesn' work in ash... :/
all-symlinks-binutils:
	for file in $(SYMLINKS_BINUTILS_TO_GCC_FILES); do \
		if [ ! -f "$(PATH_TOP)/src/gcc/.symlinked.`echo $${file} | sed -e 's@/@_@g'`" ]; then  \
			echo symlinking file src/gcc/$${file} to src/binutils/$${file} ; \
			if 	rm -f $(PATH_TOP)/src/gcc/$$file && \
				$(TOOL_SYMLINK_FILE)  $(PATH_TOP)/src/binutils/$$file $(PATH_TOP)/src/gcc/$$file && \
				touch                 $(PATH_TOP)/src/gcc/.symlinked.`echo $${file} | sed -e 's@/@_@g'`; \
				then true ; \
			else exit 1; \
			fi ; \
		fi ; \
	done	
	for dir in $(SYMLINKS_BINUTILS_TO_GCC_DIRS) ; do \
		if [ ! -f "$(PATH_TOP)/src/gcc/.symlinked.`echo $${dir} | sed -e 's@/@_@g'`" ] ; then  \
			echo symlinking directory src/gcc/$${dir} to src/binutils/$${dir} ; \
			if [ -d "$(PATH_TOP)/src/gcc/$$dir" ] ; then \
			    echo removing existing directory: $${dir} ; \
				rm -Rf $(PATH_TOP)/src/gcc/$$dir ; \
			fi ; \
			if 	$(TOOL_SYMLINK_MKDIR) $(PATH_TOP)/src/gcc/$$dir && \
				$(TOOL_SYMLINK_DIR)   $(PATH_TOP)/src/binutils/$$dir $(PATH_TOP)/src/gcc/`echo $${dir}| sed -e '/\//!d' -e 's@\([a-zA-z0-9]*\)/.*@\1/@'` ; \
				touch                 $(PATH_TOP)/src/gcc/.symlinked.`echo $${dir} | sed -e 's@/@_@g'` ; \
				then true ; \
			else exit 1; \
			fi ; \
		fi ; \
	done
	-ls -a1 src/gcc/.sym*

all-symlinks-unlink-binutils:
	for name in `ls src/gcc/.symlinked* | sed -e "s/.*\.symlinked.//" -e "s/_/\//g"`; do \
		echo unlinking $${name} ; \
		if [ -d "$(PATH_TOP)/src/gcc/$${name}" ] ; then  \
			rm -Rf $(PATH_TOP)/src/gcc/$${name} ; \
		else \
			rm -f $(PATH_TOP)/src/gcc/$${name} ; \
		fi ; \
		if [ ! -f "$(PATH_TOP)/src/gcc/$${name}" -a ! -d "$(PATH_TOP)/src/gcc/$${name}" ] ; then \
			rm  $(PATH_TOP)/src/gcc/.symlinked.`echo $${name} | sed -e 's@/@_@g'` ; \
		else \
			echo "unlink error: $(PATH_TOP)/src/gcc/$${name} exist" ; \
			ls -l "$(PATH_TOP)/src/gcc/$${name}" ; \
			exit 1; \
		fi ; \
	done
	-ls -a1 src/gcc/.sym*
						

###############################################################################
###############################################################################
###############################################################################
#
#    G C C
#
###############################################################################
###############################################################################
###############################################################################
all-gcc       gcc:	\
        gcc-autoconf-refresh \
        gcc-bootstrap
	echo "Successfully build GCC."



GCC_DIRS = \
gcc/libiberty \
gcc/zlib \
gcc/gcc \
gcc/libstdc++-v3 \
gcc/boehm-gc \
gcc/fastjar \
gcc/libf2c \
gcc/libf2c/libF77 \
gcc/libf2c/libI77 \
gcc/libf2c/libU77 \
gcc/libffi \
gcc/libjava \
gcc/libjava/libltdl \
gcc/libobjc \

# Here is a problem, we can't regenerate binutils makefiles when symlinked into
# gcc. At least not yet. The result is messed up severely.
not_yet =\
gcc/bfd \
gcc/binutils \
gcc/gas \
gcc/gprof \
gcc/ld \
gcc/libiberty \
gcc/opcodes
#gcc/intl

GCC_CONFIGURE_DIRS = $(GCC_DIRS)


# configure.in/configure
.PHONY: gcc-autoconf-refresh gcc-autoconf-rerun gcc-autoconf-clean gcc-autoconf-remove
gcc-autoconf-refresh gcc-autoconf-rerun gcc-autoconf-clean gcc-autoconf-remove:
ifeq "$(BUILD_PLATFORM)" "LINUX"
	-$(SH) $(PATH_TOP)/xfix.sh
endif
	for dir in $(GCC_CONFIGURE_DIRS); do \
		echo $$dir; \
		if $(MAKE) $(MAKEOPT) -j 1 $(@:gcc-autoconf-%=%) -f $(PWD)/config.gmk -C src/$$dir ; then \
			true; \
		else \
			exit 8; \
		fi \
	done

	
# build the components.
.PHONY: gcc-bootstrap gcc-build gcc-install gcc-configure
gcc-bootstrap gcc-build gcc-install gcc-configure:
	mkdir -p $(PATH_OBJ)/gcc
	$(MAKE) $(MAKEOPT) -j 1 -C $(PATH_OBJ)/gcc -f $(MAKEFILE) $@-it


# When changed directory
#   We pass down BOOT_ flags for stage2+.
#   Because strip is broken on OS/2 we pass -s for release build and -g for
#   non release builds - This overrides some stuff in src/gcc/gcc/config/i386/t-emx!
# For the 2nd stage we need a hack for using the right specs when linking...
#SPEC_HACK = $(if $(wildchar $(PATH_OBJ)/.all-stage1),\
#              -specs $(PATH_TOP)/src/emx/src/lib/libc.specs, \
#              -specs $(PATH_TOP)/tools/x86.os2/gcc/staged/lib/gcc-lib/i386-pc-os2-emx/$(GCC_VERSION)/specs)
SPECS_HACK =
gcc-bootstrap-it gcc-build-it: \
		$(PATH_OBJ)/gcc/.ts.configured
ifeq "$(BUILD_PLATFORM)" "OS2"		
	unset GCCLOAD ; export LT_OS2_LDFLAGS="-Zomf -g" ; \
	$(MAKE) $(MAKEOPT) -C $(PATH_OBJ)/gcc \
	    LIBGCC2_DEBUG_CFLAGS="$(BUILD_DEBUGINFO) $(BUILD_OPTIMIZE) -Zhigh-mem " \
		      CFLAGS="$(SPEC_HACK) $(BUILD_DEBUGINFO) $(BUILD_OPTIMIZE) -Zhigh-mem" \
		    CXXFLAGS="$(SPEC_HACK) $(BUILD_DEBUGINFO) $(BUILD_OPTIMIZE) -Zhigh-mem" \
		 BOOT_CFLAGS="$(SPEC_HACK) $(BUILD_DEBUGINFO) $(BUILD_OPTIMIZE) -Zhigh-mem" \
		     LDFLAGS="$(SPEC_HACK) $(BUILD_DEBUGINFO) -Zhigh-mem -Zcrtdll -Zstack 1024 -Zomf" \
		BOOT_LDFLAGS="$(SPEC_HACK) $(BUILD_DEBUGINFO) -Zhigh-mem -Zcrtdll -Zstack 1024 -Zomf" \
		$(subst build, all, $(patsubst gcc-%-it, %, $@))
else
	$(MAKE) $(MAKEOPT) -C $(PATH_OBJ)/gcc $(subst build, all, $(patsubst gcc-%-it, %, $@))
endif	
		
# configure it (invoked after directory change).
# 	We set CC to help configure finding it.
# 	We also set some LDFLAGS to get omf linking.
gcc-configure-it $(PATH_OBJ)/gcc/.ts.configured: $(PATH_TOP)/src/gcc/configure
ifeq "$(BUILD_PLATFORM)" "OS2"
	$(ASH) -c " \
		export CC=\"gcc.exe\" ; \
		export LDFLAGS=\"$(SPEC_HACK) $(BUILD_DEBUGINFO) -Zhigh-mem -Zcrtdll -Zstack 1024 -Zomf\" ; \
		export BOOT_LDFLAGS=\"$(SPEC_HACK) $(BUILD_DEBUGINFO) -Zhigh-mem -Zcrtdll -Zstack 1024 -Zomf\" ; \
		$< \
		--enable-clh \
		--enable-threads=os2 \
		--enable-shared=libgcc,bfd,opcodes \
		--enable-nls \
		--without-included-gettext \
		--with-local-prefix=$(subst \,/,$(PATH_IGCC)) \
		--prefix=/gcc \
		--with-gnu-as \
		--disable-libgcj \
		--enable-languages=c,c++ "
else
	$(ASH) -c "$< \
		--disable-clh \
		--enable-shared=libgcc,bfd,opcodes \
		--enable-nls \
		--without-included-gettext \
		--with-local-prefix=$(subst \,/,$(PATH_IGCC)) \
		--prefix=/gcc \
		--with-gnu-as \
		--disable-libgcj \
		--enable-languages=c,c++ "
endif
	touch $(PATH_OBJ)/gcc/.ts.configured
# TODO: Andy, on Linux --enable-clh result in linking errors.

# Install the GCC build
#	Repeating the prefix doesn't hurt anybody.
gcc-install-it:
	$(MAKE) $(MAKEOPT) prefix=$(ALL_PREFIX) install


# easy, update src/gcc/gcc/version.c
gcc-versionstamps:
	@echo "Version stamping gcc..."
	mv -f $(PATH_TOP)/src/gcc/gcc/version.c $(PATH_TOP)/src/gcc/gcc/version.tmp.c
	sed -e '/version_string/s/\([0-9]\.[0-9]*\.[0-9]*\).*/\1 $(INNOTEK_VERSION)";/' \
		$(PATH_TOP)/src/gcc/gcc/version.tmp.c > $(PATH_TOP)/src/gcc/gcc/version.c
	rm -f $(PATH_TOP)/src/gcc/gcc/version.tmp.c


# Install to builttools directory.	
##     WARNING! Another spec HACK!
gcc-builttools-stage2:
	$(MAKE) $(MAKEOPT) -C $(PATH_OBJ)/gcc prefix=$(PATH_BUILTTOOLS_TMPD) install
##	cp $(PATH_TOP)/src/emx/src/lib/libc.specs $(PATH_OBJ)/gcc/gcc/specs


# Quick bootstrap workers.
gcc-quick:  \
	gcc-autoconf-refresh \
	gcc-build
	
gcc-quick-installstage:
	rm -Rf $(PATH_BUILTTOOLS_TMP)
	$(MAKE) $(MAKEOPT) -C $(PATH_OBJ)/gcc prefix=$(PATH_BUILTTOOLS_TMPD) install
	cp -Rf $(PATH_BUILTTOOLS_TMP)/* $(PATH_BUILTTOOLS)/
	rm -Rf $(PATH_BUILTTOOLS_TMP)

		
# Generate diffs for GCC - part of packing a release.
.PHONY: gcc-diff $(ALL_PREFIX)/src/diffs/gcc-$(GCC_VERSION).diff
gcc-diff: $(ALL_PREFIX)/src/diffs/gcc-$(GCC_VERSION).diff
$(ALL_PREFIX)/src/diffs/gcc-$(GCC_VERSION).diff:
	mkdir -p $(@D)
	$(TOOL_CVS_DIFF_TREE) $(GCC_CVS_REL) src/gcc > $@





###############################################################################
###############################################################################
###############################################################################
#
#    B i n U t i l s
#
###############################################################################
###############################################################################
###############################################################################

BINUTILS_DIRS = \
binutils/bfd \
binutils/opcodes \
binutils/gas \
binutils/gprof \
binutils/binutils \
binutils/ld \

BINUTILS_NOT_DIRS =\
binutils/etc \
binutils/libiberty
#binutils/intl


BINUTILS_CONFIGURE_DIRS = $(BINUTILS_DIRS) $(BINUTILS_NOT_DIRS)

all-binutils  binutils:
	echo "Binutils are build together with the other GNU Tools in GCC."
	echo "Separate building of binutils is not configured."

binutils214:	\
        binutils-autoconf-refresh \
        binutils-build
	echo "Successfully build Binutils v2.14."



# configure.in/configure
.PHONY: binutils-autoconf-refresh binutils-autoconf-rerun binutils-autoconf-clean binutils-autoconf-remove
binutils-autoconf-refresh binutils-autoconf-rerun binutils-autoconf-clean binutils-autoconf-remove:
ifeq "$(BUILD_PLATFORM)" "LINUX"
	-$(SH) $(PATH_TOP)/xfix.sh
endif
	for dir in $(BINUTILS_CONFIGURE_DIRS); do \
		if $(MAKE) $(MAKEOPT) -j 1 $(@:binutils-autoconf-%=%) -f $(PWD)/config.gmk -C src/$$dir ; then \
			true; \
		else \
			exit 8; \
		fi \
	done


# build the components.
.PHONY: binutils-build binutils-install binutils-configure binutils-configure-elf
binutils-build binutils-install binutils-configure binutils-configure-elf:
	mkdir -p $(PATH_OBJ)/binutils
	$(MAKE) $(MAKEOPT) -C $(PATH_OBJ)/binutils -f $(MAKEFILE) $@-it


# When changed directory
binutils-build-it: \
		$(PATH_OBJ)/binutils/.ts.configured
	unset GCCLOAD ; export LT_OS2_LDFLAGS="-Zomf -g -Zmap" ; \
	$(MAKE) $(MAKEOPT) -C $(PATH_OBJ)/binutils \
		CFLAGS="$(BUILD_DEBUGINFO) $(BUILD_OPTIMIZE) -Zhigh-mem" \
		LDFLAGS="$(BUILD_DEBUGINFO) -Zhigh-mem -Zstack 1024 -Zomf"
	unset GCCLOAD ; export LT_OS2_LDFLAGS="-Zomf -g -Zmap" ; \
	$(MAKE) $(MAKEOPT) -C $(PATH_OBJ)/binutils/gas-elf \
		CFLAGS="$(BUILD_DEBUGINFO) $(BUILD_OPTIMIZE) -Zhigh-mem" \
		LDFLAGS="$(BUILD_DEBUGINFO) -Zhigh-mem -Zstack 1024 -Zomf"
	unset GCCLOAD ; export LT_OS2_LDFLAGS="-Zomf -g -Zmap" ; \
	$(MAKE) $(MAKEOPT) -C $(PATH_OBJ)/binutils/ld-elf \
		CFLAGS="$(BUILD_DEBUGINFO) $(BUILD_OPTIMIZE) -Zhigh-mem" \
		LDFLAGS="$(BUILD_DEBUGINFO) -Zhigh-mem -Zstack 1024 -Zomf"
		
# configure it (invoked after directory change).
# 	We set CC to help configure finding it.
#	And we reconfigure libiberty to the gcc one.
binutils-configure-it $(PATH_OBJ)/binutils/.ts.configured: $(PATH_TOP)/src/binutils/configure
ifeq "$(BUILD_PLATFORM)" "OS2"
	$(ASH) -c " \
		CC=\"gcc.exe\" \
		CFLAGS=\"$(BUILD_DEBUGINFO) $(BUILD_OPTIMIZE) -Zhigh-mem\"  \
		LDFLAGS=\"$(BUILD_DEBUGINFO) -Zhigh-mem -Zstack 1024 -Zomf\" \
		$< \
		--enable-clh \
		--enable-threads=os2 \
		--enable-shared=libgcc,bfd,opcodes \
		--enable-nls \
		--without-included-gettext \
		--with-local-prefix=$(subst \,/,$(PATH_IGCC)) \
		--prefix=/gcc \
		--with-gnu-as \
		--disable-libgcj \
		--enable-languages=c,c++ "
else
	$(ASH) -c "$< \
		--disable-clh \
		--enable-shared=libgcc,bfd,opcodes \
		--enable-nls \
		--without-included-gettext \
		--with-local-prefix=$(subst \,/,$(PATH_IGCC)) \
		--prefix=/gcc \
		--with-gnu-as \
		--disable-libgcj \
		--enable-languages=c,c++ "
endif
	mkdir -p gas-elf
	$(ASH) -c "cd gas-elf && \
		CC=\"gcc.exe\" \
		CFLAGS=\"$(BUILD_DEBUGINFO) $(BUILD_OPTIMIZE) -Zhigh-mem\" \
		LDFLAGS=\"$(BUILD_DEBUGINFO) -Zhigh-mem -Zstack 1024 -Zomf\" \
		$(PATH_TOP)/src/binutils/gas/configure \
		--target=i386-pc-os2-elf \
		--enable-shared=libgcc,bfd,opcodes \
		--enable-nls \
		--without-included-gettext \
		--with-local-prefix=$(subst \,/,$(PATH_IGCC)) \
		--prefix=/gcc \
		--with-gnu-as \
		--program-suffix=-elf "
	mkdir -p ld-elf
	$(ASH) -c "cd ld-elf && \
		CC=\"gcc.exe\" \
		CFLAGS=\"$(BUILD_DEBUGINFO) $(BUILD_OPTIMIZE) -Zhigh-mem\"  \
		LDFLAGS=\"$(BUILD_DEBUGINFO) -Zhigh-mem -Zstack 1024 -Zomf\" \
		$(PATH_TOP)/src/binutils/ld/configure \
		--target=i386-pc-os2-elf \
		--enable-shared=libgcc,bfd,opcodes \
		--enable-nls \
		--without-included-gettext \
		--with-local-prefix=$(subst \,/,$(PATH_IGCC)) \
		--prefix=/gcc \
		--with-gnu-as \
		--program-suffix=-elf "
	touch $(PATH_OBJ)/binutils/.ts.configured
		
	
	
# Install the Binutils build
#	Repeating the prefix doesn't hurt anybody.
binutils-install-it:
	cd gas-elf && $(MAKE) $(MAKEOPT) prefix=$(ALL_PREFIX) install
	cd ld-elf  && $(MAKE) $(MAKEOPT) prefix=$(ALL_PREFIX) install
	$(MAKE) $(MAKEOPT) prefix=$(ALL_PREFIX) install
	mv -f $(ALL_PREFIX)/bin/ld.exe  $(ALL_PREFIX)/bin/ld-bad.exe
	mv -f $(ALL_PREFIX)/i386-pc-os2-emx/bin/ld.exe  $(ALL_PREFIX)/i386-pc-os2-emx/bin/ld-bad.exe


# Not so easy, need to patch a few files.
binutils-versionstamps:
	@echo "Version stamping binutils..."
	cp -f $(PATH_TOP)/src/binutils/binutils/version.c  $(PATH_TOP)/src/binutils/binutils/version.tmp.c
	sed -e '/printf.*program_version/s/%s %s.*\\n/%s %s $(INNOTEK_VERSION)\\n/' \
		$(PATH_TOP)/src/binutils/binutils/version.tmp.c > $(PATH_TOP)/src/binutils/binutils/version.c
	rm -f $(PATH_TOP)/src/binutils/binutils/version.tmp.c		
	if [ -f $(PATH_TOP)/src/gcc/binutils/version.c ]; then \
		cp -f $(PATH_TOP)/src/gcc/binutils/version.c  $(PATH_TOP)/src/gcc/binutils/version.tmp.c && \
		sed -e '/printf.*program_version/s/%s %s.*\\n/%s %s $(INNOTEK_VERSION)\\n/' \
			$(PATH_TOP)/src/gcc/binutils/version.tmp.c > $(PATH_TOP)/src/gcc/binutils/version.c && \
		rm -f $(PATH_TOP)/src/gcc/binutils/version.tmp.c ; \
	fi
	@echo "Version stamping gas..."
	cp -f $(PATH_TOP)/src/binutils/gas/as.c $(PATH_TOP)/src/binutils/gas/as.tmp.c
	sed -e '/printf.*GNU.*assembler/s/%s.*\\n/%s $(INNOTEK_VERSION)\\n/' \
	    -e '/fprintf.*GNU.*assembler.*version.*BFD.*/s/using BFD version %s.*/using BFD version %s $(INNOTEK_VERSION)"),/ ' \
		$(PATH_TOP)/src/binutils/gas/as.tmp.c > $(PATH_TOP)/src/binutils/gas/as.c
	rm -f $(PATH_TOP)/src/binutils/gas/as.tmp.c		
	if [ -f $(PATH_TOP)/src/gcc/gas/as.c ]; then \
		cp -f $(PATH_TOP)/src/gcc/gas/as.c  $(PATH_TOP)/src/gcc/gas/as.tmp.c && \
		sed -e '/printf.*GNU.*assembler/s/%s.*\\n/%s $(INNOTEK_VERSION)\\n/' \
			-e '/fprintf.*GNU.*assembler.*version.*BFD.*/s/using BFD version %s.*/using BFD version %s $(INNOTEK_VERSION)"),/ ' \
			$(PATH_TOP)/src/gcc/gas/as.tmp.c > $(PATH_TOP)/src/gcc/gas/as.c && \
		rm -f $(PATH_TOP)/src/gcc/gas/as.tmp.c ; \
	fi
	@echo "Version stamping ld..."
	cp -f $(PATH_TOP)/src/binutils/ld/ldver.c $(PATH_TOP)/src/binutils/ld/ldver.tmp.c
	sed -e '/fprintf.*GNU.*ld.*version/s/(with BFD %s).*/(with BFD %s) $(INNOTEK_VERSION)\\n"),/' \
		$(PATH_TOP)/src/binutils/ld/ldver.tmp.c > $(PATH_TOP)/src/binutils/ld/ldver.c
	rm -f $(PATH_TOP)/src/binutils/ld/ldver.tmp.c		
	if [ -f $(PATH_TOP)/src/gcc/ld/ldver.c ]; then \
		cp -f $(PATH_TOP)/src/gcc/ld/ldver.c $(PATH_TOP)/src/gcc/ld/ldver.tmp.c && \
		sed -e '/fprintf.*GNU.*ld.*version/s/(with BFD %s).*/(with BFD %s) $(INNOTEK_VERSION)\\n"),/' \
			$(PATH_TOP)/src/gcc/ld/ldver.tmp.c > $(PATH_TOP)/src/gcc/ld/ldver.c && \
		rm -f $(PATH_TOP)/src/gcc/ld/ldver.tmp.c ; \
	fi		
	

# Quick bootstrap workers.
binutils-quick:
	GCCLOAD=5 $(MAKE) $(MAKEOPT) -f $(MAKEFILE) binutils214

binutils-quick-installstage:
	rm -Rf $(PATH_BUILTTOOLS_TMP)
	if test -f $(PATH_BUILTTOOLS_TMP)/bin/ld.exe; then cp -f $(PATH_BUILTTOOLS_TMP)/bin/ld.exe                       $(PATH_BUILTTOOLS_TMP)/bin/ld-saved.exe; fi
	if test -f $(PATH_BUILTTOOLS_TMP)/i386-pc-os2-emx/bin/ld.exe; then cp -f $(PATH_BUILTTOOLS_TMP)/i386-pc-os2-emx/bin/ld.exe       $(PATH_BUILTTOOLS_TMP)/i386-pc-os2-emx/bin/ld-saved.exe; fi
	$(MAKE) $(MAKEOPT) -C $(PATH_OBJ)/binutils prefix=$(PATH_BUILTTOOLS_TMPD) install
	mv -f $(PATH_BUILTTOOLS_TMP)/bin/ld.exe                  $(PATH_BUILTTOOLS_TMP)/bin/ld-bad.exe
	mv -f $(PATH_BUILTTOOLS_TMP)/i386-pc-os2-emx/bin/ld.exe  $(PATH_BUILTTOOLS_TMP)/i386-pc-os2-emx/bin/ld-bad.exe
	if test -f $(PATH_BUILTTOOLS_TMP)/bin/ld-saved.exe; then mv -f $(PATH_BUILTTOOLS_TMP)/bin/ld-saved.exe                 $(PATH_BUILTTOOLS_TMP)/bin/ld.exe; fi
	if test -f $(PATH_BUILTTOOLS_TMP)/i386-pc-os2-emx/bin/ld-saved.exe; then mv -f $(PATH_BUILTTOOLS_TMP)/i386-pc-os2-emx/bin/ld-saved.exe $(PATH_BUILTTOOLS_TMP)/i386-pc-os2-emx/bin/ld.exe; fi
	cp -Rf $(PATH_BUILTTOOLS_TMP)/* $(PATH_BUILTTOOLS)/
	rm -Rf $(PATH_BUILTTOOLS_TMP)

					
# Generate diffs for Binutils (part of packing).
.PHONY: binutils-diff $(ALL_PREFIX)/src/diffs/binutils-$(BINUTILS_VERSION).diff
binutils-diff: $(ALL_PREFIX)/src/diffs/binutils-$(BINUTILS_VERSION).diff
$(ALL_PREFIX)/src/diffs/binutils-$(BINUTILS_VERSION).diff:
	mkdir -p $(@D)
	$(TOOL_CVS_DIFF_TREE) $(BINUTILS_CVS_REL) src/binutils > $@



							

	


###############################################################################
###############################################################################
###############################################################################
#
#    E M X
#
###############################################################################
###############################################################################
###############################################################################
all-emx  emx: \
		emx-build
	@echo "Successfully build EMX."
	
# Some helpers.		
# TODO: Change OUT and INS to the right ones. Currently not possible as
#       doing such breaks the rules generating.
EMX_MODE = dbg
ifeq "$(BUILD_MODE)" "RELEASE"
EMX_MODE = opt
endif
#EMX_OUT  = out/
#EMX_INS  = out/install/
EMX_OUT  = $(PATH_OBJD)/emx/
EMX_INS  = $(ALL_PREFIX)/
EMX_MASM = $(PATH_TOP)/tools/x86.os2/masm/v6.0/binp/ml.exe
EMX_DEFINES = "OUT=$(EMX_OUT)" "INS=$(EMX_INS)" "MODE=$(EMX_MODE)" "ASM=$(EMX_MASM) -c"
									
# build the components. (directory changer rules)
.PHONY: emx-build emx-install emx-configure
emx-build emx-install:
	mkdir -p $(PATH_OBJ)/emx
	$(MAKE) $(MAKEOPT) -C $(PATH_TOP)/src/emx -f $(MAKEFILE) $@-it

emx-build-it:
	$(MAKE) $(MAKEOPT) -j 1 -C $(PATH_TOP)/src/emx $(EMX_DEFINES) tools
	$(MAKE) $(MAKEOPT) -C $(PATH_TOP)/src/emx $(EMX_DEFINES) all

emx-install-it:
	$(MAKE) $(MAKEOPT) -C $(PATH_TOP)/src/emx $(EMX_DEFINES) INS=$(ALL_PREFIX)/ install

					
# We pass down the INNOTEK_VERSION define when building EMX.
emx-versionstamps:
	@echo "Version stamping EMX... nothing to do"
									
# Install the compiled emx stuff to builttools.
emx-builttools-stage2:
	$(MAKE) $(MAKEOPT) -C $(PATH_TOP)/src/emx $(EMX_DEFINES) INS=$(PATH_BUILTTOOLS_TMP)/  install

# Quick bootstrap workers.			
emx-quick-libs:
	GCCLOAD=3 $(MAKE) $(MAKEOPT) -f $(PATH_TOP)/src/emx/libonly.gmk -C $(PATH_TOP)/src/emx $(EMX_DEFINES) all

emx-quick-libs-install:
	$(MAKE) $(MAKEOPT) -f $(PATH_TOP)/src/emx/libonly.gmk -C $(PATH_TOP)/src/emx $(EMX_DEFINES) INS=$(PATH_BUILTTOOLS)/ install
					
emx-quick-rest:
	GCCLOAD=3 $(MAKE) $(MAKEOPT) -C $(PATH_TOP)/src/emx $(EMX_DEFINES) all
			
emx-quick-rest-install:
	$(MAKE) $(MAKEOPT) -C $(PATH_TOP)/src/emx $(EMX_DEFINES) INS=$(PATH_BUILTTOOLS)/ install
			    	

# Generate diffs for EMX (part of packing).
.PHONY: emx-diff $(ALL_PREFIX)/src/diffs/emx-$(EMX_VERSION).diff
emx-diff: $(ALL_PREFIX)/src/diffs/emx-$(EMX_VERSION).diff
$(ALL_PREFIX)/src/diffs/emx-$(EMX_VERSION).diff:
	mkdir -p $(@D)
	$(TOOL_CVS_DIFF_TREE) $(EMX_CVS_REL) src/emx > $@


	
	
	
###############################################################################
###############################################################################
###############################################################################
#
#    P A C K I N G
#
###############################################################################
###############################################################################
###############################################################################
packing: \
		packing-all \
		packing-doc \
		packing-libc \
		installer
# don't need this anylonger - all or nothing at all.		
#		packing-core
#		packing-dbg	
#		packing-prf

ZIPFLAGS=-rX9
ZIPBASE=$(PATH_BIN)/GCC-$(GCC_VERSION)-$(GCC_RELEASE_ID)

packing-all:
	rm -f $(ZIPBASE).zip
	cd $(ALL_PREFIX)/.. ; zip $(ZIPFLAGS) $(ZIPBASE).zip *
	
packing-doc:
	rm -f $(ZIPBASE)-doc.zip
	cd $(ALL_PREFIX)/..; zip $(ZIPFLAGS) $(ZIPBASE)-doc.zip usr/doc/GCC-$(GCC_VERSION)/*
	
packing-libc:
	rm -f $(PATH_BIN)/libc.zip
	cd $(ALL_PREFIX)/lib; zip $(ZIPFLAGS) $(PATH_BIN)/libc.zip libc*.dll gcc*.dll
	cd $(ALL_PREFIX)/doc/GCC-$(GCC_VERSION); zip $(ZIPFLAGS) $(PATH_BIN)/libc.zip COPYING.LIB

packing-core:
	rm -f $(ZIPBASE)-core.zip
	cd $(ALL_PREFIX)/.. ; zip $(ZIPFLAGS) $(ZIPBASE)-core.zip * -x \*.dbg -x \*.map -x \*_p.\* -x \*.elh -x \*.prf -x \*.lib -x usr/lib/dbg/\* -x \*.lib
	cd $(ALL_PREFIX)/.. ; zip $(ZIPFLAGS) $(ZIPBASE)-core.zip usr/lib/libc*dbg usr/lib/end.lib

packing-dbg:
	rm -f $(ZIPBASE)-dbg.zip
	cd $(ALL_PREFIX)/.. ; zip $(ZIPFLAGS) $(ZIPBASE)-dbg.zip . -i \*.dbg -i \*.map -i \*.elh -i \*.sym -i usr/lib/dbg/\*

packing-prf:
	rm -f $(ZIPBASE)-prf.zip
	cd $(ALL_PREFIX)/.. ; zip $(ZIPFLAGS) $(ZIPBASE)-prf.zip . -i \*_p.\* -i \*.prf
	
packing-src: \
		packing-src-gcc \
		packing-src-binutils \
		packing-src-emx \
	
packing-src-gcc:
	rm -f $(ZIPBASE)-src-GCC.zip
	zip $(ZIPFLAGS) $(ZIPBASE)-src-GCC.zip src/gcc -x \*CVS\*
					
packing-src-binutils:
	rm -f $(ZIPBASE)-src-binutils.zip
	zip $(ZIPFLAGS) $(ZIPBASE)-src-binutils.zip src/binutils -x \*CVS\*
	
packing-src-emx:
	rm -f $(ZIPBASE)-src-emx.zip
	zip $(subst r,,$(ZIPFLAGS)) $(ZIPBASE)-src-emx.zip src/emx/* -x \*CVS\* -x \*testcase\* -x \*out\*
	zip $(ZIPFLAGS) $(ZIPBASE)-src-emx.zip src/emx/src/* src/emx/include/* src/emx/src/bsd/* -x \*CVS\*
				
installer:
	$(MAKE) $(MAKEOPT) -C $(PATH_TOP)/src/install all packing
	
		
###############################################################################
###############################################################################
###############################################################################
#
#    M I S C
#
###############################################################################
###############################################################################
###############################################################################

misc-install:
	mkdir -p $(ALL_PREFIX)/doc/GCC-$(GCC_VERSION)
	mkdir -p $(ALL_PREFIX)/lib
	mkdir -p $(ALL_PREFIX)/bin
	cp $(PATH_TOP)/doc/ReleaseNotes.os2         $(ALL_PREFIX)/doc/GCC-$(GCC_VERSION)
	cp $(PATH_TOP)/doc/MailingLists.os2         $(ALL_PREFIX)/doc/GCC-$(GCC_VERSION)
	cp $(PATH_TOP)/doc/Install.os2              $(ALL_PREFIX)/doc/GCC-$(GCC_VERSION)
	cp $(PATH_TOP)/doc/Licenses.os2             $(ALL_PREFIX)/doc/GCC-$(GCC_VERSION)
	cp $(PATH_TOP)/doc/COPYING.LIB              $(ALL_PREFIX)/doc/GCC-$(GCC_VERSION)
	cp $(PATH_TOP)/doc/COPYING                  $(ALL_PREFIX)/doc/GCC-$(GCC_VERSION)
	cp $(PATH_TOP)/ChangeLog                    $(ALL_PREFIX)/doc/GCC-$(GCC_VERSION)/ChangeLog.os2
	cp $(PATH_TOP)/src/install/MakeOmfLibs.cmd  $(ALL_PREFIX)/lib
	cp $(PATH_TOP)/src/misc/dllar.cmd           $(ALL_PREFIX)/bin
	cp $(PATH_TOP)/src/misc/gccenv.cmd          $(ALL_PREFIX)/bin
	if test -f $(PATH_TOP)/tools/usr/lib/Iintl6i.dll; then \
		cp $(PATH_TOP)/tools/usr/lib/Iintl6i.dll $(ALL_PREFIX)/lib; \
	else \
		if test -f $(PATH_TOP)/tools/usr/lib/intl6i.dll; then \
			cp $(PATH_TOP)/tools/usr/lib/intl6i.dll $(ALL_PREFIX)/lib; \
		fi \
	fi
	ar cr $(ALL_PREFIX)/lib/m.a
			

#
# Checkout rule
#	
checkout update up:
	cvs -q update -d -P 2>&1 | tee up.log

# DO NOT DELETE
