
GNU_REPOSITORY      := http://ftp.gnu.org/pub/gnu

GCC_VERSION         := 3.4.6
GCC_REPOSITORY      := $(GNU_REPOSITORY)/gcc/gcc-$(GCC_VERSION)

BINUTILS_VERSION    := 2.16.1
BINUTILS_REPOSITORY := $(GNU_REPOSITORY)/binutils

TARGET              ?= system

SDK_ARCH            := $(shell ./get_sdk_archive.sh $(TARGET))
SDK_NAME            := $(basename $(basename $(SDK_ARCH)))
SDK_TYPE            := $(word 3, $(subst -, ,$(SDK_NAME)))
SDK_DIR             := ../$(SDK_NAME)/$(SDK_TYPE)

PREFIX              ?= /usr/local

ifeq ($(TARGET), system)
CONFIGURE_GCC       := --enable-languages=c,c++           \
                       --prefix=$(PREFIX)
INSTALL_DEPS        := build-gcc
BUILD_DEPS          := .configured-$(TARGET)-gcc-$(GCC_VERSION)
else
CONFIGURE_GCC       := --target=$(TARGET)-aros            \
                       --enable-languages=c,c++,objc      \
                       --enable-sjlj-exceptions           \
                       --enable-long-long                 \
                       --disable-shared                   \
                       --disable-libstdcxx-pch            \
                       --with-headers=$(SDK_DIR)/include  \
                       --with-libs=$(SDK_DIR)/lib         \
                       --prefix=$(PREFIX)
CONFIGURE_BINUTILS  := --target=$(TARGET)-aros            \
                       --prefix=$(PREFIX)
INSTALL_DEPS        := install-collect-aros build-gcc
BUILD_DEPS          := install-collect-aros .configured-$(TARGET)-gcc-$(GCC_VERSION)
endif

default: all

all: build-gcc

help:
	cat ./README

clean:
	$(RM) -r *-build-binutils-*
	$(RM) -r *-build-gcc-*
	$(RM) .configured*

distclean: clean
	$(RM) *.tmp
	$(RM) config.log config.status
	$(RM) .unpacked* .patched*
	$(RM) -r *-all-sdk NO_SDK
	$(RM) -r binutils-* gcc-*
	$(RM) binutils-*.tar.bz2 gcc-*.tar.bz2

.unpacked-$(SDK_NAME): $(SDK_ARCH)
	if tar -xvjf $(SDK_ARCH); then \
		touch .unpacked-$(SDK_NAME); \
	fi

binutils-$(BINUTILS_VERSION).tar.bz2:
	if wget -t 5 -T 5 -c $(BINUTILS_REPOSITORY)/binutils-$(BINUTILS_VERSION).tar.bz2 -O src-$(BINUTILS_VERSION).tmp; then \
		mv src-$(BINUTILS_VERSION).tmp binutils-$(BINUTILS_VERSION).tar.bz2; \
		$(RM) .*-binutils-$(BINUTILS_VERSION); \
		$(RM) -r $(TARGET)-build-binutils-$(BINUTILS_VERSION); \
	fi

.unpacked-binutils-$(BINUTILS_VERSION): binutils-$(BINUTILS_VERSION).tar.bz2
	if tar -xvjf binutils-$(BINUTILS_VERSION).tar.bz2; then \
		touch .unpacked-binutils-$(BINUTILS_VERSION); \
	fi
	
.patched-binutils-$(BINUTILS_VERSION): .unpacked-binutils-$(BINUTILS_VERSION)
	if patch -p0 < patches/binutils-$(BINUTILS_VERSION)-aros.diff; then \
		touch .patched-binutils-$(BINUTILS_VERSION); \
	fi

.configured-$(TARGET)-binutils-$(BINUTILS_VERSION): .patched-binutils-$(BINUTILS_VERSION)
	if ! test -d $(TARGET)-build-binutils-$(BINUTILS_VERSION); then \
		mkdir $(TARGET)-build-binutils-$(BINUTILS_VERSION); \
	fi; \
	cd $(TARGET)-build-binutils-$(BINUTILS_VERSION); \
	if ../binutils-$(BINUTILS_VERSION)/configure $(CONFIGURE_BINUTILS); then \
		touch ../.configured-$(TARGET)-binutils-$(BINUTILS_VERSION); \
	fi;
	
build-binutils: .configured-$(TARGET)-binutils-$(BINUTILS_VERSION)
	cd $(TARGET)-build-binutils-$(BINUTILS_VERSION); \
	$(MAKE)

# configure needs $(TARGET)-aros-ld
build-collect-aros: .unpacked-$(SDK_NAME) install-binutils
	./configure --target=$(TARGET)-aros --with-sdk-dir=$(SDK_NAME)
	cd $(SDK_NAME)/tools/collect-aros; \
	$(MAKE)
	
gcc-$(GCC_VERSION).tar.bz2:
	if wget -t 5 -T 5 -c $(GCC_REPOSITORY)/gcc-$(GCC_VERSION).tar.bz2 -O src-$(GCC_VERSION).tmp; then \
		mv src-$(GCC_VERSION).tmp gcc-$(GCC_VERSION).tar.bz2; \
		$(RM) .*-gcc-$(GCC_VERSION); \
		$(RM) -r $(TARGET)-build-gcc-$(GCC_VERSION); \
	fi

.unpacked-gcc-$(GCC_VERSION): gcc-$(GCC_VERSION).tar.bz2
	if tar -xvjf gcc-$(GCC_VERSION).tar.bz2; then \
		touch .unpacked-gcc-$(GCC_VERSION); \
	fi

.patched-gcc-$(GCC_VERSION): .unpacked-gcc-$(GCC_VERSION)
	if patch -p0 < patches/gcc-$(GCC_VERSION)-aros.diff; then \
		touch .patched-gcc-$(GCC_VERSION); \
	fi

.configured-$(TARGET)-gcc-$(GCC_VERSION): .patched-gcc-$(GCC_VERSION) .unpacked-$(SDK_NAME)
	if ! test -d $(TARGET)-build-gcc-$(GCC_VERSION); then \
		mkdir $(TARGET)-build-gcc-$(GCC_VERSION); \
	fi; \
	cd $(TARGET)-build-gcc-$(GCC_VERSION); \
	if ../gcc-$(GCC_VERSION)/configure $(CONFIGURE_GCC); then \
		touch ../.configured-$(TARGET)-gcc-$(GCC_VERSION); \
	fi;

build-gcc: $(BUILD_DEPS)
	cd $(TARGET)-build-gcc-$(GCC_VERSION); \
	$(MAKE)

install-binutils: build-binutils
	cd $(TARGET)-build-binutils-$(BINUTILS_VERSION); \
	$(MAKE) install

install-collect-aros: build-collect-aros
	cd $(SDK_NAME)/tools/collect-aros; \
	if test -f collect-aros.exe; then \
		cp collect-aros.exe $(PREFIX)/$(TARGET)-aros/bin; \
	else \
		cp collect-aros $(PREFIX)/$(TARGET)-aros/bin; \
	fi

install-gcc: $(INSTALL_DEPS)
	cd $(TARGET)-build-gcc-$(GCC_VERSION); \
	$(MAKE) install

install: install-gcc
