#!/usr/bin/make -f

GCC_VER := $(shell dpkg-parsechangelog |egrep ^Source:|cut -f2 -d' '|cut -f2 -d'-')

ifeq ($(GCC_VER),4.4)
  MIN_VER_GCC      := 4.4.5-15~
  PPA_VER_GCC      := 4.4.6
endif

ifeq ($(GCC_VER),4.5)
  MIN_VER_GCC      := 4.5.2-8~
  PPA_VER_GCC      := 4.5.3
endif

ifeq ($(GCC_VER),4.6)
  MIN_VER_GCC      := 4.6.2-14ubuntu2
  PPA_VER_GCC      := 4.6.3
endif

ifeq ($(GCC_VER),4.7)
  MIN_VER_GCC      := 4.7.2-21ubuntu3
  PPA_VER_GCC      := 4.7.1
endif

ifeq ($(GCC_VER),4.8)
  MIN_VER_GCC      := 4.8.2-13
  PPA_VER_GCC      := 4.8.2
endif

ifndef MIN_VER_GCC
  MIN_VER_GCC      := ${GCC_VER}.0-0~
endif

# Linaro toolchain backports PPA support
PPA := false

# if debian/ppa is present then we do PPA
ifneq ($(wildcard debian/ppa),)
  PPA := true
endif

DEB_NAME_ACT     := $(shell dpkg-parsechangelog| sed -n 's/-*//; s/^Source: \(.*\)/\1/p')
DEB_VER_ACT      := $(shell dpkg-parsechangelog| sed -n 's/^Version: \(.*\)/\1/p')

ifeq ($(PPA),true)
  VER_GCC        := ${PPA_VER_GCC}
  GCC_DIR        := /usr/src/gcc-${GCC_VER}-$(VER_GCC)
  VER_BINUTILS   := 2.23.2-2~
  MIN_VER_BINUTILS := 2.23.2
  VER_CLOOG      := 0.18.0-1~
else
  VER_GCC        := $(shell dpkg-parsechangelog -l/usr/src/gcc-${GCC_VER}/debian/changelog | egrep '^Version:' | cut -f 2 -d ' '|cut -f 1 -d '-')
  GCC_DIR        := /usr/src/gcc-${GCC_VER}
  VER_BINUTILS   := 2.24
  MIN_VER_BINUTILS   := 2.24
  VER_CLOOG      := 0.18.0-1~
endif

DEB_VER_GCC    := $(shell dpkg-parsechangelog -l${GCC_DIR}/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/

host_archs = amd64 i386

# We build multilib cross compiler now
ifeq ($(CROSS_ARCH),armel)
  EXTRA_BUILD_DEPS += libc6-dev-armhf-cross
endif

ifeq ($(CROSS_ARCH),armhf)
  EXTRA_BUILD_DEPS += libc6-dev-armel-cross
endif

ifeq ($(CROSS_ARCH),powerpc)
  EXTRA_BUILD_DEPS += libc6-dev-ppc64-powerpc-cross
endif

ifneq (,$(filter $(CROSS_ARCH),amd64 i386))
  PHOBOS_DEP := libphobos-GCC_VER-dev-CROSS_ARCH-cross (= ${gcc:Version}),
endif

info:
	@echo "Package name:             ${DEB_NAME_ACT} ${DEB_VER_ACT}"
	@echo
	@echo "GCC ${GCC_VER} version:          ${VER_GCC}     	${DEB_VER_GCC}"
	@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-gcc:
	@echo START $@
	mkdir -p gcc
	set -ex; \
	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-${GCC_VER}/series)" ]; then \
	  QUILT_PATCHES=${CURDIR}/debian/patches/gcc-${GCC_VER} quilt push -a ; \
	fi; \
	echo ${CROSS_ARCH} >debian/target
	touch $@

$(stamp)build-gcc: $(stamp)init-gcc
	@echo START $@
	# cross build do not do docs so we do not have all build dependencies
	cd gcc && WITH_SYSROOT=/ PKG_IGNORE_CURRENTLY_BUILDING=1 BACKPORT=false dpkg-buildpackage -b -uc -us -d
	touch $@

clean:
	rm -rf gcc tmp
	rm -f  *.*deb *.changes debian/files
	rm -rf $(stamp)
	mkdir $(stamp)
	dh_clean

define repack_debs
	set -x; \
	for deb in $1; \
	do \
	    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_VER_ACT})/' 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 [ -e debian/overrides/$$pkgname ]; then \
		  mkdir -p tmp/usr/share/lintian/overrides; \
		  cp debian/overrides/$$pkgname tmp/usr/share/lintian/overrides/; \
	    fi; \
	    if [ -e tmp/usr/share/doc/gcc-${GCC_VER}-${CROSS_GNU_TYPE}-base/changelog.Debian.gz ]; then \
	      mv tmp/usr/share/doc/gcc-${GCC_VER}-${CROSS_GNU_TYPE}-base/changelog.Debian.gz \
	         tmp/usr/share/doc/gcc-${GCC_VER}-${CROSS_GNU_TYPE}-base/changelog.Debian.gcc-${GCC_VER}.gz; \
	      gzip -c9 debian/changelog > tmp/usr/share/doc/gcc-${GCC_VER}-${CROSS_GNU_TYPE}-base/changelog.Debian.gz;\
	    fi ; \
	    (cd tmp && find usr -type f | xargs -r md5sum >>DEBIAN/md5sums);\
	    newdeb=`echo $$deb|sed -e "s/\(.*\)_\(.*\)_\(.*\)/\1_\2cross${DEB_VER_ACT}_\3/g"`; \
	    dpkg-deb -b tmp ../$$newdeb; \
	    rm -rf tmp/*; \
	done
endef

DEB_LIST_ARCH = *_${HOST_ARCH}.deb
DDEB_LIST_ARCH = *${DEB_VER_GCC}_${HOST_ARCH}.ddeb

DEB_LIST_ALL = *_all.deb

repack-debs-arch: build
	@echo START $@
	$(call repack_debs, ${DEB_LIST_ARCH})
	$(call repack_debs, ${DDEB_LIST_ARCH})
	rm -f *${DEB_VER_GCC}_${HOST_ARCH}.ddeb 
	if [ -f ../gcc-${GCC_VER}-${CROSS_GNU_TYPE}-dbgsym_${DEB_VER_GCC}cross${DEB_VER_ACT}_${HOST_ARCH}.ddeb ] ; then mv -f ../*.ddeb . ; fi

repack-debs-indep: build
	@echo START $@
	$(call repack_debs, ${DEB_LIST_ALL})

build:	$(stamp)build-gcc
	@echo START $@
	# why remove the plugin package?
	rm -f gcc-*-plugin-dev-*.*deb

build-arch:  build mangle-debian-files-arch
build-indep: build mangle-debian-files-indep

binary: binary-arch binary-indep
binary-arch:  build-arch
binary-indep: build-indep

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 build repack-debs-arch
	@echo START $@
	$(call generate_debian_files, ${DEB_LIST_ARCH})
	sed -i -e "s/${DEB_VER_GCC}_/${DEB_VER_GCC}cross${DEB_VER_ACT}_/g" debian/files

mangle-debian-files-indep: $(stamp)debian-files-base repack-debs-indep
	@echo START $@
	$(call generate_debian_files, ${DEB_LIST_ALL})
	sed -i -e "s/${DEB_VER_GCC}_/${DEB_VER_GCC}cross${DEB_VER_ACT}_/g" debian/files

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

control:
	sed -e "s/CROSS_ARCH/${CROSS_ARCH}/g" \
	    -e "s/CROSS_GNU_TYPE/${CROSS_GNU_TYPE}/g" \
	    -e "s/MIN_VER_GCC/${MIN_VER_GCC}/g" \
	    -e "s/EXTRA_BUILD_DEPS/${EXTRA_BUILD_DEPS}/g" \
	    -e "s/GCC_VER/${GCC_VER}/g" \
	    -e "s/MIN_VER_BINUTILS/${MIN_VER_BINUTILS}/g" \
	    -e "s/VER_BINUTILS/${VER_BINUTILS}/g" \
	    -e "s/VER_CLOOG/${VER_CLOOG}/g" \
	    -e "s/@host_archs@/${host_archs}/g" \
	    -e "s/PHOBOS_DEP/${PHOBOS_DEP}/g" \
	    $(CURDIR)/debian/control.in >$(CURDIR)/debian/control
ifeq ($(PPA),true)
	sed  \
	    -e "s/gcc-${GCC_VER}-source/gcc-${GCC_VER}-${VER_GCC}-source/g" \
	    -i $(CURDIR)/debian/control
endif
