#!/usr/bin/make -f

# prefix for builds - without leading slash
PF ?= usr

include debian/kernelarch.make

vendor := $(shell if dpkg-vendor --derives-from Ubuntu; then echo ubuntu; else echo debian; fi)

# Support multiple makes at once based on number of processors
ifneq (,$(filter parallel=%,$(DEB_BUILD_OPTIONS)))
NJOBS=parallel=$(patsubst parallel=%,%,$(filter parallel=%,$(DEB_BUILD_OPTIONS)))
else
NJOBS=
endif

DEB_NAME_ACT     := $(shell dpkg-parsechangelog| sed -n 's/-*//; s/^Source: \(.*\)/\1/p')
DEB_SVER_ACT     := $(shell dpkg-parsechangelog| sed -n 's/^Version: \(.*\)/\1/p')
DEB_VER_ACT      := $(shell /bin/sh debian/new_cross_version.sh)
DEB_VER_ACT      := 2
CROSS_EXT	:= cross$(DEB_VER_ACT)

HOST_ARCH        := $(shell dpkg-architecture -qDEB_HOST_ARCH_CPU)
HOST_GNU_TYPE    := $(shell dpkg-architecture -qDEB_HOST_GNU_TYPE)
stamp            := stamp-dir/

CROSS_ARCHES     ?= ppc64el powerpc arm64 armhf armel
CROSS_ARCH       = $(subst .,,$(suffix $@))
KERNEL_ARCH      = $(KERNEL_ARCH_$(CROSS_ARCH))
CROSS_BIARCH     = $(CROSS_BIARCH_$(CROSS_ARCH))
_gnu_type        = $(shell dpkg-architecture -a$(1) -qDEB_HOST_GNU_TYPE -f)
CROSS_GNU_TYPE   = $(call _gnu_type,${CROSS_ARCH})

# ARM32 soft-float/hard-float multilibs. These are not yet built in a
# "proper" multilib location, so only build simple dependency packages
ARM32_MULTILIBS :=
ifeq ($(vendor),ubuntu)
  ARM32_MULTILIBS := yes
  ARM32_MULTILIBS := dummy
endif

MIN_VER_GLIBC  := 2.19-0~
MIN_VER_LINUX  := 3.13.0-0~
MIN_VER_GCC    := 4.9.2-10

DEB_VER_LINUX  := $(shell apt-cache policy linux-libc-dev | awk '/^ \*\*\*/ {print $$2}')
ifeq ($(vendor),ubuntu)
  VER_LINUX      := $(shell echo $(DEB_VER_LINUX) | sed 's/^\([0-9]*\.[0-9]*\.[0-9]*\).*/\1/')
else
  VER_LINUX      := $(shell echo $(DEB_VER_LINUX) | sed 's/^\([0-9]*\.[0-9]*\).*/\1/')
endif
VER_GCC_BASE   := 4.9

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_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 ' ')
VER_GLIBC        := $(shell dpkg-parsechangelog -l/usr/src/glibc/debian/changelog | egrep '^Version:' | cut -f 2 -d ' '|cut -f 1 -d '-')
DEB_VER_GLIBC    := $(shell dpkg-parsechangelog -l/usr/src/glibc/debian/changelog | egrep '^Version:' | cut -f 2 -d ' ')

BINUTILS_DIR  := /usr/src/binutils
GLIBC_DIR     := /usr/src/glibc
GCC_DIR       := /usr/src/gcc-${VER_GCC_BASE}

GLIBC_PATCHES  := $(CURDIR)/debian/patches/glibc/$(vendor)

# 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 "Glibc version:            ${VER_GLIBC}  		${DEB_VER_GLIBC}"
	@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 -p $(foreach arch,$(CROSS_ARCHES),debian/tmp.$(arch))
	touch $@

init: $(stamp)init-linux

$(stamp)init-linux:
	@echo START $@
	$(call unpack_tarball, $(firstword $(wildcard /usr/src/linux-source-$(VER_LINUX).tar.* /usr/src/linux-source-$(VER_LINUX)/linux-source-$(VER_LINUX).tar.*)))
	touch $@

$(stamp)build-linux.%: $(stamp)init-linux
	@echo START $@
	cp debian/builddeb linux-source-$(VER_LINUX)/scripts/package/
	sed -i '/$$(MAKE)/d' linux-source-$(VER_LINUX)/scripts/package/Makefile
	set -e; \
	export DEBMAIL="`dpkg-parsechangelog |grep ^Maintainer | sed -e 's/^Maintainer: //g'`"; \
	export DEBEMAIL="`echo $$DEBMAIL | sed -e 's/.*<\(.*\)>/\1/g'`"; \
	export DEBFULLNAME="`echo $$DEBMAIL | sed -e 's/\(.*\)<.*>/\1/g'`"; \
	export ARCH=${KERNEL_ARCH} ;\
	export KBUILD_DEBARCH=${CROSS_ARCH} ;\
	export KDEB_PKGVERSION=${DEB_VER_LINUX} ;\
	cd linux-source-${VER_LINUX} ;\
	make oldnoconfig ;\
	make deb-pkg
	rm -rf tmp
	install -d tmp
	dpkg-deb -R linux-libc-dev-${CROSS_ARCH}-cross_${DEB_VER_LINUX}_all.deb debian/tmp.${CROSS_ARCH}
	dpkg-deb -R linux-libc-dev-${CROSS_ARCH}-cross_${DEB_VER_LINUX}_all.deb tmp
	cd tmp/usr/include ;\
	rm -rf drm scsi ;\
	rm -f `find . -name .install` ;\
	rm -f `find . -name ..install.cmd`
	mkdir tmp/usr/${CROSS_GNU_TYPE}
	mv tmp/usr/include/ tmp/usr/${CROSS_GNU_TYPE}/include/
	rm tmp/DEBIAN/md5sums
	install -d -m 755 tmp/usr/share/lintian/overrides
	echo "linux-libc-dev-${CROSS_ARCH}-cross binary: non-standard-dir-in-usr" \
	  >> tmp/usr/share/lintian/overrides/linux-libc-dev-${CROSS_ARCH}-cross
	fakeroot dpkg-deb -b tmp linux-libc-dev-${CROSS_ARCH}-cross_${DEB_VER_LINUX}_all.deb
	rm -rf tmp
	install -d tmp
	touch $@

$(stamp)install-linux.%: $(stamp)build-linux.% $(stamp)init-dirs
	@echo START $@
	dpkg-deb -x linux-libc-dev-${CROSS_ARCH}-cross_${DEB_VER_LINUX}_all.deb debian/linux-libc-dev-${CROSS_ARCH}-cross
	touch $@

define init_binutils
	$(call unpack_tarball, ${BINUTILS_DIR}/binutils-${VER_BINUTILS}.tar.xz)
	set -e; \
	cd binutils-${PKG_VER_BINUTILS} ;\
	cp -a ${BINUTILS_DIR}/debian/ . ;\
	if [ -n "$$(grep -v '^\#' ${CURDIR}/debian/patches/binutils/series)" ]; then \
	  QUILT_PATCHES=${CURDIR}/debian/patches/binutils quilt --quiltrc /dev/null  push -a; \
	fi;
endef

$(stamp)init-binutils:
	@echo START $@
	$(call init_binutils)
	touch $@

$(stamp)build-binutils.%: $(stamp)init-binutils
	@echo START $@
	set -e ;\
	cd binutils-${PKG_VER_BINUTILS} ;\
	echo ${CROSS_ARCH} > debian/target ;\
	WITH_SYSROOT=${CURDIR}/debian/tmp.${CROSS_ARCH} PATCHED_SOURCES=yes PKG_IGNORE_CURRENTLY_BUILDING=1 BACKPORT=false dpkg-buildpackage -b -uc -us -d
	touch $@

$(stamp)install-binutils.%: $(stamp)build-binutils.% $(stamp)init-dirs
	@echo START $@
	dpkg-deb -x binutils-${CROSS_GNU_TYPE}_${DEB_VER_BINUTILS}_${HOST_ARCH}.deb debian/tmp.${CROSS_ARCH}
	rm -f debian/tmp.${CROSS_ARCH}/usr/bin/*.exe
	for i in debian/tmp.${CROSS_ARCH}/usr/bin/*; do \
	  mv $$i $$i.exe; \
	  ( \
	    echo '#!/bin/sh'; \
	    echo 'LD_LIBRARY_PATH=$(CURDIR)/debian/tmp.${CROSS_ARCH}/usr/$(HOST_GNU_TYPE)/${CROSS_GNU_TYPE}/lib$${LD_LIBRARY_PATH:+:$$LD_LIBRARY_PATH}'; \
	    echo 'export LD_LIBRARY_PATH'; \
	    echo 'exec $$0.exe "$$@"'; \
	  ) > $$i; \
	  chmod +x $$i; \
	done
	touch $@

$(stamp)init-gcc:
	@echo START $@
	set -e; \
	mkdir gcc -p ; \
	cd gcc ; \
	ln -sf ${GCC_DIR}/gcc-${VER_GCC}.tar.xz gcc-${VER_GCC}.tar.xz ;\
	cp -a  ${GCC_DIR}/debian/ . ; \
	if [ -n "$$(grep -v '^\#' ${CURDIR}/debian/patches/gcc/series)" ]; then \
	  QUILT_PATCHES=${CURDIR}/debian/patches/gcc quilt --quiltrc /dev/null  push -a ; \
	fi;
	touch $@

$(stamp)build-gcc1.%: $(stamp)init-gcc $(stamp)install-binutils.%
	@echo START $@
	echo ${CROSS_ARCH} >gcc/debian/target
	export PATH=${CURDIR}/debian/tmp.${CROSS_ARCH}/$(PF)/bin/:${PATH} ;\
	cd gcc && DH_VERBOSE=1 WITH_SYSROOT=/ WITH_BUILD_SYSROOT=${CURDIR}/debian/tmp.${CROSS_ARCH} DEB_STAGE=stage1 PKG_IGNORE_CURRENTLY_BUILDING=1 BACKPORT=false dpkg-buildpackage -b -uc -us -d
	touch $@

$(stamp)install-gcc1.%: $(stamp)build-gcc1.%
	@echo START $@
	$(call install_gcc)
	cp -r gcc/build/gcc/include debian/tmp.${CROSS_ARCH}/$(PF)/lib/gcc-cross/${CROSS_GNU_TYPE}/${VER_GCC_BASE}/
	cp -r gcc/build/gcc/include-fixed debian/tmp.${CROSS_ARCH}/$(PF)/lib/gcc-cross/${CROSS_GNU_TYPE}/${VER_GCC_BASE}/
ifneq (,$(ARM32_MULTILIBS))
	$(if $(filter $(CROSS_ARCH),armhf), \
	  dpkg-deb -x libsfgcc-${VER_GCC_BASE}-dev-${CROSS_ARCH}-cross_${DEB_VER_GCC}_all.deb \
		debian/tmp.${CROSS_ARCH} \
	)
	$(if $(filter $(CROSS_ARCH),armel), \
	  dpkg-deb -x libhfgcc-${VER_GCC_BASE}-dev-${CROSS_ARCH}-cross_${DEB_VER_GCC}_all.deb \
		debian/tmp.${CROSS_ARCH} \
	)
endif
	$(if $(filter $(CROSS_ARCH),powerpc), \
	  dpkg-deb -x lib64gcc-${VER_GCC_BASE}-dev-${CROSS_ARCH}-cross_${DEB_VER_GCC}_all.deb \
		debian/tmp.${CROSS_ARCH} \
	)
	touch $@

define install_gcc
	dpkg-deb -x gcc-${VER_GCC_BASE}-${CROSS_GNU_TYPE}_${DEB_VER_GCC}_${HOST_ARCH}.deb debian/tmp.${CROSS_ARCH}
	dpkg-deb -x cpp-${VER_GCC_BASE}-${CROSS_GNU_TYPE}_${DEB_VER_GCC}_${HOST_ARCH}.deb debian/tmp.${CROSS_ARCH}
	dpkg-deb -x libgcc-${VER_GCC_BASE}-dev-${CROSS_ARCH}-cross_${DEB_VER_GCC}_all.deb debian/tmp.${CROSS_ARCH}
	cd debian/tmp.${CROSS_ARCH}/$(PF)/bin/ && \
	ln -sf ${CROSS_GNU_TYPE}-gcc-${VER_GCC} ${CROSS_GNU_TYPE}-gcc && \
	ln -sf ${CROSS_GNU_TYPE}-cpp-${VER_GCC} ${CROSS_GNU_TYPE}-cpp && \
	ln -sf ${CROSS_GNU_TYPE}-gcov-${VER_GCC} ${CROSS_GNU_TYPE}-gcov
endef

$(stamp)build-gcc2.%: $(stamp)init-gcc $(stamp)install-glibc1.%
	@echo START $@
	export PATH=${CURDIR}/debian/tmp.${CROSS_ARCH}/$(PF)/bin:${PATH} ;\
	export LD_LIBRARY_PATH=${CURDIR}/debian/tmp.${CROSS_ARCH}/$(PF)/$(HOST_GNU_TYPE)/${CROSS_GNU_TYPE}/lib/:${CURDIR}/debian/tmp.${CROSS_ARCH}/usr/lib:${CURDIR}/debian/tmp.${CROSS_ARCH}/lib ;\
	cd gcc && DH_VERBOSE=1 WITH_SYSROOT=/ WITH_BUILD_SYSROOT=${CURDIR}/debian/tmp.${CROSS_ARCH} DEB_STAGE=stage2 PKG_IGNORE_CURRENTLY_BUILDING=1 BACKPORT=false dpkg-buildpackage -b -uc -us -d
	touch $@

$(stamp)install-gcc2.%: $(stamp)build-gcc2.%
	@echo START $@
	$(call install_gcc)
	dpkg-deb -x libgcc1-${CROSS_ARCH}-cross_${DEB_VER_GCC}_all.deb \
		debian/tmp.${CROSS_ARCH}
ifneq (,$(ARM32_MULTILIBS))
	$(if $(filter $(CROSS_ARCH),armhf), \
	  dpkg-deb -x libsfgcc1-${CROSS_ARCH}-cross_${DEB_VER_GCC}_all.deb \
		debian/tmp.${CROSS_ARCH}; \
	  dpkg-deb -x libsfgcc-${VER_GCC_BASE}-dev-${CROSS_ARCH}-cross_${DEB_VER_GCC}_all.deb \
		debian/tmp.${CROSS_ARCH} \
	)
	$(if $(filter $(CROSS_ARCH),armel), \
	  dpkg-deb -x libhfgcc1-${CROSS_ARCH}-cross_${DEB_VER_GCC}_all.deb \
		debian/tmp.${CROSS_ARCH}; \
	  dpkg-deb -x libhfgcc-${VER_GCC_BASE}-dev-${CROSS_ARCH}-cross_${DEB_VER_GCC}_all.deb \
		debian/tmp.${CROSS_ARCH} \
	)
endif
	$(if $(filter $(CROSS_ARCH),powerpc), \
	  dpkg-deb -x lib64gcc1-${CROSS_ARCH}-cross_${DEB_VER_GCC}_all.deb \
		debian/tmp.${CROSS_ARCH}; \
	  dpkg-deb -x lib64gcc-${VER_GCC_BASE}-dev-${CROSS_ARCH}-cross_${DEB_VER_GCC}_all.deb \
		debian/tmp.${CROSS_ARCH} \
	)
	touch $@

$(stamp)build-gcc3.%: $(stamp)init-gcc $(stamp)install-glibc2.%
	@echo START $@
	export PATH=${CURDIR}/debian/tmp.${CROSS_ARCH}/$(PF)/bin/:${PATH} ;\
	export LD_LIBRARY_PATH=${CURDIR}/debian/tmp.${CROSS_ARCH}/$(PF)/$(HOST_GNU_TYPE)/${CROSS_GNU_TYPE}/lib/:${CURDIR}/debian/tmp.${CROSS_ARCH}/usr/lib:${CURDIR}/debian/tmp.${CROSS_ARCH}/lib ;\
	cd gcc && WITH_BUILD_SYSROOT=${CURDIR}/debian/tmp.${CROSS_ARCH} DEB_STAGE=stage2 PKG_IGNORE_CURRENTLY_BUILDING=1 BACKPORT=false dpkg-buildpackage -b -uc -us -d
	touch $@

$(stamp)init-glibc:
	@echo START $@
	rm -rf glibc-${VER_GLIBC}
	$(call unpack_tarball, ${GLIBC_DIR}/glibc-${VER_GLIBC}.tar.xz)
	cp -a ${GLIBC_DIR}/debian/ glibc-${VER_GLIBC}
	cd glibc-${VER_GLIBC} ; \
	QUILT_PATCHES=${GLIBC_PATCHES} quilt --quiltrc /dev/null push -a && \
	rm -rf .pc/
	touch $@

$(stamp)build-glibc1.%: $(stamp)init-glibc $(stamp)install-linux.% $(stamp)install-gcc1.%
	@echo START $@
# FIXME: why debian/libgcc1-armel-cross?
	export PATH=${CURDIR}/debian/tmp.${CROSS_ARCH}/$(PF)/bin/:${PATH} ;\
	export LD_LIBRARY_PATH=${CURDIR}/debian/tmp.${CROSS_ARCH}/$(PF)/$(HOST_GNU_TYPE)/${CROSS_GNU_TYPE}/lib/:${CURDIR}/gcc/debian/libgcc1-armel-cross/usr/${CROSS_GNU_TYPE}/lib/ ;\
	export LINUX_SOURCE=${CURDIR}/debian/tmp.${CROSS_ARCH}/usr ;\
	cd glibc-${VER_GLIBC} ;\
	PATCHED_SOURCES=yes WITH_BUILD_SYSROOT=${CURDIR}/debian/tmp.${CROSS_ARCH} DEB_BUILD_PROFILES=stage1 PKG_IGNORE_CURRENTLY_BUILDING=1 BACKPORT=false fakeroot dpkg-buildpackage -B -uc -us -a${CROSS_ARCH} -d
	touch $@

$(stamp)install-glibc1.%: $(stamp)build-glibc1.%
	@echo START $@
	dpkg-deb -x libc6-dev_${DEB_VER_GLIBC}_${CROSS_ARCH}.deb debian/tmp.${CROSS_ARCH}
ifneq (,$(ARM32_MULTILIBS))
	$(if $(filter $(CROSS_ARCH),armhf), \
	  dpkg-deb -x libc6-dev-armel_${DEB_VER_GLIBC}_${CROSS_ARCH}.deb debian/tmp.${CROSS_ARCH} \
	)
	$(if $(filter $(CROSS_ARCH),armel), \
	  dpkg-deb -x libc6-dev-armhf_${DEB_VER_GLIBC}_${CROSS_ARCH}.deb debian/tmp.${CROSS_ARCH} \
	)
endif
	$(if $(filter $(CROSS_ARCH),powerpc), \
	  dpkg-deb -x libc6-dev-ppc64_${DEB_VER_GLIBC}_${CROSS_ARCH}.deb debian/tmp.${CROSS_ARCH} \
	)
	: # FIXME: why is this needed?
	cd debian/tmp.${CROSS_ARCH}/usr/lib ;\
	for crt in ${CROSS_GNU_TYPE}/crt*; do \
		ln -sf $$crt `basename $$crt`; \
	done
	: # dpkg-shlibdeps for the stage2 gcc needs these
	for d in $$(find debian/tmp.${CROSS_ARCH}/usr/lib -name libc.so -printf '%h\n'); do \
	  ln -sf libc.so $$d/libc.so.6; \
	done
	touch $@

$(stamp)build-glibc2.%: $(stamp)init-glibc $(stamp)install-gcc2.%
	@echo START $@
# FIXME: why debian/libgcc1-armel-cross?
	export PATH=${CURDIR}/debian/tmp.${CROSS_ARCH}/$(PF)/bin/:${PATH} ;\
	export LD_LIBRARY_PATH=${CURDIR}/debian/tmp.${CROSS_ARCH}/$(PF)/$(HOST_GNU_TYPE)/${CROSS_GNU_TYPE}/lib/:${CURDIR}/gcc/debian/libgcc1-armel-cross/usr/${CROSS_GNU_TYPE}/lib/ ;\
	export LINUX_SOURCE=${CURDIR}/debian/tmp.${CROSS_ARCH}/usr ;\
	export DEB_BUILD_OPTIONS="nocheck notest notests ${NJOBS}" ; \
	cd glibc-${VER_GLIBC} && PATCHED_SOURCES=yes WITH_BUILD_SYSROOT=${CURDIR}/debian/tmp.${CROSS_ARCH} DEB_BUILD_PROFILES=stage2 PKG_IGNORE_CURRENTLY_BUILDING=1 BACKPORT=false fakeroot dpkg-buildpackage -B -uc -us -a${CROSS_ARCH} -d
	touch $@

$(stamp)install-glibc2.%: $(stamp)build-glibc2.%
	@echo START $@
	for deb in *${DEB_VER_GLIBC}*.deb; \
	do \
		dpkg-deb -x $$deb debian/tmp.${CROSS_ARCH}; \
	done; \
	bash debian/fix-links ${CROSS_GNU_TYPE}; \
	touch $@

clean:
	rm -rf linux-source-${VER_LINUX}
	rm -rf glibc-${VER_GLIBC}
	rm -rf gcc
	rm -rf binutils-${PKG_VER_BINUTILS}
	rm -rf $(foreach arch,$(CROSS_ARCHES),debian/tmp.$(arch))
	rm -f debian/files
	rm -f debian/cross-compile
	find debian -name '*~' | xargs -r rm -f
	rm -f *.*deb *.changes
	rm -rf repackfiles tmp debian/tmp.*
	rm -rf $(stamp)
	mkdir $(stamp)
	dh_clean

# using wildcard for DEB_LIST_ALL gave only problems
DEB_LIST_UNMANGLED = $(foreach arch,$(CROSS_ARCHES), \
	linux-libc-dev-${arch}-cross_${DEB_VER_LINUX}*_all.deb)
DEB_LIST_MANGLED = $(foreach arch,$(CROSS_ARCHES), \
	libc6-${arch}-cross_${VER_GLIBC}-*_all.deb \
	libc6-dev-${arch}-cross_${VER_GLIBC}-*_all.deb)

# FIXME: really package -dbg?
#	libc6-dbg-${arch}-cross_${VER_GLIBC}-*_all.deb \

ifeq ($(ARM32_MULTILIBS),yes)
  ifneq (,$(filter armhf, $(CROSS_ARCHES)))
    DEB_LIST_MANGLED += \
	libc6-armel-armhf-cross_${VER_GLIBC}-*_all.deb \
	libc6-dev-armel-armhf-cross_${VER_GLIBC}-*_all.deb
  endif
  ifneq (,$(filter armel, $(CROSS_ARCHES)))
    DEB_LIST_MANGLED += \
	libc6-armhf-armel-cross_${VER_GLIBC}-*_all.deb \
	libc6-dev-armhf-armel-cross_${VER_GLIBC}-*_all.deb
  endif
endif
ifneq (,$(filter powerpc, $(CROSS_ARCHES)))
  DEB_LIST_MANGLED += \
	libc6-ppc64-powerpc-cross_${VER_GLIBC}-*_all.deb \
	libc6-dev-ppc64-powerpc-cross_${VER_GLIBC}-*_all.deb
endif

#           libgcc1-${CROSS_ARCH}-cross_${DEB_VER_GCC}_all.deb  \
#           libgcc1-dbg-${CROSS_ARCH}-cross_${DEB_VER_GCC}_all.deb  \

#
# Repack resulting packages to make some changes;
# - I want libgcc1 to contain changelog etc which normally are in gcc-${VER_GCC_BASE}-*-base package
# - libgcc1(-dbg) should depend on proper version libgcc1 (epoch hardcoded)
# - libgcc1-dbg needs to have doc symlink to libgcc1
# - linux-libc-dev gets copyright and changelog
# - libc6 gets copyright and changelog
# - libc6 gets dependencies removed (no dependency on libgcc1)
# - libc6-dev-armhf-cross ships symlink to /usr/arm-linux-gnueabi/lib/hf for multilib cross compiler
define repack_debs
	umask 022; \
	cross_arch=$$(echo $1); \
	for deb in $2; \
	do \
	    echo "repack $$deb ..."; \
	    rm -rf tmp/*; \
	    dpkg-deb -x $$deb tmp; \
	    dpkg-deb -e $$deb tmp/DEBIAN; \
	    pkgname=`echo $$deb | cut -d'_' -f1`; \
	    sed -i -e's/^Source:.*/Source: ${DEB_NAME_ACT} (${DEB_SVER_ACT})/' tmp/DEBIAN/control; \
	    sed -i -e "s/${DEB_VER_LINUX}/${DEB_VER_LINUX}$(CROSS_EXT)/g" tmp/DEBIAN/control ; \
	    sed -i -e "s/Version: ${VER_LINUX}-\(.*\)$$/Version: ${VER_LINUX}-\1$(CROSS_EXT)/g" tmp/DEBIAN/control ; \
	    sed -i -e "s/${DEB_VER_GLIBC}/${DEB_VER_GLIBC}$(CROSS_EXT)/g" tmp/DEBIAN/control ; \
	    sed -i -e "s/${DEB_VER_GCC}/${DEB_VER_GCC}$(CROSS_EXT)/g" tmp/DEBIAN/control ; \
	    sed -i -e "s/$(CROSS_EXT)$(CROSS_EXT)/$(CROSS_EXT)/g" tmp/DEBIAN/control ; \
	    install -d -m 755 tmp/usr/share/lintian/overrides; \
	    if [ -e debian/overrides/$$pkgname ]; then \
		  cp debian/overrides/$$pkgname tmp/usr/share/lintian/overrides/; \
	    fi; \
	    echo "$$pkgname binary: non-standard-dir-in-usr" \
	      >> tmp/usr/share/lintian/overrides/$$pkgname; \
	    case "$$pkgname" in \
	      linux*) \
	        ;; \
	      libc*-dev*) \
	        echo "$$pkgname binary: arch-independent-package-contains-binary-or-object" \
	          >> tmp/usr/share/lintian/overrides/$$pkgname; \
	        echo "$$pkgname binary: unstripped-binary-or-object" \
	          >> tmp/usr/share/lintian/overrides/$$pkgname; \
	        ;; \
	      libc*) \
	        echo "$$pkgname binary: arch-independent-package-contains-binary-or-object" \
	          >> tmp/usr/share/lintian/overrides/$$pkgname; \
	        echo "$$pkgname binary: embedded-library" \
	          >> tmp/usr/share/lintian/overrides/$$pkgname; \
	        echo "$$pkgname binary: missing-depends-line" \
	          >> tmp/usr/share/lintian/overrides/$$pkgname; \
	        echo "$$pkgname binary: shlibs-declares-dependency-on-other-package" \
	          >> tmp/usr/share/lintian/overrides/$$pkgname; \
	        echo "$$pkgname binary: shared-lib-without-dependency-information" \
	          >> tmp/usr/share/lintian/overrides/$$pkgname; \
	        echo "$$pkgname binary: shlib-with-executable-bit" \
	          >> tmp/usr/share/lintian/overrides/$$pkgname; \
	        echo "$$pkgname binary: unstripped-binary-or-object" \
	          >> tmp/usr/share/lintian/overrides/$$pkgname; \
	    esac; \
	    if [ 'libgcc1-dbg-$${cross_arch}-cross' = $$pkgname ]; then \
	      sed -i -e 's/^Depends.*/Depends: libgcc1-$${cross_arch}-cross (= 1:${DEB_VER_GCC}$(CROSS_EXT))/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' = $$pkgname ]; 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 gcc48/debian/gcc-${VER_GCC_BASE}-${CROSS_GNU_TYPE}-base/usr/share/doc/gcc-${VER_GCC_BASE}-${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;\
	    fi; \
	    if [ 'linux-libc-dev-$${cross_arch}-cross' = $$pkgname ]; then \
	      mkdir -p tmp/usr/share/doc/$$pkgname; \
	      cp repackfiles/linux.$1/usr/share/doc/linux-libc-dev/copyright tmp/usr/share/doc/$$pkgname; \
	      cp repackfiles/linux.$1/usr/share/doc/linux-libc-dev/changelog.Debian.gz tmp/usr/share/doc/$$pkgname; \
	    fi; \
	    if [ 'libc6-armel-cross' = $$pkgname ]; then \
	          sed -i -e'/^Depends/d' tmp/DEBIAN/control; \
	    fi; \
	    if [ 'libc6-armhf-cross' = $$pkgname ]; then \
	          sed -i -e'/^Depends/d' tmp/DEBIAN/control; \
	    fi; \
	    if [ 'libc6-arm64-cross' = $$pkgname ]; then \
		  sed -i -e'/^Depends/d' tmp/DEBIAN/control; \
	    fi; \
	    if [ 'libc6-powerpc-cross' = $$pkgname ]; then \
		  sed -i -e'/^Depends/d' tmp/DEBIAN/control; \
	    fi; \
	    if [ 'libc6-ppc64-powerpc-cross' = $$pkgname ]; then \
		  sed -i -e'/^Depends/d' tmp/DEBIAN/control; \
	    fi; \
	    if [ 'libc6-dev-armel-cross' = $$pkgname ]; then \
		  install -d tmp/usr/arm-linux-gnueabihf/lib; \
		  ln -sf ../../arm-linux-gnueabi/lib tmp/usr/arm-linux-gnueabihf/lib/sf; \
		  cp -p /usr/arm-linux-gnueabihf/include/gnu/stubs-hard.h tmp/usr/arm-linux-gnueabi/include/gnu/; \
	    fi; \
	    if [ 'libc6-dev-armhf-cross' = $$pkgname ]; then \
		  install -d tmp/usr/arm-linux-gnueabi/lib; \
		  ln -sf ../../arm-linux-gnueabihf/lib tmp/usr/arm-linux-gnueabi/lib/hf; \
		  cp -p /usr/arm-linux-gnueabi/include/gnu/stubs-soft.h tmp/usr/arm-linux-gnueabihf/include/gnu/; \
	    fi; \
	    if [ 'libc6' = `echo $$pkgname | cut -d'-' -f1` ]; then \
	      mkdir -p tmp/usr/share/doc/$$pkgname; \
	      cp repackfiles/glibc.$1/usr/share/doc/libc6/copyright tmp/usr/share/doc/$$pkgname; \
	      cp repackfiles/glibc.$1/usr/share/doc/libc6/changelog.Debian.gz tmp/usr/share/doc/$$pkgname; \
	    fi; \
	    rm -f tmp/DEBIAN/md5sums; \
	    (cd tmp && find usr -type f | LC_ALL=C sort | xargs -r md5sum >>DEBIAN/md5sums);\
	    newdeb=`echo $$deb|sed -e "s/\(.*\)_\(.*\)_\(.*\)/\1_\2$(CROSS_EXT)_\3/g"`; \
	    echo "    -> $$newdeb ..."; \
	    PKG_IGNORE_CURRENTLY_BUILDING=1 dpkg-deb -b tmp/ ../$$newdeb; \
	    echo "        done"; \
	    rm -rf tmp/*; \
	done;
endef

repack-debs-indep: dpkg-cross
	@echo START $@
#	install -d repackfiles/linux
#	dpkg-deb -x linux-libc-dev_${DEB_VER_LINUX}_${CROSS_ARCH}.deb repackfiles/linux
	$(foreach arch,$(CROSS_ARCHES), \
	  install -d repackfiles/glibc.$(arch); \
	  dpkg-deb -x libc6_${DEB_VER_GLIBC}_${arch}.deb  repackfiles/glibc.$(arch);)

# FIXME: really package -dbg?
#	    libc6-dbg-${arch}-cross_${VER_GLIBC}-*_all.deb \

	$(foreach arch,$(CROSS_ARCHES), \
	  $(call repack_debs,$(arch), \
	    libc6-${arch}-cross_${VER_GLIBC}-*_all.deb \
	    libc6-dev-${arch}-cross_${VER_GLIBC}-*_all.deb))
ifeq ($(ARM32_MULTILIBS),yes)
  ifneq (,$(filter armhf, $(CROSS_ARCHES)))
	$(call repack_debs,armhf, \
	  libc6-armel-armhf-cross_${VER_GLIBC}-*_all.deb \
	  libc6-dev-armel-armhf-cross_${VER_GLIBC}-*_all.deb)
  endif
  ifneq (,$(filter armel, $(CROSS_ARCHES)))
	$(call repack_debs,armel, \
	  libc6-armhf-armel-cross_${VER_GLIBC}-*_all.deb \
	  libc6-dev-armhf-armel-cross_${VER_GLIBC}-*_all.deb)
  endif
endif
ifneq (,$(filter powerpc, $(CROSS_ARCHES)))
	$(call repack_debs,powerpc, \
	  libc6-ppc64-powerpc-cross_${VER_GLIBC}-*_all.deb \
	  libc6-dev-ppc64-powerpc-cross_${VER_GLIBC}-*_all.deb)
endif

build: $(stamp)build
build-arch: # nothing to do
build-indep: $(stamp)build
$(stamp)build: $(foreach arch,$(CROSS_ARCHES),$(addsuffix .$(arch),$(stamp)build-glibc2))
	: # we do not need those packages
	rm -f binutils-*.*deb
	rm -f cpp-*.*deb gcc-*.*deb
	rm -f linux-headers*.*deb
	rm -f *-doc*.*deb
	rm -f *-source*.*deb
	rm -f linux-tools-common_*.*deb
	rm -f nscd*deb
	rm -f multiarch-support*.deb
	rm -f lib*gcc*deb
	rm -f libc-*bin*.deb
	rm -f libc*-pic_*.deb
	rm -f locales*.deb
	rm -f *.udeb
ifeq ($(ARM32_MULTILIBS),dummy)
	rm -f libc6*-armel_*armhf.deb libc6*-armhf_*armel.deb
endif
	touch $@


linux_debs = $(foreach arch,$(CROSS_ARCHES), -plinux-libc-dev-${arch}-cross)
ifeq ($(ARM32_MULTILIBS),dummy)
  dummy_pkgs = libc6-dev-armhf-armel-cross libc6-armhf-armel-cross \
	libc6-dev-armel-armhf-cross libc6-armel-armhf-cross
endif

binary: binary-arch binary-indep
binary-arch:  build-arch
binary-indep: build dpkg-cross mangle-debian-files-indep \
    $(if $(filter dummy, $(ARM32_MULTILIBS)), $(stamp)make-dummies)
	dh_compress $(linux_debs)
	dh_fixperms $(linux_debs)
	dh_installdeb $(linux_debs)
	dh_gencontrol $(linux_debs) -- -v$(DEB_VER_LINUX)$(CROSS_EXT)
	dh_md5sums $(linux_debs)
	dh_builddeb $(linux_debs)

# call with cross_arch and dummy_name
define make_dummy_pkg
	rm -rf tmp2
	install -d tmp2/DEBIAN
	install -m 0644 debian/dummies/libc6-dev-$(2)-cross tmp2/DEBIAN/control
	sed -i -e 's/VERSION/$(DEB_VER_GLIBC)$(CROSS_EXT)/g' tmp2/DEBIAN/control
	sed -i -e 's/SRCNAME/$(DEB_NAME_ACT) ($(DEB_VER_ACT))/g' tmp2/DEBIAN/control
	PKG_IGNORE_CURRENTLY_BUILDING=1 dpkg-deb -b tmp2 ../libc6-dev-$(2)-cross_$(DEB_VER_GLIBC)$(CROSS_EXT)_all.deb
	$(call generate_debian_files, ../libc6-dev-$(2)-cross_$(DEB_VER_GLIBC)$(CROSS_EXT)_all.deb)

	install -m 0644 debian/dummies/libc6-$(2)-cross tmp2/DEBIAN/control
	sed -i -e 's/VERSION/$(DEB_VER_GLIBC)$(CROSS_EXT)/g' tmp2/DEBIAN/control
	sed -i -e 's/SRCNAME/$(DEB_NAME_ACT) ($(DEB_VER_ACT))/g' tmp2/DEBIAN/control
	PKG_IGNORE_CURRENTLY_BUILDING=1 dpkg-deb -b tmp2 ../libc6-$(2)-cross_$(DEB_VER_GLIBC)$(CROSS_EXT)_all.deb
	$(call generate_debian_files, ../libc6-$(2)-cross_$(DEB_VER_GLIBC)$(CROSS_EXT)_all.deb)
endef

$(stamp)make-dummies: $(stamp)debian-files-base
	@echo START $@
ifeq ($(ARM32_MULTILIBS),dummy)
  ifneq (,$(filter armhf, $(CROSS_ARCHES)))
	$(call make_dummy_pkg,armhf,armhf-armel)
  endif
  ifneq (,$(filter armel, $(CROSS_ARCHES)))
	$(call make_dummy_pkg,armel,armel-armhf)
  endif
endif
	touch $@

$(stamp)debian-files-base:
	@echo START $@
	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-indep: $(stamp)debian-files-base repack-debs-indep \
    $(if $(filter $(ARM32_MULTILIBS), yes), $(stamp)make-dummies)
	@echo START $@
	$(call generate_debian_files, ${DEB_LIST_MANGLED})
	sed -i -e "/^libc/s/_all.deb/$(CROSS_EXT)_all.deb/g" debian/files
	$(foreach arch,$(CROSS_ARCHES), \
	  sed -i -e "/^libc/s/_${arch}.deb/$(CROSS_EXT)_${arch}.deb/g" debian/files;)
	sed -i -e "/^libc/s/$(CROSS_EXT)$(CROSS_EXT)/$(CROSS_EXT)/g" debian/files

DPKG_CROSS_PKGS = $(foreach arch,$(CROSS_ARCHES), \
	libc6_*_${arch}.deb \
	libc6-d*_${arch}.deb \
	linux-libc-dev_*_${arch}.deb)

ifeq ($(ARM32_MULTILIBS),yes)
  ifneq (,$(filter armhf, $(CROSS_ARCHES)))
    DPKG_CROSS_PKGS += \
	libc6-armel_*_armhf.deb libc6-dev-armel_*_armhf.deb
  endif
  ifneq (,$(filter armel, $(CROSS_ARCHES)))
    DPKG_CROSS_PKGS += \
	libc6-armhf_*_armel.deb libc6-dev-armhf_*_armel.deb
  endif
endif
ifneq (,$(filter powerpc, $(CROSS_ARCHES)))
  DPKG_CROSS_PKGS += \
	libc6-ppc64_*_powerpc.deb libc6-dev-ppc64_*_powerpc.deb
endif

dpkg-cross: build
	@echo START $@
	: # linux-libc-dev doesn't need dpkg-cross
	set -e; \
	for arch in $(CROSS_ARCHES); do \
	  for deb in libc6*_*_$$arch.deb libc6*-d*_$$arch.deb; do \
            case $$deb in \
	      libc6-armel_*_armhf.deb|libc6-dev-armel_*_armhf.deb|libc6-armhf_*_armel.deb|libc6-dev-armhf_*_armel.deb) \
	        if [ "$(ARM32_MULTILIBS)" = dummy ]; then \
	          echo "skipping ARM32 multilib package $$deb"; continue; \
                fi;; \
	      libc*-dbg*) \
	        echo "skipping debug package package $$deb"; continue;; \
	    esac; \
	    echo dpkg-cross $$deb ...; \
	    echo "default_arch = $$arch" > debian/cross-compile; \
	    PKG_IGNORE_CURRENTLY_BUILDING=1 debian/dpkg-cross -M -a $$arch \
	    	-X dpkg -X findutils -X tzdata -X libc-bin -X libc-dev-bin \
	    	-X debconf -X debconf-2.0 \
	    	-b $$deb; \
	  done; \
	done
ifeq ($(ARM32_MULTILIBS),yes)
  ifneq (,$(filter armhf, $(CROSS_ARCHES)))
	set -x; \
	  for deb in libc6-armel_*_armhf.deb libc6-dev-armel_*_armhf.deb; do \
	    echo dpkg-cross $$deb ...; \
	    echo "default_arch = armhf" > debian/cross-compile; \
	    PKG_IGNORE_CURRENTLY_BUILDING=1 debian/dpkg-cross -M -a armhf \
	    	-X dpkg -X findutils -X tzdata -X libc-bin -X libc-dev-bin \
	    	-X debconf -X debconf-2.0 \
	    	-b $$deb; \
	  done
  endif
  ifneq (,$(filter armel, $(CROSS_ARCHES)))
	set -x; \
	  for deb in libc6-armhf_*_armel.deb libc6-dev-armhf_*_armel.deb; do \
	    echo dpkg-cross $$deb ...; \
	    echo "default_arch = armel" > debian/cross-compile; \
	    PKG_IGNORE_CURRENTLY_BUILDING=1 debian/dpkg-cross -M -a armel \
	    	-X dpkg -X findutils -X tzdata -X libc-bin -X libc-dev-bin \
	    	-X debconf -X debconf-2.0 \
	    	-b $$deb; \
	  done
  endif
endif
ifneq (,$(filter powerpc, $(CROSS_ARCHES)))
	set -x; \
	  for deb in libc6-ppc64_*_powerpc.deb libc6-dev-ppc64_*_powerpc.deb; do \
	    echo dpkg-cross $$deb ...; \
	    echo "default_arch = powerpc" > debian/cross-compile; \
	    PKG_IGNORE_CURRENTLY_BUILDING=1 debian/dpkg-cross -M -a powerpc \
	    	-X dpkg -X findutils -X tzdata -X libc-bin -X libc-dev-bin \
	    	-X debconf -X debconf-2.0 \
	    	-b $$deb; \
	  done
endif

#control:
#	@echo START $@
#	sed -e "s/CROSS_ARCH/${CROSS_ARCH}/g" \
#	    -e "s/CROSS_GNU_TYPE/${CROSS_GNU_TYPE}/g" \
#	    -e "s/CROSS_BIARCH/${CROSS_BIARCH}/g" \
#	    -e "s/MIN_VER_GLIBC/${MIN_VER_GLIBC}/g" \
#	    -e "s/MIN_VER_LINUX/${MIN_VER_LINUX}/g" \
#	    -e "s/VER_LINUX/${VER_LINUX}/g" \
#	    -e "s/MIN_VER_GCC/${MIN_VER_GCC}/g" \
#	    -e "s/VER_GCC_BASE/${VER_GCC_BASE}/g" \
#	    -e "s/EXTRA_DEPS/${EXTRA_DEPS}/g" \
#	  debian/control.in \
#	  $(if $(wildcard debian/control.$(CROSS_ARCH).in),debian/control.$(CROSS_ARCH).in) \
#	    >debian/control

control:
	@echo START $@
	sed -e "s/CROSS_ARCH/${CROSS_ARCH}/g" \
	    -e "s/CROSS_GNU_TYPE/${CROSS_GNU_TYPE}/g" \
	    -e "s/CROSS_BIARCH/${CROSS_BIARCH}/g" \
	    -e "s/MIN_VER_GLIBC/${MIN_VER_GLIBC}/g" \
	    -e "s/MIN_VER_LINUX/${MIN_VER_LINUX}/g" \
	    -e "s/VER_LINUX/${VER_LINUX}/g" \
	    -e "s/MIN_VER_GCC/${MIN_VER_GCC}/g" \
	    -e "s/VER_GCC_BASE/${VER_GCC_BASE}/g" \
	  debian/control.source.in > debian/control
	echo Build-Conflicts: dpkg-cross, $(foreach a,$(CROSS_ARCHES),binutils-$(call _gnu_type,$(a))$(,) libc6-$(a)-cross$(,) linux-libc-dev-$(a)-cross$(,)) >> debian/control
	$(foreach a,$(CROSS_ARCHES),sed -e "s/CROSS_ARCH/${a}/g" debian/control.linux-libc-dev.in >> debian/control;)
	$(foreach a,$(CROSS_ARCHES),sed -e "s/CROSS_ARCH/${a}/g" debian/control.libc.in >> debian/control;)
ifeq ($(ARM32_MULTILIBS),yes)
  ifneq (,$(filter armhf, $(CROSS_ARCHES)))
	sed -e "s/CROSS_ARCH/armhf/g;s/CROSS_BIARCH/armel/g" \
		debian/control.multilib.in >> debian/control
  endif
  ifneq (,$(filter armel, $(CROSS_ARCHES)))
	sed -e "s/CROSS_ARCH/armel/g;s/CROSS_BIARCH/armhf/g" \
		debian/control.multilib.in >> debian/control
  endif
else ifeq ($(ARM32_MULTILIBS),dummy)
	cat debian/control.armhf.in >> debian/control
	cat debian/control.armel.in >> debian/control
endif
ifneq (,$(filter powerpc, $(CROSS_ARCHES)))
	sed -e "s/CROSS_ARCH/powerpc/g;s/CROSS_BIARCH/ppc64/g" \
		debian/control.multilib.in >> debian/control
endif

.PRECIOUS: $(stamp)init-dirs \
	$(stamp)init-linux \
	$(stamp)build-linux.% \
	$(stamp)install-linux.% \
	$(stamp)init-binutils \
	$(stamp)build-binutils.% \
	$(stamp)install-binutils.% \
	$(stamp)init-gcc \
	$(stamp)build-gcc1.% \
	$(stamp)install-gcc1.% \
	$(stamp)build-gcc2.% \
	$(stamp)install-gcc2.% \
	$(stamp)build-gcc3.% \
	$(stamp)init-glibc \
	$(stamp)build-glibc1.% \
	$(stamp)install-glibc1.% \
	$(stamp)build-glibc2.% \
	$(stamp)install-glibc2.% \
	$(stamp)debian-files-base \
	repack-debs-arch \
	repack-debs-indep \
	repack-debs-indep.% \
	mangle-debian-files-arch
	mangle-debian-files-indep \
	build build-arch build-indep binary binary-arch binary-indep
