#!/usr/bin/make -f

export DH_VERBOSE=1

# enable Debian Hardening
# see: https://wiki.debian.org/Hardening
export DEB_BUILD_MAINT_OPTIONS = hardening=+all
DPKG_EXPORT_BUILDFLAGS = 1
include /usr/share/dpkg/buildflags.mk

ARCH := $(shell dpkg-architecture -qDEB_BUILD_ARCH)
ARCH_OS := $(shell dpkg-architecture -qDEB_BUILD_ARCH_OS)
ARCH_VARIANT := $(DEB_HOST_ARCH_VARIANT)
BUILDDIR := builddir
builddir = $(BUILDDIR)
DEBVERSION := $(shell dpkg-parsechangelog | awk '/^Version: / { print $$2 }' | sed 's/^.*-//' )
DEB_BUILD_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_BUILD_GNU_TYPE)
DEB_BUILD_GNU_SYSTEM ?= $(shell dpkg-architecture -qDEB_BUILD_GNU_SYSTEM)
DEB_HOST_GNU_TYPE  ?= $(shell dpkg-architecture -qDEB_HOST_GNU_TYPE)
DEB_SOURCE_PACKAGE ?= $(strip $(shell egrep '^Source: ' debian/control | cut -f 2 -d ':'))
DEB_VERSION ?= $(shell dpkg-parsechangelog | egrep '^Version:' | cut -f 2 -d ' ')
DEB_NOEPOCH_VERSION ?= $(shell echo $(DEB_VERSION) | cut -d: -f2-)
DEB_UPSTREAM_VERSION ?= $(shell echo $(DEB_NOEPOCH_VERSION) | sed 's/-[^-]*$$//')
DEB_UPSTREAM_VERSION_MAJOR_MINOR := $(shell echo $(DEB_UPSTREAM_VERSION) | sed -r -n 's/^([0-9]+\.[0-9]+).*/\1/p')
DEB_HOST_MULTIARCH ?= $(shell dpkg-architecture -qDEB_HOST_MULTIARCH)
DISTRIBUTION := $(shell lsb_release -i -s)
EXPORTED_SOURCE_TARBALL := debian/mysql-source.tar.gz
TMP := $(CURDIR)/debian/tmp/
NUMJOBS=$(patsubst parallel=%,%,$(filter parallel=%,$(DEB_BUILD_OPTIONS)))
TESTJOBS=$(NUMJOBS)
# Some tests will fail on platforms that are not tested by upstream
ifneq (,$(filter $(ARCH), amd64 arm64))
    TESTSUITE_FAIL_CMD:=exit 1
else
    TESTSUITE_FAIL_CMD:=true
endif

# Only build server on 64 bit architectures
ifneq (,$(filter $(ARCH), armhf i386))
    BUILD_WITHOUT_SERVER:=ON
else
    BUILD_WITHOUT_SERVER:=OFF
endif

# Use tcmalloc on all architectures except i386
ifneq (,$(filter $(ARCH), i386))
    BUILD_WITH_TCMALLOC:=OFF
else
    BUILD_WITH_TCMALLOC:=system
endif


ifeq (,$(NUMJOBS))
	NUMJOBS=1
endif

MAKEFLAGS += -j $(NUMJOBS)

# The below system setting constrains how many servers can be run in parallel
# A server with default config needs a bit over 5300 slots, so we assume 6000 to be sure
AIOMAX := $(shell cat /proc/sys/fs/aio-max-nr)
AIOPER := 6000
PARMAX := $(shell echo $$(( $(AIOMAX)/$(AIOPER))))

ifeq ($(shell test $(TESTJOBS) -gt $(PARMAX); echo $$?),0)
	TESTJOBS:=$(shell echo $(PARMAX) )
endif

export MYSQL_BUILD_CC=$(DEB_HOST_GNU_TYPE)-gcc
export MYSQL_BUILD_CXX=$(DEB_HOST_GNU_TYPE)-g++

# The full upstream test suite takes a very long time to run, so we run
# only the main test suite unless fulltest is specified.
ifeq ($(findstring fulltest,$(DEB_BUILD_OPTIONS)),)
    MTR_SUITE=--suite=main
endif


override_dh_auto_clean:
	@echo "RULES.$@"
	dh_testdir 
	dh_testroot
	[ ! -d mysql-test/var ] || rm -rf mysql-test/var
	rm -rf $(BUILDDIR)
	debconf-updatepo
	rm -f $(EXPORTED_SOURCE_TARBALL)

override_dh_prep: 

override_dh_auto_configure: configure-stamp


configure-stamp:
	@echo "RULES.$@"
	dh_testdir
	( test -d $(builddir) || mkdir $(builddir) ) && cd $(builddir) && \
	sh -c  'PATH=$${MYSQL_BUILD_PATH:-"/bin:/usr/bin"} \
		CC=$${MYSQL_BUILD_CC:-gcc} \
		CXX=$${MYSQL_BUILD_CXX:-g++} \
		cmake -DCMAKE_INSTALL_PREFIX=/usr \
		-DCMAKE_VERBOSE_MAKEFILE=ON \
		-DMYSQL_UNIX_ADDR=/var/run/mysqld/mysqld.sock \
		-DCMAKE_BUILD_TYPE=RelWithDebInfo \
		-DBUILD_CONFIG=mysql_release \
		-DWITH_LIBWRAP=OFF \
		-DWITH_SYSTEM_LIBS=ON \
		-DWITH_MECAB=system \
		-DWITH_TCMALLOC="$(BUILD_WITH_TCMALLOC)" \
		-DWITH_ZLIB=system \
		-DWITH_BOOST=../boost \
		-DCOMPILATION_COMMENT="($(DISTRIBUTION))" \
		-DMYSQL_SERVER_SUFFIX="-$(DEBVERSION)" \
		-DINSTALL_LAYOUT=DEB \
		-DINSTALL_DOCDIR=share/mysql/docs \
		-DINSTALL_DOCREADMEDIR=share/mysql \
		-DINSTALL_INCLUDEDIR=include/mysql \
		-DINSTALL_INFODIR=share/mysql/docs \
		-DINSTALL_LIBDIR=lib/$(DEB_HOST_MULTIARCH) \
		-DINSTALL_MANDIR=share/man \
		-DINSTALL_MYSQLSHAREDIR=share/mysql \
		-DINSTALL_MYSQLTESTDIR=lib/mysql-test \
		-DINSTALL_PLUGINDIR=lib/mysql/plugin \
		-DINSTALL_SBINDIR=sbin \
		-DINSTALL_SCRIPTDIR=bin \
		-DINSTALL_SUPPORTFILESDIR=share/mysql \
		-DSYSCONFDIR=/etc/mysql \
		-DWITH_EMBEDDED_SERVER=ON \
		-DWITH_ARCHIVE_STORAGE_ENGINE=ON \
		-DWITH_BLACKHOLE_STORAGE_ENGINE=ON \
		-DWITH_FEDERATED_STORAGE_ENGINE=ON \
		-DWITH_EXTRA_CHARSETS=all \
		-DROUTER_INSTALL_LIBDIR=lib/mysql-router \
		-DWITH_FIDO=bundled \
        -DWITHOUT_SERVER="$(BUILD_WITHOUT_SERVER)" \
		..'
	touch $@

override_dh_auto_build: build-stamp

# $(EXPORTED_SOURCE_TARBALL) must be built before the builds commence, since
# the builds change some of the files picked up by this tar invocation, and
# this can race against tar with an error like "tar:
# ./builddir-pic/strings/CMakeFiles/strings.dir: file changed as we read it".
# So define the rule for building it here, and have the build rules depend on
# it.
$(EXPORTED_SOURCE_TARBALL):
	GZIP=-n tar -zcf $(EXPORTED_SOURCE_TARBALL) \
	    --exclude=debian . \
	    --transform="s,^\./,mysql-8.4/,"

build-stamp: $(EXPORTED_SOURCE_TARBALL)
	@echo "RULES.$@"
	cd $(builddir) && $(MAKE)
	touch $@

override_dh_auto_test:
ifeq (,$(filter nocheck,$(DEB_BUILD_OPTIONS)))
	@echo "RULES.$@"
ifeq ($(ARCH_OS),hurd)
	cd $(builddir) && $(MAKE) test || $(TESTSUITE_FAIL_CMD) ;
else ifeq ($(BUILD_WITHOUT_SERVER),OFF)
	touch $(builddir)/mysql-test/skiplist

ifeq ($(ARCH_VARIANT),amd64v3)
	# Tests failing on amd64v3
	echo "main.subquery_sj_all_bka_nobnl			: BUG#00000 -  Nested loop left join cost off by .1 on amd64v3" >> $(builddir)/mysql-test/skiplist
	echo "main.subquery_sj_mat_bka_nobnl			: BUG#00000 -  Nested loop left join cost off by .1 on amd64v3" >> $(builddir)/mysql-test/skiplist
	echo "main.myisam_explain_json_non_select_all	: BUG#00000 -  JSON explain error on amd64v3" >> $(builddir)/mysql-test/skiplist
	echo "main.myisam_explain_json_non_select_none	: BUG#00000 -  JSON explain error on amd64v3" >> $(builddir)/mysql-test/skiplist
endif

	# Tests that require more resources than LP provides at build time
	echo "main.log_state					: BUG#00000 -  Requires additional resources" >> $(builddir)/mysql-test/skiplist
	echo "main.histograms					: BUG#00000 -  Requires additional resources" >> $(builddir)/mysql-test/skiplist
	echo "main.sp-threads					: BUG#00000 -  Requires additional resources" >> $(builddir)/mysql-test/skiplist

	# Skip replication tests since they are timing sensitive and may
	# result in false positives.
	cd $(builddir)/mysql-test && ./mtr --suite-timeout=600 --testcase-timeout=60 --report-unstable-tests --parallel=$(TESTJOBS) --skip-rpl $(MTR_SUITE) --force --skip-test-list=./skiplist || $(TESTSUITE_FAIL_CMD) ;
endif
endif

override_dh_auto_install: auto_install-stamp

auto_install-stamp:
	@echo "RULES.$@"
	dh_testdir
	dh_testroot
	# make install (trailing slash needed for innobase)
	cd $(builddir) && $(MAKE) install DESTDIR=$(TMP)/
	# After installing, remove rpath to make lintian happy.
	set +e; \
	find ./debian/tmp/ -type f -print0 \
		| xargs -0 --no-run-if-empty chrpath -k 2>/dev/null \
		| fgrep RPATH= \
		| cut -d: -f 1 \
		| xargs --no-run-if-empty chrpath -d; \
	set -e
	install -d -m 0755 -o root -g root $(TMP)/usr/lib/mysql
	mkdir -p $(TMP)/usr/share/doc/mysql-server
	nm -n $(BUILDDIR)/bin/mysqld |gzip -n -9 > $(TMP)/usr/share/doc/mysql-server/mysqld.sym.gz
	# This seems to be the only safe place to fix permissions issues
	# not handled by dh_fixperms.
	install -m 0755 debian/additions/echo_stderr $(TMP)/usr/share/mysql/
	mkdir -p $(TMP)/etc/mysql
	install -m 0755 debian/additions/debian-start $(TMP)/etc/mysql/
	install -m 0644 debian/additions/debian_create_root_user.sql $(TMP)/usr/share/mysql/
	# install AppArmor profile
	install -D -m 644 debian/additions/apparmor-profile $(TMP)/etc/apparmor.d/usr.sbin.mysqld
	touch $@


override_dh_installlogrotate-arch:
	dh_installlogrotate --name mysql-server

override_dh_install:
	dh_install \
		-Xusr/share/man \
		-Xusr/share/mysql/mysql.server \
		-Xmysql.info
	dh_apparmor -pmysql-server --profile-name=usr.sbin.mysqld

override_dh_missing:
	dh_missing --fail-missing \
		-Xusr/share/man \
		-Xusr/share/mysql/mysql.server \
		-Xmysql.info

override_dh_installsystemd:
	dh_installsystemd --name=mysql --no-restart-after-upgrade

override_dh_installcron-arch:
	dh_installcron --name mysql-server

get-orig-source:
	uscan --force-download --verbose

%:
	dh $@ --parallel

