#-------------------------------------------------------------
# directories to build
#-------------------------------------------------------------

BASEDIR=$(shell pwd)
PRXXDIR=$(shell dirname $(BASEDIR))
ARCHIVES=$(BASEDIR)/archives
PATCHES=$(BASEDIR)/patches
SRC=$(BASEDIR)/src
BUILD=$(BASEDIR)/build
SVNROOT = https://gensvn.sartorius.com/repos/lab/HH/mcf

#
##############################################################
##
## EDIT these to suit your system and source locations
##
#
TARGET=m68k-uclinux
OLDTARGET=m68k-elf

#
## set your install directory here and add the correct PATH

#-------------------------------------------------------------
# target install directory
#-------------------------------------------------------------

PREFIX=$(PRXXDIR)/local/$(TARGET)

#-------------------------------------------------------------
# versions to use
#-------------------------------------------------------------
BINUTILSVERS=2.17
ELF2FLTVERS=20060506
GCCVERS=3.4.0
GENROMFSVERS=0.5.1
MTDUTILSVERS=1.0.0
##
## Override this host's CFLAGS to build the tools on newer systems
##
export CFLAGS=-O2 -m32
export CXXFLAGS=-O2 -m32
export LDFLAGS=-m32
CPPFLAGS=

HOST_TARGET=--host=i686-pc-linux-gnu
# never-used- CROSS_HOST=i686-pc-linux-gnu
#
##############################################################
##
## Don't edit these
##

export PATH:=$(PREFIX)/bin:$(PATH)"

all:
	echo "make all-step1 or all-step2"

all-step1 :
	make binutils
	make elf2flt
	make gcc-step1
	make links
	make genromfs
	make clean

all-step2 :
	make gcc-step2
	make links
	#make clean	no clean, else cannot debug libstd++

clean:
	rm -rf build src $(TARGET)-*

distclean : clean
	rm -rf archives patches

#-------------------------------------------------------------
# rule to get missing stuff from any server
#-------------------------------------------------------------

$(ARCHIVES)/% :
	mkdir -p $(ARCHIVES)
	cd $(ARCHIVES) && svn export \
	$(SVNROOT)/gpl/toolchain/$* $*

$(PATCHES)/% :
	mkdir -p $(PATCHES)
	cd $(PATCHES) && svn export \
	$(SVNROOT)/gpl/toolchain/$* $*

ALLARCHIVESPATCHES = $(shell perl -ne 'print "$$1 " if m/^\s*\w+\s*:\s*(.*ARCHIVES.*)\s*$$/' Makefile)
$(warning ALLARCHIVESPATCHES=$(ALLARCHIVESPATCHES))
$(eval AA=$(ALLARCHIVESPATCHES))
$(warning AA=$(AA))
all-archives: $(AA)

##############################################################
##
## Clean any previous runs, extract everything and apply all patches
##



#-------------------------------------------------------------
# binutils takes 4m51 on an 1.7Ghz
#-------------------------------------------------------------

SRC_BINUTILS  =$(BASEDIR)/src/binutils-$(BINUTILSVERS)
BUILD_BINUTILS=$(BASEDIR)/build/$(TARGET)-binutils-$(BINUTILSVERS)

# JJvB: note: dependencies must stay in one line else make gpl-dist will fail
binutils : $(ARCHIVES)/binutils-$(BINUTILSVERS).tar.bz2 $(PATCHES)/binutils-uclinux_target.patch $(PATCHES)/binutils-2.17-bugfixes.patch
	rm -rf $(SRC_BINUTILS)
	mkdir -p $(SRC_BINUTILS)
	cd src && tar -xjf $(ARCHIVES)/binutils-$(BINUTILSVERS).tar.bz2
	cd        $(SRC_BINUTILS) && patch -p1 -E -i $(PATCHES)/binutils-2.17-bugfixes.patch
#	cd         $(SRC_BINUTILS) && patch -p1 -E -i $(PATCHES)/binutils-uclinux_target.patch
	rm   -rf $(BUILD_BINUTILS)
	mkdir -p $(BUILD_BINUTILS)
	cd       $(BUILD_BINUTILS) && $(SRC_BINUTILS)/configure \
		$(HOST_TARGET) \
		--target=$(TARGET) \
		--disable-nls \
		--disable-werror \
		--prefix=$(PREFIX)
	cd       $(BUILD_BINUTILS) && $(MAKE)
	cd       $(BUILD_BINUTILS) && $(MAKE) install
	cp $(PREFIX)/m68k-uclinux/bin/ld $(PREFIX)/m68k-uclinux/bin/ld.real
	cp $(PREFIX)/bin/m68k-uclinux-ld $(PREFIX)/bin/m68k-uclinux-ld.real

#-------------------------------------------------------------
# elf2flt takes 0m08 on an 1.7Ghz
#-------------------------------------------------------------

SRC_ELF2FLT=$(BASEDIR)/src/elf2flt
BUILD_ELF2FLT=$(BASEDIR)/build/$(TARGET)-elf2flt-$(ELF2FLTVERS)

elf2flt: $(ARCHIVES)/elf2flt-$(ELF2FLTVERS).tar.bz2
	rm -rf $(SRC_ELF2FLT)
	mkdir -p $(SRC_ELF2FLT)
	cd src && tar -xjf $(ARCHIVES)/elf2flt-$(ELF2FLTVERS).tar.bz2
	perl -pi~ -e's/time\(NULL\)/0/' $(SRC_ELF2FLT)/elf2flt.c
	rm -rf $(BUILD_ELF2FLT)
	mkdir  $(BUILD_ELF2FLT)
	cd     $(BUILD_ELF2FLT) && \
		$(SRC_ELF2FLT)/configure \
		--with-libbfd=$(BUILD_BINUTILS)/bfd/libbfd.a \
		--with-libiberty=$(BUILD_BINUTILS)/libiberty/libiberty.a \
		--with-bfd-include-dir=$(BUILD_BINUTILS)/bfd \
		--with-binutils-include-dir=$(SRC_BINUTILS)/include \
		--target=$(TARGET) \
		--prefix=$(PREFIX)
	cd $(BUILD_ELF2FLT) && $(MAKE)
	cd $(BUILD_ELF2FLT) && $(MAKE) install

#-------------------------------------------------------------
# gcc_unpack takes ???? on an 1.7Ghz
#-------------------------------------------------------------

SRC_GCC=$(BASEDIR)/src/gcc-$(GCCVERS)


# JJvB: note: dependencies must stay in one line else make gpl-dist will fail
gcc: $(ARCHIVES)/gcc-core-$(GCCVERS).tar.bz2 $(ARCHIVES)/gcc-g++-$(GCCVERS).tar.bz2 $(PATCHES)/gcc-3.4-coldfire-2regoffset.patch $(PATCHES)/gcc-3.4-output_mi_thunk.patch $(PATCHES)/gcc-3.4-addsi3_5200.patch $(PATCHES)/gcc-3.4.0-arm-multilib.patch $(PATCHES)/gcc-3.4.0-arm-deflibspec.patch $(PATCHES)/gcc-3.4.0-step1-fixes.patch $(PATCHES)/gcc-3.4.0-step2-fixes.patch
	rm -rf $(SRC_GCC) libstdc++-v3
	mkdir -p $(SRC_GCC)
	cd src && tar -xjf $(ARCHIVES)/gcc-core-$(GCCVERS).tar.bz2
	cd src && tar -xjf $(ARCHIVES)/gcc-g++-$(GCCVERS).tar.bz2
	cd $(SRC_GCC) && patch -p1 -E -i $(PATCHES)/gcc-3.4-coldfire-2regoffset.patch
	cd $(SRC_GCC) && patch -p1 -E -i $(PATCHES)/gcc-3.4-output_mi_thunk.patch
	cd $(SRC_GCC) && patch -p1 -E -i $(PATCHES)/gcc-3.4-addsi3_5200.patch
	cd $(SRC_GCC) && patch -p1 -E -i $(PATCHES)/gcc-3.4.0-arm-multilib.patch
	cd $(SRC_GCC) && patch -p1 -E -i $(PATCHES)/gcc-3.4.0-arm-deflibspec.patch
	cd $(SRC_GCC) && patch -p1 -E -i $(PATCHES)/gcc-3.4.0-step1-fixes.patch
	cd $(SRC_GCC) && patch -p1 -E -i $(PATCHES)/gcc-3.4.0-step2-fixes.patch


gcc_only_528x:
	perl -pi.old \
	-e 's:MULTILIB_OPTIONS = \S+m528x\S+:MULTILIB_OPTIONS = m528x:;' \
	-e 's:msep-data/mid-shared-library::;' \
	$(SRC_GCC)/gcc/config/m68k/t-uclinux


#-------------------------------------------------------------
# gcc_hack takes ???? on an 1.7Ghz
#-------------------------------------------------------------

gcc_hack-step2:
	perl -i -p -e "s,defined.*_GLIBCXX_USE_C99.*,1,g;" \
		$(SRC_GCC)/libstdc++-v3/config/locale/generic/c_locale.cc
	cd $(SRC_GCC)/libstdc++-v3/config/os/generic && \
	cp ctype_base.h ctype_inline.h ctype_noninline.h ../gnu-linux/

#-------------------------------------------------------------
# gcc_configure takes ???? on an 1.7Ghz
#-------------------------------------------------------------

gcc_configure_1:	# no threads
	#
	rm -rf build/$(TARGET)-gcc
	mkdir -p build/$(TARGET)-gcc

	cd build/$(TARGET)-gcc && \
	CFLAGS="-DDWARF2_UNWIND_INFO=0 $(CFLAGS)" \
	$(SRC_GCC)/configure $(HOST_TARGET)\
			--target=$(TARGET) \
			--prefix=$(PREFIX) \
			--enable-languages=c,c++ \
			--enable-multilib \
			--enable-target-optspace \
			--with-gnu-ld \
			--disable-nls \
			--disable-__cxa_atexit \
			--disable-c99 \
			--disable-clocale \
			--disable-c-mbchar \
			--disable-threads \
			--enable-cxx-flags='-D_ISOC99_SOURCE -D_BSD_SOURCE'


gcc_configure_2:
	#
	rm -rf build/$(TARGET)-gcc
	mkdir -p build/$(TARGET)-gcc

	cd build/$(TARGET)-gcc && \
	CFLAGS="-DDWARF2_UNWIND_INFO=0 $(CFLAGS)" \
	$(SRC_GCC)/configure $(HOST_TARGET)\
			--target=$(TARGET) \
			--prefix=$(PREFIX) \
			--enable-languages=c,c++ \
			--enable-multilib \
			--enable-target-optspace \
			--with-gnu-ld \
			--disable-nls \
			--disable-shared \
			--disable-__cxa_atexit \
			--disable-c99 \
			--disable-clocale \
			--disable-c-mbchar \
			--with-headers=$(PREFIX)/include \
			--enable-cxx-flags='-D_ISOC99_SOURCE -D_BSD_SOURCE -I$(PREFIX)/include/XXXX' \
			--enable-c-flags=' -I$(PREFIX)/include/YYYY' \
			--disable-threads \
			--disable-test


#-------------------------------------------------------------
# gcc takes 9m43 without libstdc++ on an 1.7Ghz
#-------------------------------------------------------------

gcc_make:
	cd build/$(TARGET)-gcc && \
		CFLAGS="-DDWARF2_UNWIND_INFO=0 $(CFLAGS)" \
		$(MAKE)
	cd build/$(TARGET)-gcc && $(MAKE) install

gcc-step1:
	make gcc
	mv -v $(SRC_GCC)/libstdc++-v3 $(SRC_GCC)/libstdc++-v3-dontbuild
	make gcc_only_528x
	make gcc_configure_1
	make gcc_make

gcc-step2:
	make gcc
	make gcc_only_528x
	make gcc_hack-step2
	make gcc_configure_2
	make gcc_make

links:
	cd ${PREFIX}/bin/ && for file in ${TARGET}-* ;\
	do \
		ln -vfs $$file ${OLDTARGET}$${file#${TARGET}};\
	done

#-------------------------------------------------------------
# genromfs takes ???? on an 1.7Ghz
#-------------------------------------------------------------

SRC_GENROMFS  =$(BASEDIR)/src/genromfs-$(GENROMFSVERS)
BUILD_GENROMFS=$(BASEDIR)/build/$(TARGET)-genromfs-$(GENROMFSVERS)

genromfs : $(ARCHIVES)/genromfs-$(GENROMFSVERS).tar.gz
	rm -rf $(SRC_GENROMFS)
	mkdir -p $(SRC_GENROMFS)
	cd src && tar -xzf $(ARCHIVES)/genromfs-$(GENROMFSVERS).tar.gz
	cd $(SRC_GENROMFS) && make
	cp -v $(SRC_GENROMFS)/genromfs $(PREFIX)/bin/genromfs
	chmod 755 $(PREFIX)/bin/genromfs


SRC_MTDUTILS =$(BASEDIR)/src/mtd-utils-$(MTDUTILSVERS)


mtd-utils : $(ARCHIVES)/mtd-utils-$(MTDUTILSVERS).tar.gz
	rm -rf $(SRC_MTDUTILS)
	mkdir -p $(SRC_MTDUTILS)
	cd src && tar -xzf $(ARCHIVES)/mtd-utils-$(MTDUTILSVERS).tar.gz
	cd $(SRC_MTDUTILS) && make mkfs.jffs2
	cp -v $(SRC_MTDUTILS)/mkfs.jffs2 $(PREFIX)/bin/mkfs.jffs2
	chmod 755 $(PREFIX)/bin/mkfs.jffs2
	
	

