#!/usr/bin/make -f
# This file has gone through many maintainers.  Mostly rewritten
# by Daniel Jacobowitz.

ifneq (,$(filter parallel=%,$(DEB_BUILD_OPTIONS)))
    NUMJOBS = $(patsubst parallel=%,%,$(filter parallel=%,$(DEB_BUILD_OPTIONS)))
    MAKEFLAGS += -j$(NUMJOBS) -Otarget
endif

export CFLAGS := $(shell DEB_BUILD_MAINT_OPTIONS=hardening=+bindnow dpkg-buildflags --get CFLAGS)
export CPPFLAGS := $(shell DEB_BUILD_MAINT_OPTIONS=hardening=+bindnow dpkg-buildflags --get CPPFLAGS)
export CXXFLAGS := $(shell DEB_BUILD_MAINT_OPTIONS=hardening=+bindnow dpkg-buildflags --get CXXFLAGS)
export LDFLAGS := $(shell DEB_BUILD_MAINT_OPTIONS=hardening=+bindnow dpkg-buildflags --get LDFLAGS)
export BUILD_CFLAGS := $(shell DEB_HOST_ARCH=`dpkg --print-architecture` dpkg-buildflags --get CFLAGS)
export BUILD_CPPFLAGS := $(shell DEB_HOST_ARCH=`dpkg --print-architecture` dpkg-buildflags --get CPPFLAGS)
export BUILD_LDFLAGS := $(shell DEB_HOST_ARCH=`dpkg --print-architecture` \
				DEB_BUILD_MAINT_OPTIONS=hardening=+bindnow dpkg-buildflags --get LDFLAGS)
export ARFLAGS = -crv

include /usr/share/dpkg/architecture.mk

ifneq ($(DEB_BUILD_GNU_TYPE),$(DEB_HOST_GNU_TYPE))
HOST_CC ?= $(DEB_HOST_GNU_TYPE)-gcc
HOST_CXX ?= $(DEB_HOST_GNU_TYPE)-g++
else
HOST_CC ?= gcc
HOST_CXX ?= g++
endif

# These are important since this is a library package
soname=6
sodepver = (>= 6.5)

# Name our packages
package-base=ncurses-base
package-bin=ncurses-bin
package-lib=libncurses$(soname)
package-lib-32=lib32ncurses$(soname)
package-lib-64=lib64ncurses$(soname)
package-ti=libtinfo$(soname)
package-ti-32=lib32tinfo$(soname)
package-ti-64=lib64tinfo$(soname)
package-libw=libncursesw$(soname)
package-libw-32=lib32ncursesw$(soname)
package-libw-64=lib64ncursesw$(soname)
package-dev-32=lib32ncurses-dev
package-dev-64=lib64ncurses-dev
package-term=ncurses-term
package-examples=ncurses-examples

workdir=$(shell pwd)
tempdir=debian/tmp
fulltempdir=$(workdir)/$(tempdir)

srcdir=$(shell pwd)
relsrcdir=..
objdir=$(srcdir)/obj
objdir-static=$(srcdir)/obj-static
objdir-32=$(srcdir)/obj-32
objdir-64=$(srcdir)/obj-64
wobjdir=$(srcdir)/obj-wide
wobjdir-static=$(srcdir)/obj-wide-static
wobjdir-32=$(srcdir)/obj-wide-32
wobjdir-64=$(srcdir)/obj-wide-64
objdir-test=$(srcdir)/obj-test

ifeq ($(DEB_HOST_ARCH),i386)
build_64_target = x86_64-$(DEB_HOST_GNU_SYSTEM)
build_64 = build-64 build-wide-64
endif

ifeq ($(DEB_HOST_ARCH),powerpc)
build_64_target = powerpc64-$(DEB_HOST_GNU_SYSTEM)
build_64 = build-64 build-wide-64
endif

ifeq ($(DEB_HOST_ARCH),s390)
build_64_target = s390x-$(DEB_HOST_GNU_SYSTEM)
build_64 = build-64 build-wide-64
endif

ifeq ($(DEB_HOST_ARCH),sparc)
build_64_target = sparc64-$(DEB_HOST_GNU_SYSTEM)
build_64 = build-64 build-wide-64
endif

ifeq ($(DEB_HOST_ARCH),amd64)
build_32_target = i686-$(DEB_HOST_GNU_SYSTEM)
build_32 = build-32 build-wide-32
endif

ifeq ($(DEB_HOST_ARCH),ppc64)
build_32_target = powerpc-$(DEB_HOST_GNU_SYSTEM)
build_32 = build-32 build-wide-32
endif

ifneq (,$(filter nobiarch,$(DEB_BUILD_PROFILES)))
override build_32=
override build_64=
endif

ifeq (,$(filter pkg.ncurses.noexamples,$(DEB_BUILD_PROFILES)))
build_examples = build-test
endif

ifneq (,$(filter pkg.ncurses.terminfocheck,$(DEB_BUILD_PROFILES)))
check_ti = terminfocheck
endif

ifneq (,$(filter terse,$(DEB_BUILD_OPTIONS)))
echo = --disable-echo
endif

ifeq ($(DEB_HOST_ARCH_OS),linux)
with_mouse = --with-gpm
endif

CONFARGS =	--prefix=/usr \
		--build=$(DEB_BUILD_GNU_TYPE) \
		--with-shared \
		--mandir=/usr/share/man \
		--with-manpage-format=normal \
		--without-profile --without-debug \
		--disable-rpath \
		$(echo) \
		--disable-stripping \
		--enable-const \
		--enable-pc-files \
		--with-pkg-config-libdir=/usr/lib/$(DEB_HOST_MULTIARCH)/pkgconfig \
		--libdir=/usr/lib/$(DEB_HOST_MULTIARCH) \
		--with-install-prefix=$(fulltempdir) \
		--without-ada \
		--without-tests \
		--without-progs \
		$(with_mouse) \
		--enable-symlinks \
		--disable-setuid-environ \
		--disable-root-access \
		--disable-termcap \
		--with-default-terminfo-dir=/etc/terminfo \
		--with-terminfo-dirs="/etc/terminfo:/lib/terminfo:/usr/share/terminfo" \
		--with-ticlib=tic \
		--with-termlib=tinfo \
		--with-versioned-syms \
		--disable-wattr-macros \
		--disable-relink \
		--disable-pkg-ldflags \
		--enable-overwrite \
		--with-xterm-kbs=del

CONFARGS-TEST =	--prefix=/usr \
		--build=$(DEB_BUILD_GNU_TYPE) \
		--bindir=/usr/libexec/ncurses-examples \
		--datadir=/usr/share/ncurses-examples \
		--disable-stripping \
		$(echo) \
		--with-x11-rgb=/etc/X11/rgb.txt \
		--with-ncursesw \
		--with-curses-dir=$(wobjdir)

ifneq ($(DEB_BUILD_GNU_TYPE),$(DEB_HOST_GNU_TYPE))
CONFARGS += --with-build-cc=gcc --host=$(DEB_HOST_GNU_TYPE)
CONFARGS-TEST += --host=$(DEB_HOST_GNU_TYPE)
endif

# Exclude terminfo entries shipped by other Debian packages so that we do
# not begin shipping them by accident.
badterminfo = f/fbterm k/kbtin x/xterm-kitty K/KBtin

ifneq ($(DEB_BUILD_GNU_TYPE),$(DEB_HOST_GNU_TYPE))
# Force necessary configure checks which do not work when
# cross compiling; all Debian platforms return unsigned char
# and working poll for these configure checks.
export cf_cv_type_of_bool=unsigned char
export cf_cv_working_poll=yes
export cf_cv_gpm_soname=libgpm.so.2
endif

config.guess-stamp:
	dh_update_autotools_config
	dh_autoreconf debian/autoconf.sh
	touch $@

$(objdir)/config.status: config.guess-stamp
	test -d $(objdir) || mkdir $(objdir)
	cd $(objdir) && $(relsrcdir)/configure \
		$(CONFARGS) \
		--without-normal \
		--disable-widec

$(objdir-static)/config.status: config.guess-stamp
	test -d $(objdir-static) || mkdir $(objdir-static)
	cd $(objdir-static) && $(relsrcdir)/configure \
		$(CONFARGS) \
		--without-shared \
		--without-gpm \
		--disable-widec

$(objdir-32)/config.status: config.guess-stamp
	test -d $(objdir-32) || mkdir $(objdir-32)

	cf_cv_type_of_bool='unsigned char'; export cf_cv_type_of_bool; \
	cf_cv_working_poll=yes; export cf_cv_working_poll; \
	cd $(objdir-32) && CC="$(HOST_CC) -m32" \
		BUILD_CC="gcc" CXX="$(HOST_CXX) -m32" \
		$(relsrcdir)/configure \
		$(CONFARGS) \
		--host=$(build_32_target) \
		--without-gpm \
		--disable-widec \
		--libdir=/usr/lib32

$(objdir-64)/config.status: config.guess-stamp
	test -d $(objdir-64) || mkdir $(objdir-64)

	cf_cv_type_of_bool='unsigned char'; export cf_cv_type_of_bool; \
	cf_cv_working_poll=yes; export cf_cv_working_poll; \
	cd $(objdir-64) && CC="$(HOST_CC) -m64" \
		BUILD_CC="gcc" CXX="$(HOST_CXX) -m64" \
		$(relsrcdir)/configure \
		$(CONFARGS) \
		--host=$(build_64_target) \
		--without-gpm \
		--disable-widec \
		--libdir=/usr/lib64

$(wobjdir)/config.status: config.guess-stamp
	test -d $(wobjdir) || mkdir $(wobjdir)
	cd $(wobjdir) && $(relsrcdir)/configure \
		$(CONFARGS) \
		--without-normal \
		--with-progs \
		--enable-widec

$(wobjdir-static)/config.status: config.guess-stamp
	test -d $(wobjdir-static) || mkdir $(wobjdir-static)
	cd $(wobjdir-static) && $(relsrcdir)/configure \
		$(CONFARGS) \
		--without-shared \
		--without-gpm \
		--enable-widec

$(wobjdir-32)/config.status: config.guess-stamp
	test -d $(wobjdir-32) || mkdir $(wobjdir-32)

	cf_cv_type_of_bool='unsigned char'; export cf_cv_type_of_bool; \
	cf_cv_working_poll=yes; export cf_cv_working_poll; \
	cd $(wobjdir-32) && CC="$(HOST_CC) -m32" \
		BUILD_CC="gcc" CXX="$(HOST_CXX) -m32" \
		$(relsrcdir)/configure \
		$(CONFARGS) \
		--host=$(build_32_target) \
		--without-gpm \
		--enable-widec \
		--libdir=/usr/lib32

$(wobjdir-64)/config.status: config.guess-stamp
	test -d $(wobjdir-64) || mkdir $(wobjdir-64)

	cf_cv_type_of_bool='unsigned char'; export cf_cv_type_of_bool; \
	cf_cv_working_poll=yes; export cf_cv_working_poll; \
	cd $(wobjdir-64) && CC="$(HOST_CC) -m64" \
		BUILD_CC="gcc" CXX="$(HOST_CXX) -m64" \
		$(relsrcdir)/configure \
		$(CONFARGS) \
		--host=$(build_64_target) \
		--without-gpm \
		--enable-widec \
		--libdir=/usr/lib64

$(objdir-test)/config.status: build-wide config.guess-stamp
	test -d $(objdir-test) || mkdir $(objdir-test)
	export LD_LIBRARY_PATH=$${LD_LIBRARY_PATH}:$(wobjdir)/lib && \
	cd $(objdir-test) && \
		PKG_CONFIG_LIBDIR=$(wobjdir)/usr/lib/$(DEB_HOST_MULTIARCH)/pkgconfig \
		$(relsrcdir)/test/configure $(CONFARGS-TEST)

build-indep: build-normal build-wide
	touch $@

build-arch build: build-indep build-static build-wide-static $(build_examples) \
	          $(build_64) $(build_32)
	touch build-arch build

build-normal: $(objdir)/config.status
	cd $(objdir) && $(MAKE)
	touch $@

build-static: $(objdir-static)/config.status
	cd $(objdir-static) && $(MAKE)
	touch $@

build-32: $(objdir-32)/config.status
	cd $(objdir-32) && $(MAKE) CC="$(HOST_CC) -m32" CXX="$(HOST_CXX) -m32"
	touch $@

build-64: $(objdir-64)/config.status
	cd $(objdir-64) && $(MAKE) CC="$(HOST_CC) -m64" CXX="$(HOST_CXX) -m64"
	touch $@

build-wide: $(wobjdir)/config.status
	cd $(wobjdir) && $(MAKE)
	# needed for building the examples
	$(MAKE) -C $(wobjdir) DESTDIR=$(wobjdir) install.libs
	touch $@

build-wide-static: $(wobjdir-static)/config.status
	cd $(wobjdir-static) && $(MAKE)
	touch $@

build-wide-32: $(wobjdir-32)/config.status
	cd $(wobjdir-32) && $(MAKE) CC="$(HOST_CC) -m32" CXX="$(HOST_CXX) -m32"
	touch $@

build-wide-64: $(wobjdir-64)/config.status
	cd $(wobjdir-64) && $(MAKE) CC="$(HOST_CC) -m64" CXX="$(HOST_CXX) -m64"
	touch $@

build-test: $(objdir-test)/config.status
	cd $(objdir-test) && $(MAKE)
	touch $@

clean:
	dh_testdir
	rm -f build build-arch build-indep
	rm -f build-normal build-static build-wide \
		build-wide-static build-test $(build_32) $(build_64)
	rm -rf $(objdir)
	rm -rf $(objdir-static)
	rm -rf $(objdir-32)
	rm -rf $(objdir-64)
	rm -rf $(wobjdir)
	rm -rf $(wobjdir-static)
	rm -rf $(wobjdir-32)
	rm -rf $(wobjdir-64)
	rm -rf $(objdir-test)
	dh_autoreconf_clean
	dh_clean

install-indep: build-indep
	dh_testdir
	dh_testroot
	dh_prep

	# We need the tinfo and tic libraries from the wide build, so install the
	# non-wide libraries first and overwrite their tinfo tic libraries later.
	$(MAKE) -C $(objdir) install.libs
	rm -f $(tempdir)/usr/lib/$(DEB_HOST_MULTIARCH)/libtinfo.so*
	rm -f $(tempdir)/usr/lib/$(DEB_HOST_MULTIARCH)/libtic.so*
	install -m 644 $(objdir)/man/ncurses6-config.1 $(wobjdir)/man
	$(MAKE) -C $(wobjdir) install

	# Move terminfo files to the right place.
	mv $(tempdir)/etc/terminfo $(tempdir)/usr/share/terminfo

	# Remove excluded terminal types and other stuff we don't install
	cd $(tempdir)/usr/share/terminfo && rm -f $(badterminfo)
	rm -f $(tempdir)/usr/lib/terminfo \
	      $(tempdir)/usr/lib/$(DEB_HOST_MULTIARCH)/libcurses.so

	# Provide header file symlinks under usr/include/ncursesw
	install -d $(fulltempdir)/usr/include/ncursesw
	set -e; \
	for file in $(tempdir)/usr/include/*.h; do \
		ln -s ../$${file##*/} $(tempdir)/usr/include/ncursesw; \
	done

	# Compile Debian-specific terminfo entries before copying files
	# into their packages.  Hurd uses gsbom/grbom, so pass -x to tic.
ifeq ($(DEB_BUILD_GNU_TYPE),$(DEB_HOST_GNU_TYPE))
	set -e; \
	for ti in hurd rxvt-unicode; do \
	  LD_LIBRARY_PATH=$${LD_LIBRARY_PATH}:$(fulltempdir)/usr/lib/$(DEB_HOST_MULTIARCH) \
		TERMINFO=$(fulltempdir)/usr/share/terminfo \
		$(tempdir)/usr/bin/tic -x debian/$$ti.ti; \
	done
else
	set -e; \
	for ti in hurd rxvt-unicode; do \
		TERMINFO=$(fulltempdir)/usr/share/terminfo \
		tic -x debian/$$ti.ti; \
	done
endif

	# Create Debian-specific aliases xterm-debian and rxvt-m
	ln -sf xterm $(fulltempdir)/usr/share/terminfo/x/xterm-debian
	ln -sf rxvt-basic $(fulltempdir)/usr/share/terminfo/r/rxvt-m

	# Create an empty /etc/terminfo for the sysadmin.
	mkdir -p $(tempdir)/etc/terminfo
	install --mode 644 debian/README.etc $(tempdir)/etc/terminfo/README

terminfocheck: install-indep
	# Compare the just installed terminfo files against the system database
	$(workdir)/debian/tidiff /usr/share/terminfo $(fulltempdir)/usr/share/terminfo

install-arch: build-arch install-indep
	install -m 644 -t $(fulltempdir)/usr/lib/$(DEB_HOST_MULTIARCH) $(objdir-static)/lib/*.a
	install -m 644 -t $(fulltempdir)/usr/lib/$(DEB_HOST_MULTIARCH) $(wobjdir-static)/lib/*.a

	# Always add -ltinfo when linking with -lncurses or -lncursesw
	rm -f $(tempdir)/usr/lib/$(DEB_HOST_MULTIARCH)/libncurses.so
	echo "INPUT(libncurses.so.6 -ltinfo)" > $(tempdir)/usr/lib/$(DEB_HOST_MULTIARCH)/libncurses.so
	rm -f $(tempdir)/usr/lib/$(DEB_HOST_MULTIARCH)/libncursesw.so
	echo "INPUT(libncursesw.so.6 -ltinfo)" > $(tempdir)/usr/lib/$(DEB_HOST_MULTIARCH)/libncursesw.so

ifneq ($(build_examples),)
	# Install the test programs, sparing the detour to debian/tmp.
	$(MAKE) -C $(objdir-test) DESTDIR=$(workdir)/debian/$(package-examples) install
	sed -i -e 's%^#!/usr/bin/env perl%#!/usr/bin/perl%' \
		$(workdir)/debian/$(package-examples)/usr/libexec/ncurses-examples/tracemunch
endif

binary:	binary-arch binary-indep

binary-arch: build-arch install-arch
	dh_testdir
	dh_testroot
	dh_installdirs -a
	dh_install -p$(package-bin) -Xncurses6-config -Xncursesw6-config
	dh_install -a -N$(package-bin)
	dh_installdocs -p$(package-ti) -p$(package-bin) -p$(package-examples)
	dh_installdocs -a -N$(package-bin) -N$(package-ti) -N$(package-examples) \
		       -N$(package-lib-32) -N$(package-libw-32) -N$(package-dev-32) -N$(package-ti-32) \
		       -N$(package-lib-64) -N$(package-libw-64) -N$(package-dev-64) -N$(package-ti-64) \
		       --link-doc=$(package-ti)
ifneq ($(build_32),)
	dh_installdocs -p$(package-ti-32)
	dh_installdocs -p$(package-lib-32) -p$(package-libw-32) -p$(package-dev-32) \
		       --link-doc=$(package-ti-32)
endif
ifneq ($(build_64),)
	dh_installdocs -p$(package-ti-64)
	dh_installdocs -p$(package-lib-64) -p$(package-libw-64) -p$(package-dev-64) \
		       --link-doc=$(package-ti-64)
endif
	dh_installchangelogs -a NEWS
	dh_installman -a

	# Strip the packages, shipping detached debugging symbols.
	dh_dwz -a
	dh_strip -a
	dh_lintian -a
	dh_link -a
	dh_compress -p$(package-examples) usr/libexec/ncurses-examples/README
	dh_compress -a -N$(package-examples)
	dh_fixperms -a
ifneq ($(build_examples),)
	chmod -x debian/$(package-examples)/usr/libexec/ncurses-examples/README*
endif
	dh_missing -a --fail-missing
	dh_makeshlibs -p$(package-ti) -V "$(package-ti) $(sodepver)" -- -c4
	dh_makeshlibs -p$(package-lib) -V "$(package-lib) $(sodepver)" -- -c4
	dh_makeshlibs -p$(package-libw) -V "$(package-libw) $(sodepver)" -- -c4
ifneq ($(build_32),)
	dh_makeshlibs -p$(package-ti-32) -V "$(package-ti-32) $(sodepver)" -- -c4
	dh_makeshlibs -p$(package-lib-32) -V "$(package-lib-32) $(sodepver)" -- -c4
	dh_makeshlibs -p$(package-libw-32) -V "$(package-libw-32) $(sodepver)" -- -c4
endif
ifneq ($(build_64),)
	dh_makeshlibs -p$(package-ti-64) -V "$(package-ti-64) $(sodepver)" -- -c4
	dh_makeshlibs -p$(package-lib-64) -V "$(package-lib-64) $(sodepver)" -- -c4
	dh_makeshlibs -p$(package-libw-64) -V "$(package-libw-64) $(sodepver)" -- -c4
endif
	dh_shlibdeps -a
	dh_installdeb -a
	dh_gencontrol -a
	# We don't install the tic library in the libtinfo6 udeb, adjust the shlibs file
	sed -i '/^udeb: libtic /d' debian/$(package-ti)/DEBIAN/shlibs
	# For the ncurses udeb, we discard libformw, libmenuw and libpanelw as well
	sed -i '/^udeb: libformw /d' debian/$(package-libw)/DEBIAN/shlibs
	sed -i '/^udeb: libmenuw /d' debian/$(package-libw)/DEBIAN/shlibs
	sed -i '/^udeb: libpanelw /d' debian/$(package-libw)/DEBIAN/shlibs
	dh_md5sums -a
	dh_builddeb -a

binary-indep: build-indep install-indep $(check_ti)
	dh_testdir
	dh_testroot

	dh_installdirs -i
	dh_install -i
	rm -f $$(find debian/$(package-base)/usr/share/terminfo/*/* \
		| sed 's/$(package-base)/$(package-term)/')
	dh_installdocs -i -Xhtml/Ada95.html -Xhtml/ada/ debian/FAQ
	dh_installchangelogs -i NEWS
	dh_lintian -i
	dh_link -i
	dh_compress -i
	dh_fixperms -i
	dh_missing -i --fail-missing -Xusr/lib
	dh_installdeb -i
	dh_gencontrol -i
	dh_md5sums -i
	dh_builddeb -i

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