#!/usr/bin/make -f

VER_GCC_BASE=4.5

DEB_NAME_ACT     := $(shell dpkg-parsechangelog| sed -n 's/-*//; s/^Source: \(.*\)/\1/p')
DEB_VER_ACT      := $(shell dpkg-parsechangelog| sed -n 's/-[^-]*//; s/^Version: \(.*\)/\1/p')
VER_LINUX        := 2.6.35#$(shell dpkg-parsechangelog -l/usr/src/linux-source-${VER_LINUX}/debian/changelog | egrep '^Version:' | cut -f 2 -d ' '|cut -f 1 -d '-')
DEB_VER_LINUX    := $(shell dpkg-parsechangelog -l/usr/src/linux-source-${VER_LINUX}/debian/changelog | egrep '^Version:' | cut -f 2 -d ' ')
VER_GCC          := $(shell dpkg-parsechangelog -l/usr/src/gcc-${VER_GCC_BASE}/debian/changelog | egrep '^Version:' | cut -f 2 -d ' '|cut -f 1 -d '-')
DEB_VER_GCC      := $(shell dpkg-parsechangelog -l/usr/src/gcc-${VER_GCC_BASE}/debian/changelog | egrep '^Version:' | cut -f 2 -d ' ')
VER_EGLIBC       := $(shell dpkg-parsechangelog -l/usr/src/glibc/debian/changelog | egrep '^Version:' | cut -f 2 -d ' '|cut -f 1 -d '-')
DEB_VER_EGLIBC   := $(shell dpkg-parsechangelog -l/usr/src/glibc/debian/changelog | egrep '^Version:' | cut -f 2 -d ' ')
VER_BINUTILS     := $(shell dpkg-parsechangelog -l/usr/src/binutils/debian/changelog | egrep '^Version:' | cut -f 2 -d ' '|cut -f 1 -d '-'|cut -d '.' -f1-3)
PKG_VER_BINUTILS := $(shell dpkg-parsechangelog -l/usr/src/binutils/debian/changelog | egrep '^Version:' | cut -f 2 -d ' '|cut -f 1 -d '-')
DEB_VER_BINUTILS := $(shell dpkg-parsechangelog -l/usr/src/binutils/debian/changelog | egrep '^Version:' | cut -f 2 -d ' ')

CROSS_ARCH       := $(shell dpkg-parsechangelog| sed -n 's/-[^-]*//; s/^Source: \(.*\)-.*-.*/\1/p')
CROSS_GNU_TYPE   := $(shell dpkg-architecture -a${CROSS_ARCH} -qDEB_HOST_GNU_TYPE -f)
HOST_ARCH        := $(shell dpkg-architecture -qDEB_HOST_ARCH_CPU)
HOST_GNU_TYPE    := $(shell dpkg-architecture -qDEB_HOST_GNU_TYPE)
stamp            := stamp-dir/

# taken from gcc packaging
define unpack_tarball
	tar -x -f $1
endef

info:
	@echo "Binutils version:         ${VER_BINUTILS}	${DEB_VER_BINUTILS}	${PKG_VER_BINUTILS}"
	@echo "GCC version:              ${VER_GCC}     	${DEB_VER_GCC}          ${VER_GCC_BASE}"
	@echo "Eglibc version:           ${VER_EGLIBC}  	${DEB_VER_EGLIBC}"
	@echo "Linux version:            ${VER_LINUX}   	${DEB_VER_LINUX}"
	@echo
	@echo "Target architecture:      ${CROSS_ARCH}"
	@echo "Target GNU type:          ${CROSS_GNU_TYPE}"
	@echo "Host architecture:        ${HOST_ARCH}"
	@echo "Host GNU type:            ${HOST_GNU_TYPE}"

$(stamp)init-dirs:
	mkdir debian/tmp -p
	touch $@

$(stamp)init-linux:
	$(call unpack_tarball, /usr/src/linux-source-${VER_LINUX}/linux-source-${VER_LINUX}.tar.bz2)
	cp -a /usr/src/linux-source-${VER_LINUX}/debian linux-source-${VER_LINUX}/debian
	cp -a /usr/src/linux-source-${VER_LINUX}/debian.master linux-source-${VER_LINUX}/debian.master
	cd linux-source-${VER_LINUX} && \
	fakeroot make -f debian/rules clean
	touch $@

$(stamp)build-linux: $(stamp)init-linux
	set -e; \
	cd linux-source-${VER_LINUX} ;\
	DEB_STAGE=stage1 NO_PKG_MANGLE=1 dpkg-buildpackage -b -uc -us -a${CROSS_ARCH}
	touch $@

$(stamp)install-linux: $(stamp)build-linux $(stamp)init-dirs
	dpkg-deb -x linux-libc-dev_${VER_LINUX}-*_${CROSS_ARCH}.deb debian/tmp
	touch $@

$(stamp)init-binutils:
	$(call unpack_tarball, /usr/src/binutils/binutils-${VER_BINUTILS}.tar.xz)
	cd binutils-${PKG_VER_BINUTILS} ;\
	cp -a /usr/src/binutils/debian/ . ;\
	echo ${CROSS_ARCH} > debian/target;
	touch $@

$(stamp)build-binutils: $(stamp)init-binutils
	set -e ;\
	cd binutils-${PKG_VER_BINUTILS} ;\
	WITH_SYSROOT=${CURDIR}/debian/tmp PATCHED_SOURCES=yes NO_PKG_MANGLE=1 dpkg-buildpackage -b -uc -us -nc -d
	# binutils wants dejagnu to generate docs which are not generate during cross build
	touch $@

$(stamp)build-final-binutils: $(stamp)install-binutils
	set -e ;\
	rm -rf binutils-${PKG_VER_BINUTILS}
	$(call unpack_tarball, /usr/src/binutils/binutils-${VER_BINUTILS}.tar.xz)
	cd binutils-${PKG_VER_BINUTILS} ;\
	cp -a /usr/src/binutils/debian/ . ;\
	echo ${CROSS_ARCH} > debian/target; \
	QUILT_PATCHES=${CURDIR}/debian/patches/binutils quilt push -a; \
	PATCHED_SOURCES=yes NO_PKG_MANGLE=1 dpkg-buildpackage -b -uc -us -nc -d
	# binutils wants dejagnu to generate docs which are not generate during cross build
	touch $@

$(stamp)install-binutils: $(stamp)build-binutils $(stamp)init-dirs
	dpkg-deb -x binutils-${CROSS_GNU_TYPE}_${DEB_VER_BINUTILS}_${HOST_ARCH}.deb debian/tmp
	touch $@

$(stamp)init-gcc:
	mkdir gcc -p ; \
	cd gcc ; \
	ln -sf /usr/src/gcc-${VER_GCC_BASE}/gcc-${VER_GCC}.tar.xz gcc-${VER_GCC}.tar.xz ;\
	cp -a  /usr/src/gcc-${VER_GCC_BASE}/debian/ . ; \
	cp -a  /usr/src/gcc-${VER_GCC_BASE}/patches debian/; \
	echo ${CROSS_ARCH} >debian/target
	touch $@

$(stamp)build-gcc1: $(stamp)init-gcc $(stamp)install-binutils
	export PATH=${CURDIR}/debian/tmp/usr/bin/:${PATH} ;\
	export LD_LIBRARY_PATH=${CURDIR}/debian/tmp/usr/$(HOST_GNU_TYPE)/${CROSS_GNU_TYPE}/lib/ ;\
	cd gcc && DEB_STAGE=stage1 NO_PKG_MANGLE=1 dpkg-buildpackage -b -uc -us -d
	touch $@

$(stamp)install-gcc1: $(stamp)build-gcc1
	dpkg-deb -x gcc-${VER_GCC_BASE}-${CROSS_GNU_TYPE}_${DEB_VER_GCC}_${HOST_ARCH}.deb debian/tmp
	dpkg-deb -x cpp-${VER_GCC_BASE}-${CROSS_GNU_TYPE}_${DEB_VER_GCC}_${HOST_ARCH}.deb debian/tmp
	cd debian/tmp/usr/bin/ ; \
	ln -sf ${CROSS_GNU_TYPE}-gcc-${VER_GCC_BASE} ${CROSS_GNU_TYPE}-gcc ; \
	ln -sf ${CROSS_GNU_TYPE}-cpp-${VER_GCC_BASE} ${CROSS_GNU_TYPE}-cpp ; \
	ln -sf ${CROSS_GNU_TYPE}-gcov-${VER_GCC_BASE} ${CROSS_GNU_TYPE}-gcov
	touch $@

$(stamp)build-gcc2: $(stamp)init-gcc $(stamp)install-eglibc1
	export PATH=${CURDIR}/debian/tmp/usr/bin/:${PATH} ;\
	export LD_LIBRARY_PATH=${CURDIR}/debian/tmp/usr/$(HOST_GNU_TYPE)/${CROSS_GNU_TYPE}/lib/:${CURDIR}/debian/tmp/usr/lib:${CURDIR}/debian/tmp/lib ;\
	cd gcc && WITH_BUILD_SYSROOT=${CURDIR}/debian/tmp DEB_STAGE=stage2 NO_PKG_MANGLE=1 dpkg-buildpackage -b -uc -us -d
	touch $@

$(stamp)install-gcc2: $(stamp)build-gcc2
	dpkg-deb -x gcc-${VER_GCC_BASE}-${CROSS_GNU_TYPE}_${DEB_VER_GCC}_${HOST_ARCH}.deb debian/tmp
	dpkg-deb -x cpp-${VER_GCC_BASE}-${CROSS_GNU_TYPE}_${DEB_VER_GCC}_${HOST_ARCH}.deb debian/tmp
	cd debian/tmp/usr/bin/ ; \
	ln -sf ${CROSS_GNU_TYPE}-gcc-${VER_GCC_BASE} ${CROSS_GNU_TYPE}-gcc ; \
	ln -sf ${CROSS_GNU_TYPE}-cpp-${VER_GCC_BASE} ${CROSS_GNU_TYPE}-cpp ; \
	ln -sf ${CROSS_GNU_TYPE}-gcov-${VER_GCC_BASE} ${CROSS_GNU_TYPE}-gcov
	touch $@

$(stamp)init-eglibc:
	rm -rf eglibc-${VER_EGLIBC}
	$(call unpack_tarball, /usr/src/glibc/eglibc-${VER_EGLIBC}.tar.xz)
	cd eglibc-${VER_EGLIBC} ; \
	cp -a /usr/src/glibc/debian/ .; \
	patch <${CURDIR}/debian/patches/eglibc/local-kill-locales.patch -p1 ;\
	patch <${CURDIR}/debian/patches/eglibc/local-no-notneeded-packages.patch -p1
	touch $@

$(stamp)build-eglibc1: $(stamp)init-eglibc $(stamp)install-linux $(stamp)install-gcc1
	export PATH=${CURDIR}/debian/tmp/usr/bin/:${PATH} ;\
	export LD_LIBRARY_PATH=${CURDIR}/debian/tmp/usr/$(HOST_GNU_TYPE)/${CROSS_GNU_TYPE}/lib/ ;\
	export LINUX_SOURCE=${CURDIR}/debian/tmp/usr ;\
	cd eglibc-${VER_EGLIBC} ;\
	PATCHED_SOURCES=yes WITH_BUILD_SYSROOT=${CURDIR}/debian/tmp DEB_STAGE=stage1 NO_PKG_MANGLE=1 dpkg-buildpackage -b -uc -us -a${CROSS_ARCH}
	touch $@

$(stamp)install-eglibc1: $(stamp)build-eglibc1
	dpkg-deb -x libc6-dev_${DEB_VER_EGLIBC}_${CROSS_ARCH}.deb debian/tmp
	touch $@

$(stamp)build-eglibc2: $(stamp)init-eglibc $(stamp)install-gcc2
	export PATH=${CURDIR}/debian/tmp/usr/bin/:${PATH} ;\
	export LD_LIBRARY_PATH=${CURDIR}/debian/tmp/usr/$(HOST_GNU_TYPE)/${CROSS_GNU_TYPE}/lib/ ;\
	export LINUX_SOURCE=${CURDIR}/debian/tmp/usr ;\
	export DEB_BUILD_OPTIONS="nocheck notest notests" ; \
	cd eglibc-${VER_EGLIBC} && PATCHED_SOURCES=yes WITH_BUILD_SYSROOT=${CURDIR}/debian/tmp NO_PKG_MANGLE=1 dpkg-buildpackage -b -uc -us -a${CROSS_ARCH}
	touch $@
	
clean:
	rm -rf linux-source-${VER_LINUX}
	rm -rf eglibc-${VER_EGLIBC}
	rm -rf gcc
	rm -rf binutils-${PKG_VER_BINUTILS}
	rm -rf debian/tmp
	rm -f *.deb *.changes
	rm -rf $(stamp)
	mkdir $(stamp)

DEB_LIST_ARCH = \
           binutils-${CROSS_GNU_TYPE}_${PKG_VER_BINUTILS}-*_${HOST_ARCH}.deb

DEB_LIST_ALL = \
           libc6-${CROSS_ARCH}-cross_${VER_EGLIBC}-*_all.deb  \
           libc6-dbg-${CROSS_ARCH}-cross_${VER_EGLIBC}-*_all.deb  \
           libc6-dev-${CROSS_ARCH}-cross_${VER_EGLIBC}-*_all.deb  \
           linux-libc-dev-${CROSS_ARCH}-cross_${VER_LINUX}-*_all.deb  \
           libgcc1-${CROSS_ARCH}-cross_${DEB_VER_GCC}_all.deb  \
           libgcc1-dbg-${CROSS_ARCH}-cross_${DEB_VER_GCC}_all.deb  \

#
# I want libgcc1 to contain changelog etc which normally are in gcc-4.5-*-base package
# also libgcc1(-dbg) should not depend on it
# libgcc1-dbg needs to have doc symlink to libgcc1
define repack_debs
	for deb in $1; \
	do \
	    dpkg-deb -x $$deb tmp; \
	    dpkg-deb -e $$deb tmp/DEBIAN; \
	    sed -i -e's/^Source:.*/Source: ${DEB_NAME_ACT} (${DEB_VER_ACT})/' tmp/DEBIAN/control; \
	    sed -i -e "s/${DEB_VER_LINUX}/${DEB_VER_LINUX}cross${DEB_VER_ACT}/g" tmp/DEBIAN/control ; \
	    sed -i -e "s/Version: ${VER_LINUX}-\(.*\)$$/Version: ${VER_LINUX}-\1cross${DEB_VER_ACT}/g" tmp/DEBIAN/control ; \
	    sed -i -e "s/${DEB_VER_EGLIBC}/${DEB_VER_EGLIBC}cross${DEB_VER_ACT}/g" tmp/DEBIAN/control ; \
	    sed -i -e "s/${DEB_VER_BINUTILS}/${DEB_VER_BINUTILS}cross${DEB_VER_ACT}/g" tmp/DEBIAN/control ; \
	    sed -i -e "s/${DEB_VER_GCC}/${DEB_VER_GCC}cross${DEB_VER_ACT}/g" tmp/DEBIAN/control ; \
	    sed -i -e "s/cross${DEB_VER_ACT}cross${DEB_VER_ACT}/cross${DEB_VER_ACT}/g" tmp/DEBIAN/control ; \
	    if [ 'libgcc1-dbg-${CROSS_ARCH}-cross' = `echo $$deb | cut -d'_' -f1` ]; then \
	      sed -i -e 's/^Depends.*/Depends: libgcc1-${CROSS_ARCH}-cross (= 1:${DEB_VER_GCC}cross${DEB_VER_ACT})/g' tmp/DEBIAN/control; \
	      ln -sf libgcc1-${CROSS_ARCH}-cross tmp/usr/share/doc/libgcc1-dbg-${CROSS_ARCH}-cross; \
	    fi; \
	    if [ 'libgcc1-${CROSS_ARCH}-cross' = `echo $$deb | cut -d'_' -f1` ]; then \
	      sed -i -e'/^Depends/d' tmp/DEBIAN/control; \
	      rm tmp/usr/share/doc/libgcc1-${CROSS_ARCH}-cross; \
	      mkdir -p tmp/usr/share/doc/libgcc1-${CROSS_ARCH}-cross; \
	      cp usr/share/doc/gcc-4.5-${CROSS_GNU_TYPE}-base/* tmp/usr/share/doc/libgcc1-${CROSS_ARCH}-cross; \
	      mv tmp/usr/share/doc/libgcc1-${CROSS_ARCH}-cross/changelog.Debian.gz \
	         tmp/usr/share/doc/libgcc1-${CROSS_ARCH}-cross/changelog.Debian.gcc-${VER_GCC_BASE}.gz; \
	      gzip -c9 debian/changelog > tmp/usr/share/doc/libgcc1-${CROSS_ARCH}-cross/changelog.Debian.gz;\
	      (cd tmp && md5sum usr/${CROSS_GNU_TYPE}/lib/* usr/share/doc/libgcc1-${CROSS_ARCH}-cross/* usr/share/lintian/overrides/libgcc1-${CROSS_ARCH}-cross >>DEBIAN/md5sums);\
	    fi; \
	    newdeb=`echo $$deb|sed -e "s/\(.*\)_\(.*\)_\(.*\)/\1_\2cross${DEB_VER_ACT}_\3/g"`; \
	    dpkg-deb -b tmp/ ../$$newdeb; \
	    rm -rf tmp/*; \
	done
endef

repack-debs-arch: build
	$(call repack_debs, ${DEB_LIST_ARCH})

repack-debs-indep: dpkg-cross
	dpkg-deb -x gcc-4.5-${CROSS_GNU_TYPE}-base_${DEB_VER_GCC}_${HOST_ARCH}.deb .
	$(call repack_debs, ${DEB_LIST_ALL})

build: $(stamp)build-eglibc2 $(stamp)build-final-binutils

binary: binary-arch binary-indep
binary-arch: mangle-debian-files-arch
binary-indep: mangle-debian-files-indep

$(stamp)debian-files-base:
	rm -f debian/files
	touch $@

define generate_debian_files
	for deb in $1; \
	do \
		echo -n "`basename $$deb` " >>debian/files; \
		dpkg-deb -I $$deb | grep Section  | cut -d ' ' -f 3 | tr "\n" ' ' >>debian/files; \
		dpkg-deb -I $$deb | grep Priority | cut -d ' ' -f 3 | tr -d "\n" >>debian/files; \
		echo "" >>debian/files; \
	done
endef

mangle-debian-files-arch: $(stamp)debian-files-base repack-debs-arch
	$(call generate_debian_files,   ${DEB_LIST_ARCH})
	sed -i -e "s/_all.deb/cross${DEB_VER_ACT}_all.deb/g" debian/files
	sed -i -e "s/_${HOST_ARCH}.deb/cross${DEB_VER_ACT}_${HOST_ARCH}.deb/g" debian/files
	sed -i -e "s/cross${DEB_VER_ACT}cross${DEB_VER_ACT}/cross${DEB_VER_ACT}/g" debian/files

mangle-debian-files-indep: $(stamp)debian-files-base repack-debs-indep
	$(call generate_debian_files,   ${DEB_LIST_ALL})
	sed -i -e "s/_all.deb/cross${DEB_VER_ACT}_all.deb/g" debian/files
	sed -i -e "s/_${HOST_ARCH}.deb/cross${DEB_VER_ACT}_${HOST_ARCH}.deb/g" debian/files
	sed -i -e "s/cross${DEB_VER_ACT}cross${DEB_VER_ACT}/cross${DEB_VER_ACT}/g" debian/files

dpkg-cross: build
	for deb in libc6_*_${CROSS_ARCH}.deb libc6-d*_${CROSS_ARCH}.deb linux-libc-dev_*_${CROSS_ARCH}.deb; \
	do \
	    dpkg-cross -a ${CROSS_ARCH} -X findutils -X tzdata -X libc-bin -X libc-dev-bin -b $$deb; \
	done

# not finished version as it should also add what mangle-debian-files-{arch,indep} do
regenerate-debian-control:
	@cp debian/control.in debian/control
	@echo -n "Build-Depends: dpkg-cross, binutils-multiarch (>= 2.20.1-13~), binutils-source (>= 2.20.51.20100710-1ubuntu2), eglibc-source (>= 2.12.1-0ubuntu2), gcc-4.5-source (>= 4.5.1-5ubuntu1), linux-source (>= 2.6.35-14.20), " >> debian/control
	@perl debian/control-grab-build-depends.pl \
	    /usr/src/binutils/debian/control \
	    /usr/src/gcc-4.5/debian/control \
	    /usr/src/glibc/debian/control \
	    /usr/src/linux-source-${VER_LINUX}/debian/control \
	    >> debian/control
	@echo >>debian/control
	@echo -n "Build-Conflicts: " >> debian/control
	@perl debian/control-grab-build-conflicts.pl \
	    /usr/src/binutils/debian/control \
	    /usr/src/gcc-4.5/debian/control \
	    /usr/src/glibc/debian/control \
	    /usr/src/linux-source-${VER_LINUX}/debian/control \
	    >> debian/control
	@echo >>debian/control
