# Copyright (C) 2004 Nokia
# Author: lauri.leukkunen@nokia.com
# Licenced under GPL, see top level COPYING file for details
#
# The crosstool (by Dan Kegel) has provided some of the ideas used here.

GARNAME = toolchain_glibc
GARVERSION = 1.0
CATEGORIES = base

include versions

BINUTILS = binutils_$(BINUTILS_VER).orig.tar.gz
BINUTILS_DEBIAN = binutils_$(BINUTILS_VER)-$(BINUTILS_DEB_PATCH_VER).diff.gz
GLIBC = glibc_$(GLIBC_VER).orig.tar.gz
GLIBC_DEBIAN = glibc_$(GLIBC_VER)-$(GLIBC_DEB_PATCH_VER).diff.gz
GCC = gcc-$(GCC_VER).orig.tar.gz
GCC_DEBIAN = gcc-$(GCC_VER)-$(GCC_DEB_PATCH_VER).diff.gz
GCC_SRCDIR = gcc-$(shell echo $(GCC_VER) | sed s/_/-/g)-patched


NO_EXTRACT = $(BINUTILS_DEBIAN) $(BINUTILS) $(GLIBC_DEBIAN) $(GLIBC) $(GCC_DEBIAN) $(GCC)


ARCH = arm
SUB_ARCH =


#LINUX_ARM_HEADERS=linux-kernel-headers_2.5.999-test7-bk-16_arm.deb
#ifeq ($(ARCH),arm)
#LINUX_HEADERS = $(LINUX_ARM_HEADERS)
#else
LINUX_HEADERS = $(LINUX_HEADER_VERSION)_$(ARCH).deb
#endif

DISTFILES = $(BINUTILS) $(BINUTILS_DEBIAN) $(GLIBC) $(GLIBC_DEBIAN) $(GCC) $(GCC_DEBIAN) $(LINUX_HEADERS)


MASTER_SITES += scp://isource.nokia.com:/home/groups/scratchbox/sbox-files/

PREPATH=/scratchbox/tools/autotools/autoconf2.13/bin:/scratchbox/tools/autotools/automake-1.4/bin
CCACHE_BIN = /scratchbox/ccache_bin
export PATH=$(PREPATH):$(CCACHE_BIN):$(shell echo $$PATH)

DEPENDS =

DESCRIPTION = toolchain (binutils, glibc, gcc)

DEBIAN_PACKAGES = gcc-3.3-base gcc gcc-3.3 g++ g++-3.3 cpp cpp-3.3 libgcc1 libc6 libc6-dev libstdc++5 libstdc++5-3.3-dev binutils

define BLURB
 # FIXME: blurb goes here
endef

CONFIGURE_SCRIPTS = toolchain
BUILD_SCRIPTS = toolchain
INSTALL_SCRIPTS = toolchain

ifeq ($(ARCH), arm)
#USE_SOFTFLOAT=1
endif

ifdef USE_SOFTFLOAT
BINUTILS_SOFTFLOAT=--nfp
GCC_SOFTFLOAT=--nfp --without-fp --with-softfloat-support=internal
GLIBC_SOFTFLOAT=--with-fp=no
endif

# INCLUDE THIS HERE BEFORE OVERRIDING
include ../category.mk


export CFLAGS = -O2
ifdef COMPILERNAME
COMPILER = $(COMPILERNAME)
else
COMPILER = $(SUB_ARCH)-gcc-$(gcc_version)-glibc-$(glibc_version)
endif
COMPILERDIR = /scratchbox/compilers/$(COMPILER)

unexport DESTDIR =
unexport prefix = $(COMPILERDIR)

unexport exec_prefix = $(prefix)
unexport bindir = $(exec_prefix)/bin
unexport sbindir = $(exec_prefix)/sbin
unexport libexecdir = $(exec_prefix)/libexec
unexport datadir = $(prefix)/share
unexport sysconfdir = $(prefix)/etc
unexport sharedstatedir = $(prefix)/share
unexport localstatedir = $(prefix)/var
unexport libdir = $(exec_prefix)/lib
unexport infodir = $(prefix)/share/info
unexport lispdir = $(prefix)/share/emacs/site-lisp
unexport includedir = $(prefix)/include
unexport mandir = $(prefix)/share/man
unexport docdir = $(prefix)/share/doc
unexport sourcedir = $(prefix)/src

TOOLCHAIN_ADD_PREFIX=sbox-
TOOLCHAIN_PREFIX=$(SUB_ARCH)-linux-


ifeq ($(ARCH),i386)
SUB_ARCH = i686
GNU_TARGET_PREFIX =
GLIBC_CONFIGURE_ARGS =
else
SUB_ARCH = $(ARCH)
GNU_TARGET_PREFIX = $(SUB_ARCH)-linux-
GLIBC_CONFIGURE_ARGS = --without-tls
endif

TARGET = $(SUB_ARCH)-linux
ifneq ($(CPU), "")
GCC_TARGET_DEFAULT_CPU=--with-cpu=$(CPU)
endif
GCC_TARGET_FLAGS =
GCC_CONFIGURE_ARGS =
GCC_WITH_HEADERS =  --with-headers=$(COMPILERDIR)/usr/include
ADD_FLAGS =
GCC_BUILD_TARGET =



CROSS_GCC=$(TOOLCHAIN_PREFIX)gcc
HOSTCC=host-gcc
GLIBC_PREFIX=$(COMPILERDIR)/$(TARGET)
BUILD=i386-linux
HOST=i386-linux


extract-$(GLIBC_LINUXTHREADS):
	tar jxf $(DOWNLOADDIR)/$(GLIBC_LINUXTHREADS) -C $(EXTRACTDIR)/glibc-$(GLIBC_VER)/
	$(MAKECOOKIE)


pre-configure:
# dpatch hack
	if [ ! -d /usr/share/dpatch ]; then \
		mkdir -p /usr/share/; \
		ln -sf /scratchbox/devkits/debian/share/dpatch /usr/share/dpatch; \
	fi
# put kernel headers into their right place
	mkdir -p $(COMPILERDIR)/usr/include
#ifeq ($(ARCH), arm)
##	tar zxf $(DOWNLOADDIR)/$(LINUX_ARM_HEADERS) -C $(COMPILERDIR)/
#	patch -p0 -d $(COMPILERDIR)/usr/include < files/patch-2.4-kernel-headers.diff
#	cd $(COMPILERDIR)/usr/include/asm && \
#	ln -fs proc-armv proc && \
#	ln -fs arch-ebsa285 arch
#else
	rm -f ./data.tar.gz
	ar x $(DOWNLOADDIR)/$(LINUX_HEADERS) data.tar.gz
	tar zxf ./data.tar.gz -C $(COMPILERDIR)/
	rm -f ./data.tar.gz
#endif
# Do DEBIAN patches here
	./undeb_binutils $(ARCH)
	./undeb_gcc $(ARCH)
	./undeb_glibc $(ARCH)
	patch -d work/glibc-$(GLIBC_VER)-patched -p0 < files/glibc-2.3.2-debian.patch
#	patch -d work/glibc-$(GLIBC_VER)-patched -p0 < files/glibc_001_a1_clobber.patch
#	patch -d work/glibc-$(GLIBC_VER)-patched -p1 < files/glibc_002_sscanf.patch
#	cd work/glibc-$(GLIBC_VER) && cat ../../files/glibc-2.3.2.patch | patch -p0
#ifeq ($(ARCH), arm)
#	cd work/gcc-$(GCC_VER) && cat ../../files/gcc-3.2.3-PR8896.patch | patch -p0
#endif
	$(MAKECOOKIE)


# Here we prevent the non-functioning testsuite from screwing up the build for i386

configure-toolchain:
	cat work/$(GCC_SRCDIR)/libstdc++-v3/Makefile.in | sed '/^SUBDIRS/s/testsuite//' > work/$(GCC_SRCDIR)/libstdc++-v3/Makefile.in.new
	mv work/$(GCC_SRCDIR)/libstdc++-v3/Makefile.in.new work/$(GCC_SRCDIR)/libstdc++-v3/Makefile.in
	$(MAKECOOKIE)



#ifneq ($(ARCH), i386)
BUILD_FAKE_BINUTILS = build-fake-native-binutils
#endif

build-toolchain: $(BUILD_FAKE_BINUTILS) build-binutils build-gcc-pass-1 build-glibc build-gcc-pass-2
	$(MAKECOOKIE)



build-binutils: $(BUILD_FAKE_BINUTILS) configure-toolchain
	export CC="$(HOSTCC)" && \
	cd work/binutils-$(BINUTILS_VER)-patched && \
	./configure --build=$(BUILD) --host=$(HOST) --target=$(TARGET) --prefix=$(COMPILERDIR) --program-prefix=$(TOOLCHAIN_PREFIX) $(BINUTILS_SOFTFLOAT) && \
	$(MAKE) all && \
	$(MAKE) install
ifdef BUILD_FAKE_BINUTILS
	mv $(COMPILERDIR)/bin/$(TOOLCHAIN_PREFIX)ld $(COMPILERDIR)/bin/ld_orig && \
	mv $(COMPILERDIR)/$(TARGET)/bin/ld $(COMPILERDIR)/$(TARGET)/bin/ld_orig
	cp -af /scratchbox/tools/bin/sb_ld_wrapper $(COMPILERDIR)/bin/$(TOOLCHAIN_PREFIX)ld
	cp -af /scratchbox/tools/bin/sb_ld_wrapper $(COMPILERDIR)/$(TARGET)/bin/ld
endif
	$(MAKECOOKIE)

build-fake-native-binutils:
	export CC="$(HOSTCC)" && \
	mkdir -p work/fake-binutils && \
	cd work/fake-binutils && \
	cp -a ../binutils-$(BINUTILS_VER)-patched . && \
	cd binutils-$(BINUTILS_VER)-patched && \
	cat ../../../files/fake_native.patch | patch -p2 && \
	./configure --build=$(BUILD) --host=$(HOST) --target=$(TARGET) --prefix=$(COMPILERDIR) --program-prefix=$(TOOLCHAIN_PREFIX) $(BINUTILS_SOFTFLOAT) --with-sysroot=/ && \
	$(MAKE) all && \
	$(MAKE) install && \
	mv $(COMPILERDIR)/bin/$(TOOLCHAIN_PREFIX)ld $(COMPILERDIR)/bin/ld_fake_native && \
	mv $(COMPILERDIR)/$(TARGET)/bin/ld $(COMPILERDIR)/$(TARGET)/bin/ld_fake_native
	$(MAKECOOKIE)

build-glibc-headers: build-binutils
	export CC="$(HOSTCC)" && \
	export BUILD_CC="$(HOSTCC)" && export CPP="host-cpp" && export ac_preproc_ok=true && export PATH=$(COMPILERDIR)/bin:$$PATH && \
	mkdir -p work/build-glibc-headers && \
	cd work/build-glibc-headers && \
	../glibc-$(GLIBC_VER)-patched/configure --prefix=/usr --host=$(ARCH)-linux $(GCC_WITH_HEADERS) --disable-sanity-checks --without-cvs $(GLIBC_SOFTFLOAT) $(GLIBC_CONFIGURE_ARGS) && \
	make sysdeps/gnu/errlist.c && \
	mkdir -p stdio-common && \
	touch stdio-common/errlist-compat.c && \
	$(MAKE) cross-compiling=yes install-headers install_root=$(COMPILERDIR) && \
	mkdir -p $(COMPILERDIR)/usr/include/gnu && \
	touch $(COMPILERDIR)/usr/include/gnu/stubs.h && \
	cp ../glibc-$(GLIBC_VER)-patched/include/features.h $(COMPILERDIR)/usr/include/features.h && \
	cp bits/stdio_lim.h $(COMPILERDIR)/usr/include/bits/stdio_lim.h
	$(MAKECOOKIE)

build-gcc-pass-1: build-glibc-headers
	export CC="$(HOSTCC)" && \
	mkdir -p work/gcc_build_1 && \
	cd work/gcc_build_1 && \
	export PATH=$(COMPILERDIR)/bin:$$PATH && \
	../$(GCC_SRCDIR)/configure --target=$(TARGET) --host=$(HOST) --build=$(BUILD) --prefix=$(COMPILERDIR) --with-local-prefix=$(COMPILERDIR) --with-sysroot=$(COMPILERDIR) --with-headers=$(COMPILERDIR)/usr/include --enable-languages=c --disable-threads --disable-shared --enable-threads=no --disable-multilib --disable-nls --enable-__cxa_atexit --enable-symvers=gnu $(GCC_TARGET_DEFAULT_CPU) --program-prefix="$(TOOLCHAIN_PREFIX)" $(GCC_SOFTFLOAT) $(GCC_CONFIGURE_ARGS) && \
	$(MAKE) $(GCC_BUILD_TARGET) all-gcc && \
	$(MAKE) install-gcc
	$(MAKECOOKIE)



build-glibc: build-gcc-pass-1
	mkdir -p work/glibc_build && unset prefix ; unset DESTDIR ; \
	cd work/glibc_build && \
	export CC="$(CROSS_GCC)" && export BUILD_CC="$(HOSTCC)" && export CPP="$(SUB_ARCH)-linux-cpp" && export ac_preproc_ok=true && export PATH=$(COMPILERDIR)/bin:$$PATH && \
	../glibc-$(GLIBC_VER)-patched/configure --prefix=/usr --host=$(SUB_ARCH)-linux --build=$(BUILD) $(GCC_WITH_HEADERS) --enable-add-ons=linuxthreads $(GLIBC_SOFTFLOAT) $(GLIBC_CONFIGURE_ARGS) && \
	$(MAKE) all && \
	$(MAKE) install install_root=$(COMPILERDIR)
	mkdir -p $(COMPILERDIR)/$(TARGET)/lib
	cp -a $(COMPILERDIR)/usr/lib/* $(COMPILERDIR)/$(TARGET)/lib/
	cp -a $(COMPILERDIR)/lib/* $(COMPILERDIR)/$(TARGET)/lib/
	cp -a $(COMPILERDIR)/usr/include/* $(COMPILERDIR)/$(TARGET)/sys-include/
	echo "GROUP ( libc.so.6 libc_nonshared.a )" > $(COMPILERDIR)/$(TARGET)/lib/libc.so
	echo "GROUP ( libc.so.6 libc_nonshared.a )" > $(COMPILERDIR)/usr/lib/libc.so
	echo "GROUP ( libpthread.so.0 libpthread_nonshared.a )" > $(COMPILERDIR)/usr/lib/libpthread.so
	echo "GROUP ( libpthread.so.0 libpthread_nonshared.a )" > $(COMPILERDIR)/$(TARGET)/lib/libpthread.so
	$(MAKECOOKIE)


build-gcc-pass-2: build-glibc
	export CC="$(HOSTCC)" && \
	mkdir -p work/gcc_build_2 && \
	cd work/gcc_build_2 && \
	export PATH=$(COMPILERDIR)/bin:$$PATH && \
	../$(GCC_SRCDIR)/configure --target=$(TARGET) --host=$(HOST) --build=$(BUILD) --prefix=$(COMPILERDIR) $(GCC_WITH_HEADERS) --enable-languages=c,c++ --program-transform-name='s/^$(GNU_TARGET_NAME)-/$(TOOLCHAIN_PREFIX)/' --program-prefix="$(TOOLCHAIN_PREFIX)" $(GCC_TARGET_DEFAULT_CPU) $(GCC_SOFTFLOAT) $(GCC_CONFIGURE_ARGS) && \
	perl -i -p -e "s,ac_cv_prog_cc_cross=no,ac_cv_prog_cc_cross=yes,g;" ./config.cache && \
	$(MAKE) $(GCC_BUILD_TARGET) && \
	$(MAKE) install
	$(MAKECOOKIE)


install-toolchain:
	cp -a files/gcc.specs $(COMPILERDIR)/gcc.specs
	cd $(COMPILERDIR)/bin && \
	ln -sf $(TOOLCHAIN_PREFIX)gcc $(TOOLCHAIN_PREFIX)cc && \
	ln -sf $(TOOLCHAIN_PREFIX)gcc $(TOOLCHAIN_PREFIX)gcc-$(shell echo $(gcc_version) | cut -d "." --fields=1,2) && \
	ln -sf $(TOOLCHAIN_PREFIX)g++ $(TOOLCHAIN_PREFIX)g++-$(shell echo $(gcc_version) | cut -d "." --fields=1,2) && \
	for f in $(TOOLCHAIN_PREFIX)*; do n=$$(echo sbox-$$f); ln -sf $$f $$n; done
	echo "$(COMPILER):$(COMPILERDIR):$(SUB_ARCH):linux:glibc:$(ARCH)" >> $(COMPILERDIR)/compiler-name
	sed "s/COMPILERDIR/$(subst /,\/,$(COMPILERDIR))/g" files/target_setup.sh.in | sed "s/TARGET/$(TARGET)/g" > $(COMPILERDIR)/target_setup.sh
	chmod +x $(COMPILERDIR)/target_setup.sh
	$(MAKECOOKIE)

post-install:
# remove dpatch hack
	if [ -L /usr/share/dpatch ]; then \
		rm /usr/share/dpatch; \
	fi
	$(MAKECOOKIE)


clean-installation:
	rm -rf $(COMPILERDIR)

superclean: clean-installation clean

