#!/usr/bin/make -f

SPACE := $(EMPTY) $(EMPTY)
COMMA := ,

include /usr/share/dpkg/architecture.mk

SOURCE_DATE_EPOCH ?= $(shell dpkg-parsechangelog -SDate | date -f- +%s)
deb_version := $(shell dpkg-parsechangelog | awk '/^Version:/ {print $$2}')

# The top-level configure script fails to pass these down properly ...
export CPPFLAGS
export LDFLAGS
CPPFLAGS += -fPIC

install = /usr/bin/install -p

# Rather paranoid than sorry. Make the shell exit with an error if an
# untested command fails.
SHELL += -e

INSTALL = $(install)
export INSTALL

distribution := $(shell lsb_release -is)
derivative   := $(shell if dpkg-vendor --derives-from Ubuntu; then echo Ubuntu; \
			elif dpkg-vendor --derives-from Debian; then echo Debian; \
			else echo Unknown; fi)

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

ifneq (,$(filter nodoc, $(DEB_BUILD_PROFILES)))
  nodoc_profile = yes
endif

# Don't include docs with GFDL invariant sections
GFDL_INVARIANT_FREE := yes
ifeq ($(derivative),Ubuntu)
  GFDL_INVARIANT_FREE := no
  FORCE_CONTROL = FORCE
endif
ifneq ($(GFDL_INVARIANT_FREE),yes)
  ifneq ($(nodoc_profile),yes)
    with_doc := yes
  endif
endif

# ---------- settings for cross builds ----------

# Cross configuration support.  Check for an environment variable
# $GDB_TARGET, or a file debian/target.
ifndef GDB_TARGET
DEBIAN_TARGET_FILE := $(strip $(shell cat debian/target 2>/dev/null))
ifneq ($(DEBIAN_TARGET_FILE),)
GDB_TARGET := $(DEBIAN_TARGET_FILE)
endif
endif

DEB_TARGET_ALIAS ?= $(DEB_TARGET_GNU_TYPE)

ifneq ($(GDB_TARGET),)
  configure_target_args = --with-gdb-datadir="\$${prefix}/share/gdb-$(DEB_TARGET_GNU_TYPE)"
endif

ifeq ($(DEB_TARGET_ARCH),)
$(error GDB_TARGET value "$(GDB_TARGET)" is not a valid Debian architecture)
endif

ifdef GDB_TARGET
  DEB_CROSS = yes
  # TP: Target Prefix. Used primarily as a prefix for cross tool
  #     names (e.g. powerpc-linux-gcc).
  # TS: Target Suffix. Used primarily at the end of cross compiler
  #     package names (e.g. gcc-powerpc).
  TP = $(DEB_TARGET_ALIAS)-
  TS = -$(DEB_TARGET_ALIAS)
  FORCE_CONTROL = FORCE
endif

# ---------- configure options, architecture specific ----------

ifeq ($(DEB_HOST_GNU_CPU),ia64)
  arch_config_args := --with-libunwind-ia64
endif

arch_config_args += --with-babeltrace

# Enable Intel Processor Trace (PT) on Linux x86 platform
ifneq (,$(filter $(DEB_HOST_ARCH),amd64 i386))
  arch_config_args += --with-intel-pt
endif

ifdef GDB_TARGET
  arch_config_args += --program-prefix=$(TP) \
    --target=$(DEB_TARGET_ALIAS) --with-sysroot=/usr/$(DEB_TARGET_ALIAS)
else
  # To avoid file conflicts, only enable the global gdbinit file for native
  # debuggers.
  arch_config_args += --with-system-gdbinit=/etc/gdb/gdbinit --with-system-gdbinit-dir=/etc/gdb/gdbinit.d
endif

# ---------- running tests? ----------

run_tests := yes
ifneq (,$(filter nocheck, $(DEB_BUILD_OPTIONS)))
  run_tests := disabled by DEB_BUILD_OPTIONS
endif

ifeq (,$(findstring linux, $(DEB_HOST_GNU_SYSTEM)))
  run_tests := only enabled for linux targets
endif

#ifneq (,$(filter armhf, $(DEB_HOST_ARCH)))
#  run_tests := not enabled for $(DEB_HOST_ARCH)
#endif

ifdef GDB_TARGET
  run_tests := disabled for cross builds
endif

# ---------- configure options, for all variants ----------

variants = default multiarch minimal
ifeq ($(derivative),Ubuntu)
  variants = default multiarch
endif

# We pass srcdir explicitly to avoid an extra '/.' at the end of it.  That
# causes a harmless, but ugly, testsuite failure in maint.exp.
common_configure_args = \
	--build=$(DEB_BUILD_GNU_TYPE) \
	--host=$(DEB_HOST_GNU_TYPE) \
	--prefix=/usr \
	--libexecdir="\$${prefix}/lib/gdb" \
	--disable-maintainer-mode \
	--disable-dependency-tracking \
	--disable-silent-rules \
	--disable-gdbtk \
	--disable-shared \
	--with-pkgversion='$(distribution)___$(deb_version)' \
	--srcdir=$(CURDIR) \
	--disable-readline \
	--with-system-readline \
	--with-expat \
	--with-system-zlib \
	--without-guile \
	--without-babeltrace \
	$(if $(filter linux, $(DEB_HOST_ARCH_OS)),--with-debuginfod) \
	$(arch_config_args) \

default_configure_args = \
	$(common_configure_args) \
	$(configure_target_args) \
	--enable-tui \
	--with-lzma \
	--with-python=python3 \
	--with-xxhash \
	--with-mpfr \

# multiarch targets; this is taken from the binutils-multiarch package but
# doesn't seem like a terribly nice list; see
# <20110117211551.GA7216@bee.dooz.org> for discussion -- locally updated
MULTIARCH_TARGETS := \
	aarch64-linux-gnu \
	alpha-linux-gnu \
	arm-linux-gnu \
	arm-linux-gnueabi \
	arm-linux-gnueabihf \
	arm-none-eabi \
	hppa-linux-gnu \
	i686-linux-gnu \
	ia64-linux-gnu \
	m68k-linux-gnu \
	m68k-rtems \
	mips-linux-gnu \
	mipsel-linux-gnu \
	mips64-linux-gnu \
	mips64el-linux-gnu \
	powerpc-linux-gnu \
	powerpc-linux-gnuspe \
	powerpc64le-linux-gnu \
	powerpc64-linux-gnu \
	ppc64-linux-gnu \
	riscv32-linux-gnu \
	riscv64-linux-gnu \
	s390-linux-gnu \
	s390x-linux-gnu \
	sh-linux-gnu \
	sparc-linux-gnu \
	sparc64-linux-gnu \
	x86_64-linux-gnu \
	x86_64-linux-gnux32 \
	m32r-linux-gnu

# broken, see https://launchpad.net/bugs/1233185
#MULTIARCH_TARGETS := all
#	--enable-targets=$(MULTIARCH_TARGETS) \
# multiarch flags

multiarch_configure_args = \
	$(default_configure_args) \
	--enable-64-bit-bfd \
	--enable-targets=$(subst $(SPACE),$(COMMA),$(MULTIARCH_TARGETS)) \
	--disable-sim \
	--enable-obsolete

# Minimal flags
minimal_configure_args = \
	$(common_configure_args) \
	--disable-tui \
	--without-python \
	--without-babeltrace \
	--disable-source-highlight \
	--without-mpfr \

# ---------- configure and build targets ----------

builddir_default	= build/default
builddir_minimal	= build/minimal
builddir_multiarch	= build/multiarch
builddir_source		= build/gdb

stamps/configure-%:
	@mkdir -p stamps
	rm -rf $(builddir_$*)
	mkdir -p $(builddir_$*)
	@echo "gdb-$*: configured with: $(subst ___, ,$(foreach i,$($*_configure_args),$(i)\n\t))"
	cd $(builddir_$*) && CFLAGS="$(CFLAGS)" \
	  ../../configure $(subst ___,$(SPACE),$($*_configure_args))
	touch $@

stamps/build-%: stamps/configure-%
	V=1 $(MAKE) -C $(builddir_$*) $(NJOBS)
	$(if $(filter yes, $(nodoc_profile)),, \
	  $(if $(filter default, $*), \
	    $(MAKE) -C $(builddir_default) info))
	$(if $(filter yes, $(nodoc_profile)),, \
	  $(if $(filter default, $*), \
	    $(MAKE) -C $(builddir_$*)/gdb/doc refcard.dvi refcard.ps))
	touch $@

stamps/check: stamps/build-default
ifeq ($(run_tests),yes)
	$(MAKE) $(NJOBS) -C $(builddir_default)/gdb check \
	  || echo "*** Tests failed, of course. ***"
	@echo "===== TEST SUMMARY BEGIN ====="
	-cat $(builddir_default)/gdb/testsuite/gdb.sum
	@echo "===== TEST SUMMARY END ====="
else
	@echo "***Tests disabled: $(run_tests) ***"
endif
	touch $@

stamps/build-doc: stamps/build-default
	$(MAKE) -C $(builddir_default)/gdb/doc pdf html

# ---------- installation and packaging targets ----------

clean: debian/control
	dh_clean
	rm -rf stamps build
	rm -f debian/files

	if test -f gdb/version.in.backup; then \
	  mv -f gdb/version.in.backup gdb/version.in; \
	fi

#	# For snapshots this is appropriate; careful of release tarballs
#	# which include .gmo files.
#	find -type f -name '*.gmo' | xargs rm -f

	# Prevent gratuitous rebuilds of the BFD documentation, since it
	# updates the copy in the source directory.
	find bfd -name bfd.info\* | xargs --no-run-if-empty touch

install-pre:
	dh_prep

install: install-pre
	: # gdb install
	$(MAKE) -C $(builddir_default) install DESTDIR=$(CURDIR)/debian/tmp
	rm -rf debian/gdb-doc/usr/share/man

	dh_install

	install -d debian/gdb$(TS)/usr/share/man/man1; \
	install -m 644 debian/gcore.1 debian/gdb$(TS)/usr/share/man/man1/.

	if [ -x debian/tmp/usr/bin/run ]; then \
		mv debian/tmp/usr/bin/run \
		  debian/gdb$(TS)/usr/bin/$(DEB_TARGET_ALIAS)-run; \
	fi
	if [ -r debian/tmp/usr/share/man/man1/run.1 ]; then \
		mv debian/tmp/usr/share/man/man1/run.1 \
		  debian/gdb$(TS)/usr/share/man/man1/$(DEB_TARGET_ALIAS)-run.1; \
	fi
ifneq ($(GFDL_INVARIANT_FREE),yes)
	install -d debian/gdb$(TS)/usr/share/man/man5
	install -m 644 $(builddir_default)/gdb/doc/gdbinit.5 \
		debian/gdb$(TS)/usr/share/man/man5/.
	install -m 644 $(builddir_default)/gdb/doc/gdb.1 \
		debian/gdb$(TS)/usr/share/man/man1/.
	install -m 644 $(builddir_default)/gdb/doc/gdb-add-index.1 \
		debian/gdb$(TS)/usr/share/man/man1/.
endif

ifeq ($(run_tests),yes)
  ifneq (,$(wildcard $(builddir_default)/gdb/testsuite/gdb.sum))
	install -d debian/gdb$(TS)/usr/share/doc/gdb
	install -m 644 $(builddir_default)/gdb/testsuite/gdb.sum \
		debian/gdb$(TS)/usr/share/doc/gdb/check.log
  endif
endif

ifneq ($(DEB_CROSS),yes)
	: # Only ship a global gdbinit for the native GDB.
	install -d debian/gdb$(TS)/etc/gdb
	install -d debian/gdb$(TS)/etc/gdb/gdbinit.d
	install -m 644 debian/gdbinit debian/gdb$(TS)/etc/gdb/
	: # Likewise gdb-add-index
	install -m 755 gdb/contrib/gdb-add-index.sh debian/gdb$(TS)/usr/bin/gdb-add-index
endif

	rm -f debian/gdb$(TS)/usr/bin/$(TP)gdbtui
	install -m 755 debian/gdbtui debian/gdb$(TS)/usr/bin/$(TP)gdbtui

	: # gdb-multiarch install
	install -d debian/gdb-multiarch/usr/bin
	install -m 755 $(builddir_multiarch)/gdb/gdb debian/gdb-multiarch/usr/bin/gdb-multiarch

	: # gdbserver install
	install -d debian/gdbserver/usr/lib
	: # This file is only built on some arches (x86 ones, so far)
	-install debian/tmp/usr/lib/libinproctrace.so debian/gdbserver/usr/lib/
ifneq ($(GFDL_INVARIANT_FREE),yes)
	install -d debian/gdbserver/usr/share/man/man1
	install -m 644 $(builddir_default)/gdb/doc/gdbserver.1 \
		debian/gdbserver/usr/share/man/man1/.
endif

ifneq (,$(filter minimal, $(variants)))
	: # gdb-minimal install
	install -d debian/gdb-minimal/usr/bin
	$(INSTALL) -m 755 -o root -g root \
		$(builddir_minimal)/gdb/gdb debian/gdb-minimal/usr/bin/gdb

	$(INSTALL) -m 755 -o root -g root \
		$(builddir_minimal)/gdb/gcore debian/gdb-minimal/usr/bin/gcore
endif

	: # Only ship a global gdbinit for the native GDB.
ifneq (,$(filter minimal, $(variants)))
	install -d debian/gdb-minimal/etc/gdb
	install -d debian/gdb-minimal/etc/gdb/gdbinit.d
	install -m 644 debian/gdbinit debian/gdb-minimal/etc/gdb/
else
	install -d debian/gdb/etc/gdb
	install -d debian/gdb/etc/gdb/gdbinit.d
	install -m 644 debian/gdbinit debian/gdb/etc/gdb/
endif

ifeq ($(with_doc),yes)
	install -d debian/gdb-doc/usr/share/info
	install -m 644 debian/tmp/usr/share/info/gdb.info debian/gdb-doc/usr/share/info/.
	install -m 644 debian/tmp/usr/share/info/stabs.info debian/gdb-doc/usr/share/info/.

	$(MAKE) -C $(builddir_default)/gdb/doc DESTDIR=$(CURDIR)/debian/gdb-doc \
		pdfdir=/usr/share/doc/gdb-doc/pdf \
		htmldir=/usr/share/doc/gdb-doc/html \
		install-html install-pdf

	: # This manual documents a long-obsolete facility
	rm -f debian/gdb-doc/usr/share/info/annota*
	rm -rf debian/gdb-doc/usr/share/doc/gdb-doc/*/annota*

	rm -f debian/gdb-doc/usr/share/info/dir*

	: # Symlink stuff into gdb's doc directory
	install -d debian/gdb-doc/usr/share/doc/gdb
	ln -s ../gdb-doc/html debian/gdb-doc/usr/share/doc/gdb/html
	ln -s ../gdb-doc/pdf debian/gdb-doc/usr/share/doc/gdb/pdf
endif

install-indep: install-pre
	: # gdb-source install
	install -d debian/gdb-source/usr/src
	mkdir -p $(builddir_source)
	tar --exclude build --exclude stamps --exclude .git -cf - . \
	  | (cd $(builddir_source) && tar -xf -)
	cd $(builddir_source) && debian/rules clean
	cd $(dir $(builddir_source)) \
	  && tar cfJ $(CURDIR)/debian/gdb-source/usr/src/gdb.tar.xz \
	     --format=gnu \
	     --mode=755 \
	     --mtime="@$(SOURCE_DATE_EPOCH)" --clamp-mtime \
	     --numeric-owner --owner=0 --group=0 \
	     --sort=name \
	     $(notdir $(builddir_source))


debian/control: debian/control.in debian/control.minimal debian/control.doc $(FORCE_CONTROL)
	cat debian/control.in \
		| sed "s/@TS@/$(TS)/g" \
		> debian/control
ifneq (,$(filter minimal, $(variants)))
	cat debian/control.minimal >> debian/control
endif
ifeq ($(with_doc),yes)
	cat debian/control.doc >> debian/control
endif
ifeq ($(DEB_CROSS),yes)
	sed -i "/Package: gdb-multiarch/,\$$ d" debian/control
	sed "s+/gdb+/$(TP)gdb+g; s+usr/share/$(TP)gdb+usr/share/gdb$(TS)+g" \
		debian/gdb.install > debian/gdb$(TS).install
endif

gdb_substvars =
ifeq (,$(filter minimal, $(variants)))
  gdb_substvars = -Vgdb:minimal='gdb-minimal (= $${binary:Version})'
endif

build-indep: $(foreach v,$(variants),stamps/build-$(v)) $(if $(filter yes,$(with_doc)),stamps/build-doc)
build-arch: $(foreach v,$(variants),stamps/build-$(v)) stamps/check
build: build-arch build-indep

binary-indep: build-indep install install-indep
	dh_installdocs -i
	dh_installchangelogs -i
	dh_strip -i
	dh_compress -i -X.pdf
	dh_fixperms -i
	dh_installdeb -i
	dh_shlibdeps -i
	dh_gencontrol -i
	dh_md5sums -i
	dh_builddeb -i

binary-arch: build-arch install
	dh_installdocs -pgdb$(TS) \
		gdb/NEWS gdb/README gdb/doc/refcard.tex \
		$(if $(filter yes, $(nodoc_profile)),, \
		  $(builddir_default)/gdb/doc/refcard.dvi \
		  $(builddir_default)/gdb/doc/refcard.ps) \
		gdb/contrib/
	dh_installchangelogs -pgdb$(TS) gdb/ChangeLog

ifneq (,$(filter minimal, $(variants)))
	dh_installdocs -pgdb-minimal \
		gdb/NEWS gdb/README gdb/doc/refcard.tex \
		$(if $(filter yes, $(nodoc_profile)),, \
		  $(builddir_default)/gdb/doc/refcard.dvi \
		  $(builddir_default)/gdb/doc/refcard.ps)
	dh_installchangelogs -pgdb-minimal -XChangeLog
endif

	dh_installdocs -pgdbserver gdbserver/README
	dh_installchangelogs -pgdbserver gdbserver/ChangeLog

	install -d debian/gdb-multiarch/usr/share/doc
	ln -s gdb debian/gdb-multiarch/usr/share/doc/gdb-multiarch

	dh_dwz -a
	dh_strip -pgdb$(TS) --dbgsym-migration='gdb-dbg (<< 7.12-1~)'
	dh_strip -a -Ngdb$(TS)
	dh_compress -a
	dh_fixperms -a
	dh_installdeb -a
	dh_shlibdeps -a
	dh_gencontrol -a -- $(gdb_substvars)
	dh_md5sums -a
	dh_builddeb -a

binary: binary-indep binary-arch

.PHONY: build build-arch build-indep clean binary-indep binary-arch binary install

.PHONY: FORCE
FORCE:
