# $FreeWRT$

include $(TOPDIR)/rules.mk
include ../rules.mk

WRKDIR?=		${WRKDIR_BASE}/w-gcc-${GCC_VERSION}-2

GCC_VERSION:=		3.4.4
MASTER_SITES:=		ftp://ftp.fu-berlin.de/unix/languages/gcc/releases/gcc-$(GCC_VERSION)/ \
          		http://mirrors.rcn.net/pub/sourceware/gcc/releases/gcc-$(GCC_VERSION)/
PKG_MD5SUM:=		b594ff4ea4fbef4ba9220887de713dfe
SOURCE:=		gcc-$(GCC_VERSION).tar.bz2
GCC_DIR:=		$(WRKDIR)/gcc-$(GCC_VERSION)

TARGET_LANGUAGES:=	c,c++

GCC_BUILD_DIR1:=	$(WRKDIR)/gcc-$(GCC_VERSION)-initial

GCC_CONFOPTS=		--prefix=$(STAGING_TOOLS) \
			--build=$(GNU_HOST_NAME) \
			--host=$(GNU_HOST_NAME) \
			--target=$(REAL_GNU_TARGET_NAME) \
			--disable-__cxa_atexit \
			--enable-sjlj-exceptions \
			--enable-target-optspace \
			--with-gnu-ld \
			--disable-nls \
			--disable-dependency-tracking \
			--disable-libtool-lock

include ${TOPDIR}/mk/fetch.mk
include ${TOPDIR}/mk/targets.mk

$(GCC_DIR)/.unpacked: ${_CHECKSUM_COOKIE}
	${EXTRACT_CMD}
	touch $@

$(GCC_DIR)/.patched: $(GCC_DIR)/.unpacked
	# Apply any files named gcc-*.patch from the source directory to gcc
	${MBSH} $(SCRIPT_DIR)/patch-kernel.sh $(GCC_DIR) ./$(GCC_VERSION) \*.patch
	typeset -i REV; \
	if fgrep xml .svn/entries >/dev/null 2>&1; then \
		let REV="$$(sed -n '/revision=/s/^.*"\([0-9]*\)".*$$/\1/p' \
		    .svn/entries)"; \
	else \
		let REV="$$(head -n 4 .svn/entries | tail -1)"; \
	fi; ${SED} 's,\(version_string.. = "[0-9\.]*\).*\(";\),\1 (FreeWRT rev. '"$$REV"')\2,' ${GCC_DIR}/gcc/version.c
	$(SED) 's,\(bug_report_url.. = "\).*\(";\),\1<URL:http://www.freewrt.org/development/freewrt>\2,' $(GCC_DIR)/gcc/version.c
	touch $@

$(GCC_BUILD_DIR1)/.configured: $(GCC_DIR)/.patched
	mkdir -p $(GCC_BUILD_DIR1)
	(cd $(GCC_BUILD_DIR1); rm -f config.cache; PATH=$(TARGET_PATH) \
		$(GCC_DIR)/configure \
		${GCC_CONFOPTS} \
		--enable-languages=c \
		--disable-shared \
		--with-sysroot=$(TOOLCHAIN_BUILD_DIR)/uClibc_dev/ \
	);
	touch $@

$(GCC_BUILD_DIR1)/.compiled: $(GCC_BUILD_DIR1)/.configured
	PATH=$(TARGET_PATH) $(MAKE) -C $(GCC_BUILD_DIR1) all-gcc
	touch $@

$(STAGING_TOOLS)/bin/$(REAL_GNU_TARGET_NAME)-gcc: $(GCC_BUILD_DIR1)/.compiled
	PATH=$(TARGET_PATH) $(MAKE) -C $(GCC_BUILD_DIR1) install-gcc

GCC_BUILD_DIR2:=$(WRKDIR)/gcc-$(GCC_VERSION)-final
$(GCC_BUILD_DIR2)/.configured: $(GCC_DIR)/.patched $(STAGING_DIR)/lib/libc.a
	mkdir -p $(GCC_BUILD_DIR2) ${STAGING_TOOLS}/$(REAL_GNU_TARGET_NAME)
	# Important!  Required for limits.h to be fixed.
	rm -rf $(STAGING_TOOLS)/$(REAL_GNU_TARGET_NAME)/sys-include
	ln -sf ${STAGING_DIR}/include $(STAGING_TOOLS)/$(REAL_GNU_TARGET_NAME)/sys-include
	rm -rf ${STAGING_TOOLS}/$(REAL_GNU_TARGET_NAME)/lib
	ln -sf ${STAGING_DIR}/lib $(STAGING_TOOLS)/$(REAL_GNU_TARGET_NAME)/lib
	(cd $(GCC_BUILD_DIR2); rm -f config.cache; PATH=$(TARGET_PATH) \
		$(GCC_DIR)/configure \
		${GCC_CONFOPTS} \
		--enable-languages=$(TARGET_LANGUAGES) \
		--enable-shared \
		--with-sysroot=${STAGING_DIR} \
	);
	touch $@

$(GCC_BUILD_DIR2)/.compiled: $(GCC_BUILD_DIR2)/.configured
	PATH=$(TARGET_PATH) $(MAKE) -C $(GCC_BUILD_DIR2) all
	touch $@

${STAGING_TOOLS}/gcc_installed: $(GCC_BUILD_DIR2)/.compiled
	PATH=$(TARGET_PATH) $(MAKE) -C $(GCC_BUILD_DIR2) install
	echo $(GCC_VERSION) > $(STAGING_TOOLS)/gcc_version
	# Set up the symlinks to enable lying about target name.
	set -e; \
	(cd $(STAGING_TOOLS); \
		ln -sf $(REAL_GNU_TARGET_NAME) $(GNU_TARGET_NAME); \
		cd bin; \
		for app in $(REAL_GNU_TARGET_NAME)-* ; do \
			ln -sf $${app} \
		   	$(GNU_TARGET_NAME)$${app##$(REAL_GNU_TARGET_NAME)}; \
		done; \
	)
# We do another ugly hack here because the standard behaviour is
# to include a reference to libgcc.so.1 in all binaries. For flash space
# saving, we change the specs file to link in a static libgcc here.
ifeq ($(CPU_ARCH),mipsel)
	if [ -f $(STAGING_TOOLS)/lib/gcc/$(REAL_GNU_TARGET_NAME)/$(GCC_VERSION)/specs ] ; then \
		patch -d $(STAGING_TOOLS)/lib/gcc/$(REAL_GNU_TARGET_NAME)/$(GCC_VERSION)/ -p0 < ./$(GCC_VERSION)/static-libgcc.patch.conditional ; \
	fi
endif
	touch $@

source: ${_CHECKSUM_COOKIE}
prepare: $(STAGING_TOOLS)/bin/$(REAL_GNU_TARGET_NAME)-gcc
compile: ${STAGING_TOOLS}/gcc_installed
install:
clean: gcc-clean
	rm -rf $(GCC_DIR) $(GCC_BUILD_DIR1) $(GCC_BUILD_DIR2)
	rm -f $(STAGING_TOOLS)/bin/$(REAL_GNU_TARGET_NAME)-{,g}c* \
	    ${STAGING_TOOLS}/gcc_installed
