#
# Makefile
#

include vars.mk

.PHONY: all clean distclean libc

all: linux-headers libgmp libmpfr binutils gcc-static uclibc gcc-final test

clean: linux-headers-clean libgmp-clean libmpfr-clean binutils-clean gcc-static-clean uclibc-clean gcc-final-clean test-clean

distclean: clean linux-headers-distclean libgmp-distclean libmpfr-distclean binutils-distclean gcc-static-distclean uclibc-distclean gcc-final-distclean test-distclean


# LINUX HEADERS
$(WORK)/linux-$(KERNEL_HEADERS_VERSION).tar.bz2:
	wget -P $(WORK) -c ftp://ftp.kernel.org/pub/linux/kernel/v2.6/linux-$(KERNEL_HEADERS_VERSION).tar.bz2

$(WORK)/linux-$(KERNEL_HEADERS_VERSION): $(WORK)/linux-$(KERNEL_HEADERS_VERSION).tar.bz2
	tar -C $(WORK) -xvjf $(WORK)/linux-$(KERNEL_HEADERS_VERSION).tar.bz2
	touch $(WORK)/linux-$(KERNEL_HEADERS_VERSION)

$(CLFS)/usr/include/asm: $(WORK)/linux-$(KERNEL_HEADERS_VERSION)
	mkdir -p $(CLFS)/usr/include
	cd $(WORK)/linux-$(KERNEL_HEADERS_VERSION) && \
		make mrproper && \
		make ARCH=arm headers_check && \
		make ARCH=arm INSTALL_HDR_PATH=$(CLFS)/usr headers_install
	touch $(CLFS)/usr/include/asm

linux-headers: $(CLFS)/usr/include/asm

linux-headers-clean:
	rm -vrf $(WORK)/linux-$(KERNEL_HEADERS_VERSION)

linux-headers-distclean: linux-headers-clean
	rm -vf $(WORK)/linux-$(KERNEL_HEADERS_VERSION).tar.bz2


# LIBGMP
$(WORK)/gmp-$(LIBGMP_VERSION).tar.bz2:
	wget -P $(WORK) -c ftp://ftp.gnu.org/gnu/gmp/gmp-$(LIBGMP_VERSION).tar.bz2

$(WORK)/gmp-$(LIBGMP_VERSION): $(WORK)/gmp-$(LIBGMP_VERSION).tar.bz2
	tar -C $(WORK) -xvjf $(WORK)/gmp-$(LIBGMP_VERSION).tar.bz2
	touch $(WORK)/gmp-$(LIBGMP_VERSION)

$(WORK)/build-libgmp: $(WORK)/gmp-$(LIBGMP_VERSION)
	mkdir -p $(WORK)/build-libgmp
	touch $(WORK)/build-libgmp

$(CROSSTOOLS)/lib/libgmp.so: $(WORK)/build-libgmp
	cd $(WORK)/build-libgmp && \
		unset CFLAGS && unset CXXFLAGS && \
		CPPFLAGS=-fexceptions \
		$(WORK)/gmp-$(LIBGMP_VERSION)/configure --prefix=$(CROSSTOOLS) --enable-cxx && \
		make && make install || exit 1
	touch $(CROSSTOOLS)/lib/libgmp.so

libgmp: $(CROSSTOOLS)/lib/libgmp.so

libgmp-clean:
	rm -vrf $(WORK)/build-libgmp $(WORK)/gmp-$(LIBGMP_VERSION)

libgmp-distclean: libgmp-clean
	rm -vrf $(WORK)/gmp-$(LIBGMP_VERSION).tar.bz2


# LIBMPFR
$(WORK)/mpfr-$(LIBMPFR_VERSION).tar.bz2:
	wget -P $(WORK) -c http://ftp.gnu.org/gnu/mpfr/mpfr-$(LIBMPFR_VERSION).tar.bz2

$(WORK)/mpfr-$(LIBMPFR_VERSION): $(WORK)/mpfr-$(LIBMPFR_VERSION).tar.bz2
	tar -C $(WORK) -xvjf $(WORK)/mpfr-$(LIBMPFR_VERSION).tar.bz2
	touch $(WORK)/mpfr-$(LIBMPFR_VERSION)

$(WORK)/build-libmpfr: $(WORK)/mpfr-$(LIBMPFR_VERSION)
	mkdir -p $(WORK)/build-libmpfr
	touch $(WORK)/build-libmpfr

$(CROSSTOOLS)/lib/libmpfr.so: $(WORK)/build-libmpfr
	cd $(WORK)/build-libmpfr && \
		unset CFLAGS && unset CXXFLAGS && \
		LDFLAGS="-Wl,-rpath,$(CROSSTOOLS)/lib" && \
		$(WORK)/mpfr-$(LIBMPFR_VERSION)/configure --prefix=$(CROSSTOOLS) --enable-shared --with-gmp=$(CROSSTOOLS) && \
		make && make install || exit 1
	touch $(CROSSTOOLS)/lib/libmpfr.so

libmpfr: $(CROSSTOOLS)/lib/libmpfr.so

libmpfr-clean:
	rm -vrf $(WORK)/build-libmpfr $(WORK)/mpfr-$(LIBMPFR_VERSION)

libmpfr-distclean: libmpfr-clean
	rm -vrf $(WORK)/mpfr-$(LIBMPFR_VERSION).tar.bz2


# BINUTILS
$(WORK)/binutils-$(BINUTILS_VERSION).tar.bz2:
	wget -P $(WORK) -c ftp://ftp.gnu.org/gnu/binutils/binutils-$(BINUTILS_VERSION).tar.bz2

$(WORK)/binutils-$(BINUTILS_VERSION): $(WORK)/binutils-$(BINUTILS_VERSION).tar.bz2 $(WORK)/binutils-$(BINUTILS_VERSION)-branch_update-5.patch
	tar -C $(WORK) -xvjf $(WORK)/binutils-$(BINUTILS_VERSION).tar.bz2
	cd $(WORK)/binutils-$(BINUTILS_VERSION) && \
		patch -p1 -i $(WORK)/binutils-$(BINUTILS_VERSION)-branch_update-5.patch
	sed -i '/^SUBDIRS/s/doc//' $(WORK)/binutils-$(BINUTILS_VERSION)/*/Makefile.in
	touch $(WORK)/binutils-$(BINUTILS_VERSION)

$(WORK)/build-binutils: $(WORK)/binutils-$(BINUTILS_VERSION)
	mkdir -p $(WORK)/build-binutils
	touch $(WORK)/build-binutils-build

$(CLFS)/usr/include/libiberty.h: $(WORK)/build-binutils
	cd $(WORK)/build-binutils && \
		unset CFLAGS && unset CXXFLAGS && \
		AR=ar AS=as \
		$(WORK)/binutils-$(BINUTILS_VERSION)/configure --prefix=$(CROSSTOOLS) \
		--host=$(HOST) --target=$(TARGET) --with-sysroot=$(CLFS) \
		--disable-nls --enable-shared --disable-multilib --nfp && \
		make configure-host && make && make install || exit 1
	cp -va $(WORK)/binutils-$(BINUTILS_VERSION)/include/libiberty.h $(CLFS)/usr/include
	touch $(CLFS)/usr/include/libiberty.h
		
binutils: linux-headers $(CLFS)/usr/include/libiberty.h

binutils-clean:
	rm -vrf $(WORK)/build-binutils $(WORK)/binutils-$(BINUTILS_VERSION)

binutils-distclean: binutils-clean
	rm -f $(WORK)/binutils-$(BINUTILS_VERSION).tar.bz2


# GCC-STATIC
$(WORK)/gcc-$(GCC_VERSION).tar.bz2:
	wget -P $(WORK) -c ftp://sources.redhat.com/pub/gcc/releases/gcc-$(GCC_VERSION)/gcc-$(GCC_VERSION).tar.bz2

$(WORK)/gcc-$(GCC_VERSION): $(WORK)/gcc-$(GCC_VERSION).tar.bz2
	tar -C $(WORK) -xvjf $(WORK)/gcc-$(GCC_VERSION).tar.bz2
	touch $(WORK)/gcc-$(GCC_VERSION)

$(WORK)/build-gcc-static: $(WORK)/gcc-$(GCC_VERSION)
	mkdir -p $(WORK)/build-gcc-static
	touch $(WORK)/build-gcc-static

$(CROSSTOOLS)/lib/gcc: $(WORK)/build-gcc-static $(WORK)/gcc-$(GCC_VERSION)
	cd $(WORK)/build-gcc-static && \
		unset CFLAGS && unset CXXFLAGS && \
		AR=ar LDFLAGS="-Wl,-rpath,$(CROSSTOOLS)/lib" \
		$(WORK)/gcc-$(GCC_VERSION)/configure --prefix=$(CROSSTOOLS) \
		--build=$(HOST) --host=$(HOST) --target=$(TARGET) \
		--disable-multilib --disable-nls \
		--without-headers --enable-__cxa_atexit --enable-symvers=gnu --disable-decimal-float \
		--nfp --without-fp --with-softfloat-support=internal \
		--disable-libgomp --disable-libmudflap --disable-libssp \
		--with-mpfr=$(CROSSTOOLS) --with-gmp=$(CROSSTOOLS) \
		--disable-shared --disable-threads --enable-languages=c && \
		make && make install || exit 1
	touch $(CROSSTOOLS)/lib/gcc/

gcc-static: linux-headers libgmp libmpfr binutils $(CROSSTOOLS)/lib/gcc

gcc-static-clean:
	rm -vrf $(WORK)/build-gcc-static $(WORK)/gcc-$(GCC_VERSION)

gcc-static-distclean: gcc-static-clean
	rm -vf $(WORK)/gcc-$(GCC_VERSION).tar.bz2

# UCLIBC
$(WORK)/uClibc-$(UCLIBC_VERSION).tar.xz:
	wget -P $(WORK) -c http://www.uclibc.org/downloads/uClibc-$(UCLIBC_VERSION).tar.xz

$(WORK)/uClibc-$(UCLIBC_VERSION): $(WORK)/uClibc-$(UCLIBC_VERSION).tar.xz
	tar -C $(WORK) -xvJf $(WORK)/uClibc-$(UCLIBC_VERSION).tar.xz
	touch $(WORK)/uClibc-$(UCLIBC_VERSION)

$(CLFS)/usr/include/bits/uClibc_config.h: $(WORK)/uClibc-$(UCLIBC_VERSION)
	mkdir -p $(WORK)/build-uClibc
	export PATH=$(CROSSTOOLS)/bin:$$PATH && \
		unset CFLAGS && unset CXXFLAGS && unset CC && unset CXX && \
		cd $(WORK)/uClibc-$(UCLIBC_VERSION) && \
		cp $(WORK)/uclibc-$(UCLIBC_VERSION).config .config && \
		make oldconfig && \
		make CC="$(TARGET)-gcc" KERNEL_HEADERS="$(CLFS)/usr/include" RANLIB="$(TARGET)-ranlib" STRIPTOOL="$(TARGET)-strip" LD="$(TARGET)-ld" AR="$(TARGET)-ar" AS="$(TARGET)-as" && \
		make DESTDIR="$(CLFS)" CC="$(TARGET)-gcc" KERNEL_HEADERS="$(CLFS)/usr/include" RANLIB="$(TARGET)-ranlib" STRIPTOOL="$(TARGET)-strip" LD="$(TARGET)-ld" AR="$(TARGET)-ar" AS="$(TARGET)-as" HOSTCC="gcc" install && \
	       	make DESTDIR="$(CLFS)" CC="$(TARGET)-gcc" KERNEL_HEADERS="$(CLFS)/usr/include" RANLIB="$(TARGET)-ranlib" STRIPTOOL="$(TARGET)-strip" LD="$(TARGET)-ld" AR="$(TARGET)-ar" AS="$(TARGET)-as" HOSTCC="gcc" install_dev || exit 1
	touch $(CLFS)/usr/include/bits/uClibc_config.h

uclibc: binutils gcc-static $(CLFS)/usr/include/bits/uClibc_config.h

uclibc-clean:
	rm -vrf $(WORK)/build-uClibc $(WORK)/uClibc-$(GLIBC_VERSION)

uclibc-distclean: uclibc-clean
	rm -vf $(WORK)/uClibc-$(UCLIBC_VERSION).tar.xz


# GCC-FINAL
$(WORK)/build-gcc-final: $(WORK)/gcc-$(GCC_VERSION)
	mkdir -p $(WORK)/build-gcc-final
	touch $(WORK)/build-gcc-final

$(CROSSTOOLS)/$(TARGET)/lib/libgomp.so: $(WORK)/build-gcc-final $(WORK)/gcc-$(GCC_VERSION)
	cd $(WORK)/build-gcc-final && \
		export PATH=$$PATH:$(CROSSTOOLS)/bin && \
		unset CFLAGS && unset CXXFLAGS && unset CC && \
		AR=ar LDFLAGS="-Wl,-rpath,$(CROSSTOOLS)/lib" \
		$(WORK)/gcc-$(GCC_VERSION)/configure --prefix=$(CROSSTOOLS) \
		--build=$(HOST) --host=$(HOST) --target=$(TARGET) \
		--with-fp=no --with-headers=$(CLFS)/usr/include \
		--disable-multilib --with-sysroot=$(CLFS) --disable-nls \
		--enable-languages=c,c++ --enable-__cxa_atexit \
		--with-mpfr=$(CROSSTOOLS) --with-gmp=$(CROSSTOOLS) \
		--enable-c99 --enable-long-long --enable-threads=posix && \
		make AS_FOR_TARGET="$(TARGET)-as" LD_FOR_TARGET="$(TARGET)-ld" && \
		make install || exit 1
	touch $(CLFS)/lib/gcc$(CROSSTOOLS)/lib/gcc/$(TARGET)/lib/libgomp.so
		
gcc-final: libgmp libmpfr uclibc $(CROSSTOOLS)/$(TARGET)/lib/libgomp.a

gcc-final-clean:
	rm -vrf $(WORK)/build-gcc-final $(WORK)/gcc-$(GCC_VERSION)

gcc-final-distclean: gcc-final-clean
	rm -vf $(WORK)/gcc-$(GCC_VERSION).tar.bz2


# TEST THE TOOLCHAIN
$(WORK)/test: $(WORK)/test.c
	export PATH=$$PATH:$(CROSSTOOLS)/bin && \
	unset CFLAGS && unset CXXFLAGS && unset CC && \
	AR=ar LDFLAGS="-Wl,-rpath,$(CROSSTOOLS)/lib" \
	$(TARGET)-gcc -Wall -o $(WORK)/test $(WORK)/test.c
	[ "`file -b $(WORK)/test | cut -d',' -f2 | sed 's| ||g'`" = "ARM"  ] || exit 1
	touch $(WORK)/test

test: gcc-final $(WORK)/test

testt: $(WORK)/test

test-clean:
	rm -vrf $(WORK)/test

test-distclean: test-clean

# End of file