#!/usr/bin/make -f

, := ,
space :=
space +=
$(space) := 
$(space) +=

NJOBS =
# Support parallel=<n> in DEB_BUILD_OPTIONS (see #209008)
ifneq (,$(filter parallel=%,$(subst $(,), ,$(DEB_BUILD_OPTIONS))))
  NJOBS := -j $(subst parallel=,,$(filter parallel=%,$(subst $(,),$(space),$(DEB_BUILD_OPTIONS))))
endif

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

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

ifeq ($(GCC_VER),4.8)
  MIN_VER_GCC      := 4.8.1-16
  PPA_VER_GCC      := 4.8.1
endif

ifeq ($(GCC_VER),4.9)
  MIN_VER_GCC      := 4.9.2-10ubuntu5~
  PPA_VER_GCC      := 4.9.2
endif

ifeq ($(GCC_VER),5)
  MIN_VER_GCC      := 5.3.1-2~
  PPA_VER_GCC      := 5.3.1
endif

ifeq ($(GCC_VER),6)
  MIN_VER_GCC      := 6.3.0-18~
  PPA_VER_GCC      := 6.3.0
endif

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

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

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.28-3
MIN_VER_BINUTILS   := 2.28-3
VER_ISL      := 0.14-1~
MIN_VER_GLIBC   := 2.23

DEB_VER_GCC    := $(shell dpkg-parsechangelog -l${GCC_DIR}/debian/changelog | egrep '^Version:' | cut -f 2 -d ' ')

CROSS_BIARCH_armhf:=armel
CROSS_BIARCH_armel:=armhf
CROSS_BIARCH_powerpc:=ppc64
CROSS_BIARCH_s390x:=s390

HOST_ARCHS_alpha = amd64 i386 x32
HOST_ARCHS_armhf = amd64 i386 x32 arm64
HOST_ARCHS_armel = amd64 i386 x32 arm64
HOST_ARCHS_arm64 = amd64 i386 x32
HOST_ARCHS_hppa = amd64 i386 x32
HOST_ARCHS_m68k = amd64 i386 x32
HOST_ARCHS_mips = amd64 i386 x32
HOST_ARCHS_mipsel = amd64 i386 x32
HOST_ARCHS_mips64 = amd64 i386 x32
HOST_ARCHS_mips64el = amd64 i386 x32
HOST_ARCHS_mipsn32 = amd64 i386 x32
HOST_ARCHS_mipsn32el = amd64 i386 x32
HOST_ARCHS_mips64el = amd64 i386 x32
HOST_ARCHS_mipsr6 = amd64 i386 x32
HOST_ARCHS_mipsr6el = amd64 i386 x32
HOST_ARCHS_mips64r6 = amd64 i386 x32
HOST_ARCHS_mips64r6el = amd64 i386 x32
HOST_ARCHS_mipsn32r6 = amd64 i386 x32
HOST_ARCHS_mipsn32r6el = amd64 i386 x32
HOST_ARCHS_powerpc = amd64 i386 x32 ppc64el
HOST_ARCHS_powerpcspe = amd64 i386 x32
HOST_ARCHS_ppc64 = amd64 i386 x32
HOST_ARCHS_ppc64el = amd64 i386 x32 ppc64
HOST_ARCHS_s390x = amd64 i386 x32
HOST_ARCHS_sh4 = amd64 i386 x32
HOST_ARCHS_sparc64 = amd64 i386 x32

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

ifeq ($(DEB_NAME_ACT),gcc-6-cross)
  CROSS_ARCHS  ?= ppc64el s390x arm64 armhf armel \
			$(if $(filter $(vendor), Ubuntu),, mips mipsel mips64el)
  GCC_PORTS_BUILD=
else
  CROSS_ARCHS  ?= alpha hppa m68k mips64 powerpc ppc64 sh4 sparc64 \
			$(if $(filter $(vendor), Ubuntu), mips mipsel mips64el) \
			powerpcspe
# mips64 mipsn32 mipsn32el
# mipsr6 mipsr6el mips64r6el mips64r6 mipsn32r6 mipsn32r6el
  GCC_PORTS_BUILD=-ports
endif

ifeq ($(HOST_ARCH),arm64)
  CROSS_ARCHS = armel armhf
else ifeq ($(HOST_ARCH),ppc64)
  CROSS_ARCHS = ppc64el
else ifeq ($(HOST_ARCH),ppc64el)
  CROSS_ARCHS = powerpc
endif
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})
HOST_ARCHS       = $(HOST_ARCH_$(CROSS_ARCH))
ADA_HOST_ARCHS   = $(HOST_ARCH_$(CROSS_ARCH))
ADA64_HOST_ARCHS = $(filter-out i386,$(HOST_ARCH_$(CROSS_ARCH)))

ARM32_MULTILIBS :=
ifeq ($(vendor),Ubuntu)
  ARM32_MULTILIBS := yes
endif

ifeq ($(vendor),Debian)
  skip_dbg_packages = yes
  skip_arm32ml_packages = yes
endif

libgcc_source := $(shell apt-cache show --no-all-versions libgcc1-powerpc-cross | awk '/^Source:/ { print $$2 }')
#ifneq ($(DEB_NAME_ACT),$(libgcc_source))
#  skip_common_packages = yes
#endif

BINUTILS_BUILD_DEPS = $(foreach a,$(CROSS_ARCHS),binutils-$(call _gnu_type,$(a)) (>= $(MIN_VER_BINUTILS)) [$(HOST_ARCHS_$(a))]$(,))
GLIBC_BUILD_DEPS = $(foreach a,$(CROSS_ARCHS),libc6$(if $(filter $(a),alpha ia64),.1)-dev-$(a)-cross (>= $(MIN_VER_GLIBC)) [$(HOST_ARCHS_$(a))]$(,))
LINUX_BUILD_DEPS = $(foreach a,$(CROSS_ARCHS),linux-libc-dev-$(a)-cross [$(HOST_ARCHS_$(a))]$(,))

# build multilib cross compilers
ifeq ($(ARM32_MULTILIBS),yes)
  ifneq (,$(filter armel, $(CROSS_ARCHS)))
    EXTRA_BUILD_DEPS += libc6-dev-armhf-cross [$(HOST_ARCHS_armel)],
    ifeq ($(skip_common_packages),yes)
      GCC_BUILD_DEPS += libhfgcc1-armel-cross [$(HOST_ARCHS_armel)],
    endif
  endif

  ifneq (,$(filter armhf, $(CROSS_ARCHS)))
    ifeq ($(skip_common_packages),yes)
      GCC_BUILD_DEPS += libsfgcc1-armhf-cross [$(HOST_ARCHS_armhf)],
    endif
  endif
endif

ifneq (,$(filter ppc64, $(CROSS_ARCHS)))
  EXTRA_BUILD_DEPS += libc6-dev-powerpc-ppc64-cross [$(HOST_ARCHS_ppc64)],
  ifeq ($(skip_common_packages),yes)
    GCC_BUILD_DEPS += lib32gcc1-ppc64-cross [$(HOST_ARCHS_ppc64)],
  endif
endif

ifneq (,$(filter s390x, $(CROSS_ARCHS)))
  EXTRA_BUILD_DEPS += libc6-dev-s390-s390x-cross [$(HOST_ARCHS_s390x)],
  ifeq ($(skip_common_packages),yes)
    GCC_BUILD_DEPS += lib32gcc1-s390x-cross [$(HOST_ARCHS_s390x)],
  endif
endif

ifneq (,$(filter sparc64, $(CROSS_ARCHS)))
  EXTRA_BUILD_DEPS += libc6-dev-sparc-sparc64-cross [$(HOST_ARCHS_sparc64)],
  ifeq ($(skip_common_packages),yes)
    GCC_BUILD_DEPS += lib32gcc1-sparc64-cross [$(HOST_ARCHS_sparc64)],
  endif
endif

ifneq (,$(filter powerpc, $(CROSS_ARCHS)))
  EXTRA_BUILD_DEPS += libc6-dev-ppc64-powerpc-cross [$(HOST_ARCHS_powerpc)],
  ifeq ($(skip_common_packages),yes)
    GCC_BUILD_DEPS += lib64gcc1-powerpc-cross [$(HOST_ARCHS_powerpc)],
  endif
endif

EXTRA_BUILD_DEPS += $(foreach a, mips mipsel, \
  $(if $(filter $(a), $(CROSS_ARCHS)), libc6-dev-mips64-$(a)-cross [$(HOST_ARCHS_$(a))]$(,)) \
)
GCC_BUILD_DEPS += $(foreach a, mips mipsel, \
  $(if $(filter yes, $(skip_common_packages)), lib64gcc1-$(a)-cross [$(HOST_ARCHS_$(a))]$(,)) \
)

EXTRA_BUILD_DEPS += $(foreach a, mips mipsel mips64 mips64el, \
  $(if $(filter $(a), $(CROSS_ARCHS)), libc6-dev-mipsn32-$(a)-cross [$(HOST_ARCHS_$(a))]$(,)) \
)
GCC_BUILD_DEPS += $(foreach a, mips mipsel mips64 mips64el, \
  $(if $(filter yes, $(skip_common_packages)), libn32gcc1-$(a)-cross [$(HOST_ARCHS_$(a))]$(,)) \
)

EXTRA_BUILD_DEPS += $(foreach a, mips64 mips64el, \
  $(if $(filter $(a), $(CROSS_ARCHS)), libc6-dev-mips32-$(a)-cross [$(HOST_ARCHS_$(a))]$(,)) \
)
GCC_BUILD_DEPS += $(foreach a, mips64 mips64el, \
  $(if $(filter yes, $(skip_common_packages)), lib32gcc1-$(a)-cross [$(HOST_ARCHS_$(a))]$(,)) \
)

# mips n32/n32el variants
ifeq (0,1)
EXTRA_BUILD_DEPS += $(foreach a, mipsn32 mipsn32el, \
  $(if $(filter $(a), $(CROSS_ARCHS)), libc6-dev-mips64-$(a)-cross [$(HOST_ARCHS_$(a))]$(,)) \
)
GCC_BUILD_DEPS += $(foreach a, mipsn32 mipsn32el, \
  $(if $(filter yes, $(skip_common_packages)), lib64gcc1-$(a)-cross [$(HOST_ARCHS_$(a))]$(,)) \
)

EXTRA_BUILD_DEPS += $(foreach a, mips64 mips64el, \
  $(if $(filter $(a), $(CROSS_ARCHS)), libc6-dev-mips32-$(a)-cross [$(HOST_ARCHS_$(a))]$(,)) \
)
GCC_BUILD_DEPS += $(foreach a, mips64 mips64el, \
  $(if $(filter yes, $(skip_common_packages)), lib32gcc1-$(a)-cross [$(HOST_ARCHS_$(a))]$(,)) \
)
endif

# mips r6 variants
ifeq (0,1)
EXTRA_BUILD_DEPS += $(foreach a, mipsr6 mipsr6el mipsn32r6 mipsn32r6el, \
  $(if $(filter $(a), $(CROSS_ARCHS)), libc6-dev-mips64-$(a)-cross [$(HOST_ARCHS_$(a))]$(,)) \
)
GCC_BUILD_DEPS += $(foreach a, mipsr6 mipsr6el mipsn32r6 mipsn32r6el, \
  $(if $(filter yes, $(skip_common_packages)), lib64gcc1-$(a)-cross [$(HOST_ARCHS_$(a))]$(,)) \
)

EXTRA_BUILD_DEPS += $(foreach a, mipsr6 mipsr6el mips64r6 mips64r6el, \
  $(if $(filter $(a), $(CROSS_ARCHS)), libc6-dev-mipsn32-$(a)-cross [$(HOST_ARCHS_$(a))]$(,)) \
)
GCC_BUILD_DEPS += $(foreach a, mipsr6 mipsr6el mips64r6 mips64r6el, \
  $(if $(filter yes, $(skip_common_packages)), libn32gcc1-$(a)-cross [$(HOST_ARCHS_$(a))]$(,)) \
)

EXTRA_BUILD_DEPS += $(foreach a, mipsn32r6 mipsn32r6el mips64r6 mips64r6el, \
  $(if $(filter $(a), $(CROSS_ARCHS)), libc6-dev-mips32-$(a)-cross [$(HOST_ARCHS_$(a))]$(,)) \
)
GCC_BUILD_DEPS += $(foreach a, mipsn32r6 mipsn32r6el mips64r6 mips64r6el, \
  $(if $(filter yes, $(skip_common_packages)), lib32gcc1-$(a)-cross [$(HOST_ARCHS_$(a))]$(,)) \
)
endif

PHOBOS_ARCHS = amd64 i386 x32 armel armhf
PHOBOS_DEP = libgphobos-GCC_VER-dev-CROSS_ARCH-cross (= $${gcc:Version}),
# FIXME: Set correctly ...
PHOBOS_ML_DEP = libgphobos-GCC_VER-dev-CROSS_ARCH-cross (= $${gcc:Version}),


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 --quiltrc /dev/null -a ; \
	fi
#	if dpkg --compare-versions $(DEB_VER_GCC) le 6.3.0-8; then \
#	  cd gcc; \
#	  patch -p1 < ../debian/patches/gcc-6/updates.diff; \
#	fi
	touch $@

$(stamp)build-gcc.%: $(stamp)init-gcc
	@echo START $@
	echo ${CROSS_ARCH} >gcc/debian/target
	: # 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 \
	  WITHOUT_LANG=hppa64 \
	  GCC_PORTS_BUILD=$(GCC_PORTS_BUILD) \
	  dpkg-buildpackage $(dbp_flag) -uc -us -d
	touch $@

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


$(stamp)repack-%:
	@umask 022; \
	if [ -z "$(TARGET_ARCH)" ]; then \
	  echo >&2 "repack: macro TARGET_ARCH not set"; \
	  exit 1; \
	fi; \
	t_arch=$(TARGET_ARCH); \
	t_gnu_type=$(call _gnu_type,$(TARGET_ARCH)); \
	deb=$*; \
	pkgname=`echo $$deb | cut -d'_' -f1`; \
	tmp=tmp-$$pkgname; \
	if [ "$(skip_dbg_packages)" = yes ]; then \
	  case $$deb in *-dbg*) exit 0; esac; \
	fi; \
	echo "repack $$pkgname ($$deb) ..."; \
	rm -rf $$tmp; \
	mkdir -p $$tmp; \
	dpkg-deb -x $$deb $$tmp; \
	dpkg-deb -e $$deb $$tmp/DEBIAN; \
	sed -i -e's/^Source:.*/Source: $(DEB_NAME_ACT) ($(DEB_SVER_ACT))/' \
	  -e "/^Depends:/s/$(DEB_VER_GCC)/$(DEB_VER_GCC)$(CROSS_EXT)/g" \
	  -e "/^Recommends:/s/$(DEB_VER_GCC)/$(DEB_VER_GCC)$(CROSS_EXT)/g" \
	  -e "/^Suggests:/s/$(DEB_VER_GCC)/$(DEB_VER_GCC)$(CROSS_EXT)/g" \
	  -e "/^Version:/s/$(DEB_VER_GCC)/$(DEB_VER_GCC)$(CROSS_EXT)/" \
	  $$tmp/DEBIAN/control ; \
	sed -i -e "/^Depends:/s/\(libgnat-[0-9]*\) (>= $(DEB_VER_GCC)$(CROSS_EXT))/\1 (>= $(VER_GCC))/g" \
	  $$tmp/DEBIAN/control ; \
	case $$pkgname in \
	  gcc-$(GCC_VER)-$${t_gnu_type}) \
	    sed -i -e '/Depends/s/\(libcc1[^,]*\)$(CROSS_EXT)/\1/' \
	      $$tmp/DEBIAN/control;; \
	  *-cross) \
	    sed -i -e '/^Depends:/s/\(-base *( *\)=\([^)]*\)cross[^)]*)/\1>=\2)/' \
	      $$tmp/DEBIAN/control;; \
	esac; \
	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; \
	case "$$pkgname" in \
	  gcc-$(GCC_VER)-cross-base*) \
	    ;; \
	  gcc-$(GCC_VER)-multilib) \
	    echo "$$pkgname binary: binary-from-other-architecture" \
	      >> $$tmp/usr/share/lintian/overrides/$$pkgname \
	    ;; \
	  *-multilib-*) \
	    ;; \
	  cpp-*|g++-*|gcc-*|gccgo-*|gcj-*|gdc-*|gfortran-*|gobjc*|gnat-$(GCC_VER)-sjlj-*) \
	    echo "$$pkgname binary: binary-from-other-architecture" \
	      >> $$tmp/usr/share/lintian/overrides/$$pkgname \
	    ;; \
	  gnat-$(GCC_VER)-*) \
	    echo "$$pkgname binary: binary-from-other-architecture" \
	      >> $$tmp/usr/share/lintian/overrides/$$pkgname; \
	    echo "$$pkgname binary: non-standard-dir-in-usr" \
	      >> $$tmp/usr/share/lintian/overrides/$$pkgname; \
	    ;; \
	  *-dev-$${t_arch}-cross) \
	    echo "$$pkgname binary: arch-independent-package-contains-binary-or-object" \
	      >> $$tmp/usr/share/lintian/overrides/$$pkgname; \
	    echo "$$pkgname binary: non-standard-dir-in-usr" \
	      >> $$tmp/usr/share/lintian/overrides/$$pkgname; \
	    ;; \
	  *-dbg-$${t_arch}-cross) \
	    echo "$$pkgname binary: arch-independent-package-contains-binary-or-object" \
	      >> $$tmp/usr/share/lintian/overrides/$$pkgname; \
	    echo "$$pkgname binary: debug-package-should-be-named-dbg" \
	      >> $$tmp/usr/share/lintian/overrides/$$pkgname; \
	    echo "$$pkgname binary: non-standard-dir-in-usr" \
	      >> $$tmp/usr/share/lintian/overrides/$$pkgname; \
	    ;; \
	  *-pic-$${t_arch}-cross) \
	    echo "$$pkgname binary: arch-independent-package-contains-binary-or-object" \
	      >> $$tmp/usr/share/lintian/overrides/$$pkgname; \
	    ;; \
	  *-$${t_arch}-cross) \
	    echo "$$pkgname binary: arch-independent-package-contains-binary-or-object" \
	      >> $$tmp/usr/share/lintian/overrides/$$pkgname; \
	    echo "$$pkgname binary: non-standard-dir-in-usr" \
	      >> $$tmp/usr/share/lintian/overrides/$$pkgname; \
	    echo "$$pkgname binary: shlibs-declares-dependency-on-other-package" \
	      >> $$tmp/usr/share/lintian/overrides/$$pkgname; \
	    echo "$$pkgname binary: postinst-has-useless-call-to-ldconfig" \
	      >> $$tmp/usr/share/lintian/overrides/$$pkgname; \
	    echo "$$pkgname binary: postrm-has-useless-call-to-ldconfig" \
	      >> $$tmp/usr/share/lintian/overrides/$$pkgname; \
	    case "$$pkgname" in \
	      *-hppa-cross) \
	        echo "$$pkgname binary: binary-compiled-with-profiling-enabled" \
	          >> $$tmp/usr/share/lintian/overrides/$$pkgname;; \
	      libgphobos*) \
	        echo "$$pkgname binary: embedded-library" \
	          >> $$tmp/usr/share/lintian/overrides/$$pkgname;; \
	    esac; \
	    ;; \
	esac; \
	if [ -e $$tmp/usr/share/doc/gcc-${GCC_VER}-$${t_gnu_type}-base/changelog.Debian.gz ]; then \
	  mv $$tmp/usr/share/doc/gcc-${GCC_VER}-$${t_gnu_type}-base/changelog.Debian.gz \
	     $$tmp/usr/share/doc/gcc-${GCC_VER}-$${t_gnu_type}-base/changelog.Debian.gcc-${GCC_VER}.gz; \
	  gzip -c9n debian/changelog \
	    > $$tmp/usr/share/doc/gcc-${GCC_VER}-$${t_gnu_type}-base/changelog.Debian.gz;\
	fi ; \
	rm -f $$tmp/DEBIAN/md5sums; \
	(cd $$tmp && find usr -type f | LC_ALL=C sort | xargs -r md5sum >>DEBIAN/md5sums); \
	find $$tmp/DEBIAN -name md5sums -empty | xargs -r rm -f; \
	newdeb=`echo $$deb|sed -e "s/\(.*\)_\(.*\)_\(.*\)/\1_\2$(CROSS_EXT)_\3/g"`; \
	NO_PKG_MANGLE=1 dpkg-deb -b $$tmp ../$$newdeb; \
	rm -rf $$tmp
	touch $@

$(stamp)repack-debs-arch: $(stamp)build
	@echo START $@
	dh_testroot
	$(MAKE) $(NJOBS) -f debian/rules TARGET_ARCH=$(HOST_ARCH) \
		$(addprefix $(stamp)repack-,$(wildcard *_$(HOST_ARCH).deb))
	$(MAKE) $(NJOBS) -f debian/rules TARGET_ARCH=$(HOST_ARCH) \
		$(addprefix $(stamp)repack-,$(wildcard *$(DEB_VER_GCC)_$(HOST_ARCH).ddeb))
	rm -f *$(DEB_VER_GCC)_$(HOST_ARCH).ddeb
	if [ -f ../gcc-$(GCC_VER)-$(call _gnu_type,$(HOST_ARCH))-dbgsym_${DEB_VER_GCC}$(CROSS_EXT)_$(HOST_ARCH).ddeb ]; then mv -f ../*.ddeb . ; fi
	touch $@

$(stamp)repack-debs-indep: $(stamp)build
	@echo START $@
	dh_testroot
	set -e; \
	$(foreach arch,$(CROSS_ARCHS), \
	  $(MAKE) $(NJOBS) -f debian/rules TARGET_ARCH=$(arch) \
		$(addprefix $(stamp)repack-,$(wildcard *-$(arch)-cross_*_all.deb)); \
	)
	$(MAKE) $(NJOBS) -f debian/rules TARGET_ARCH=$(HOST_ARCH) \
		$(addprefix $(stamp)repack-,$(wildcard gcc-$(GCC_VER)-cross-base$(GCC_PORTS_BUILD)_*_all.deb))
	touch $@

build: $(stamp)build
$(stamp)build: $(foreach arch,$(CROSS_ARCHS),$(addsuffix .$(arch),$(stamp)build-gcc))
	@echo START $@
	touch $@

build: dbp_flag = -b
build-arch: dbp_flag = -B
build-indep: dbp_flag = -b

build-arch: $(stamp)build
build-indep: $(stamp)build

binary: binary-arch binary-indep
binary-arch:  build-arch $(stamp)build $(stamp)repack-debs-arch $(stamp)mangle-debian-files-arch
binary-indep: build-indep $(stamp)build $(stamp)repack-debs-indep $(stamp)mangle-debian-files-indep

define generate_debian_files
	for deb in $1; do \
	  pkg=`basename $$deb`; \
	  if [ "$(skip_dbg_packages)" = yes ]; then \
	    case $$pkg in *-dbg*) continue; esac; \
	  fi; \
	  if [ "$(skip_arm32ml_packages)" = yes ] && grep -q "^$$pkg$$" debian/packages.arm32ml; then \
	    continue; \
	  fi; \
	  if [ "$(skip_common_packages)" = yes ] && grep -q "^$$pkg$$" debian/packages.common; then \
	    continue; \
	  fi; \
	  echo -n "$$pkg " >>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

$(stamp)mangle-debian-files-arch: build $(stamp)repack-debs-arch $(stamp)debian-files-base
	@echo START $@
	$(call generate_debian_files, *_$(HOST_ARCH).deb)
	sed -i -e "s/${DEB_VER_GCC}_/${DEB_VER_GCC}$(CROSS_EXT)_/g" debian/files
	touch $@

$(stamp)mangle-debian-files-indep: $(stamp)repack-debs-indep $(stamp)debian-files-base
	@echo START $@
	$(call generate_debian_files, *_all.deb)
	sed -i -e "s/${DEB_VER_GCC}_/${DEB_VER_GCC}$(CROSS_EXT)_/g" debian/files
	touch $@

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


control:
	sed -e "s/MIN_VER_GCC/${MIN_VER_GCC}/g" \
	    -e "s/GCC_BUILD_DEPS/$(strip $(GCC_BUILD_DEPS))/g" \
	    -e "s/BINUTILS_BUILD_DEPS/$(strip $(BINUTILS_BUILD_DEPS))/g" \
	    -e "s/GLIBC_BUILD_DEPS/$(strip $(GLIBC_BUILD_DEPS))/g" \
	    -e "s/EXTRA_BUILD_DEPS/$(strip $(EXTRA_BUILD_DEPS))/g" \
	    -e "s/LINUX_BUILD_DEPS/$(strip $(LINUX_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_ISL/${VER_ISL}/g" \
	    -e "s/GCC_PORTS_BUILD/$(GCC_PORTS_BUILD)/g" \
	    $(CURDIR)/debian/control.source.in >$(CURDIR)/debian/control

	$(foreach a,$(CROSS_ARCHS), \
	  sed \
	    -e 's/PHOBOS_DEP/$(if $(filter $(a),$(PHOBOS_ARCHS)),${PHOBOS_DEP})/g' \
	    -e 's/PHOBOS_ML_DEP/$(if $(filter $(a),$(PHOBOS_ARCHS)),${PHOBOS_ML_DEP})/g' \
	    -e 's/CROSS_ARCH/$(a)/g' \
	    -e 's/CROSS_GNU_TYPE/$(call _gnu_type,$(a))/g' \
	    -e 's/MIN_VER_GCC/${MIN_VER_GCC}/g' \
	    -e 's/GCC_VER/${GCC_VER}/g' \
	    -e 's/MIN_VER_BINUTILS/${MIN_VER_BINUTILS}/g' \
	    -e 's/@host_archs@/$(HOST_ARCHS_$(a))/g' \
	    -e 's/@ada_host_archs@/$(HOST_ARCHS_$(a))/g' \
	    -e 's/@ada64_host_archs@/$(filter-out i386,$(HOST_ARCHS_$(a)))/g' \
	    $(CURDIR)/debian/control.$(a).in >>$(CURDIR)/debian/control; )

	python3 debian/remove-unbuilt \
	  $(if $(filter yes,$(skip_dbg_packages)), --skip-dbg-packages) \
	  $(if $(filter yes,$(skip_arm32ml_packages)), --skip-arm32ml-packages) \
	  $(if $(filter yes,$(skip_common_packages)), --skip-common-packages) \
	  debian/control debian/packages.invalid debian/packages.arm32ml debian/packages.common \
	  > debian/control.new && mv debian/control.new debian/control

.PRECIOUS: $(stamp)init-dirs \
	$(stamp)init-gcc \
	$(stamp)build \
	$(stamp)build-gcc.% \
	$(stamp)debian-files-base \
	$(stamp)repack-debs-arch \
	$(stamp)repack-debs-indep \
	$(stamp)repack-debs-indep.% \
	$(stamp)mangle-debian-files-arch
	$(stamp)mangle-debian-files-indep \
	build build-arch build-indep binary binary-arch binary-indep
