#!/usr/bin/make -f
#export DH_VERBOSE = 1
export DEB_BUILD_MAINT_OPTIONS = hardening=+all

# For DEB_VERSION_UPSTREAM
include /usr/share/dpkg/pkg-info.mk


# GGML_NATIVE:ON corresponds to -march=native
OPTS_COMMON        = -DGGML_NATIVE=OFF \
                     -DCMAKE_BUILD_TYPE=RelWithDebInfo \
                     -DGGML_BUILD_NUMBER=$(subst +dfsg,,$(DEB_VERSION_UPSTREAM)) \
                     -DCMAKE_INSTALL_RPATH=/usr/lib/${DEB_HOST_MULTIARCH}/ggml \
                     -DCMAKE_INSTALL_RPATH_USE_LINK_PATH=OFF

OPTS_NONBASELINE   = -DGGML_BUILD_TESTS=OFF -DGGML_BUILD_EXAMPLES=OFF
OPTS_BASELINE      = -DGGML_BUILD_TESTS=ON  -DGGML_BUILD_EXAMPLES=OFF -DGGML_INSTALL_TESTS=ON

# Baseline turns all optimizations off
ifeq (amd64,$(DEB_HOST_ARCH))
OPTS_BASELINE     += -DGGML_SSE42=OFF -DGGML_AVX=OFF -DGGML_AVX2=OFF -DGGML_F16C=OFF -DGGML_FMA=OFF -DGGML_AVX512=OFF
else ifeq (ppc64el,$(DEB_HOST_ARCH))
OPTS_BASELINE     += -DGGML_POWERPC_CPUTYPE=power8
else
OPTS_BASELINE     += -DGGML_CPU_ARM_ARCH=armv8-a
endif
BUILDDIR_BASELINE  = build-cpu-baseline

# Additional hardware capability levels for amd64
OPTS_X86_64_V2     = -DGGML_HWCAPS_SUBDIR=glibc-hwcaps/x86-64-v2 \
                     -DGGML_SSE42=ON -DGGML_AVX=OFF -DGGML_AVX2=OFF -DGGML_F16C=OFF -DGGML_FMA=OFF -DGGML_AVX512=OFF
BUILDDIR_X86_64_V2 = build-cpu-hwcaps-x86-64-v2
OPTS_X86_64_V3     = -DGGML_HWCAPS_SUBDIR=glibc-hwcaps/x86-64-v3 \
                     -DGGML_SSE42=ON -DGGML_AVX=ON -DGGML_AVX2=ON -DGGML_F16C=ON -DGGML_FMA=ON -DGGML_AVX512=OFF
BUILDDIR_X86_64_V3 = build-cpu-hwcaps-x86-64-v3
OPTS_X86_64_V4     = -DGGML_HWCAPS_SUBDIR=glibc-hwcaps/x86-64-v4 \
                     -DGGML_SSE42=ON -DGGML_AVX=ON -DGGML_AVX2=ON -DGGML_F16C=ON -DGGML_FMA=ON -DGGML_AVX512=ON
BUILDDIR_X86_64_V4 = build-cpu-hwcaps-x86-64-v4

# Additional hardware capability levels for ppc64el
OPTS_POWER9        = -DGGML_HWCAPS_SUBDIR=glibc-hwcaps/power9 \
                     -DGGML_POWERPC_CPUTYPE=power9
BUILDDIR_POWER9    = build-cpu-hwcaps-power9
OPTS_POWER10       = -DGGML_HWCAPS_SUBDIR=glibc-hwcaps/power10 \
                     -DGGML_POWERPC_CPUTYPE=power10
BUILDDIR_POWER10   = build-cpu-hwcaps-power10

OPTS_BLAS          = -DGGML_SSE42=OFF -DGGML_AVX=OFF -DGGML_AVX2=OFF -DGGML_F16C=OFF -DGGML_FMA=OFF -DGGML_AVX512=OFF \
                     -DGGML_BLAS=ON
BUILDDIR_BLAS      = build-blas

AMDGPU_TARGETS     = gfx803;gfx900;gfx906;gfx908;gfx90a;gfx1010;gfx1011;gfx1030;gfx1100;gfx1101;gfx1102
OPTS_HIP           = -DGGML_SSE42=OFF -DGGML_AVX=OFF -DGGML_AVX2=OFF -DGGML_F16C=OFF -DGGML_FMA=OFF -DGGML_AVX512=OFF \
                     -DGGML_HIP=ON -DCMAKE_HIP_ARCHITECTURES="$(AMDGPU_TARGETS)"
BUILDDIR_HIP       = build-hip

OPTS_VULKAN        = -DGGML_SSE42=OFF -DGGML_AVX=OFF -DGGML_AVX2=OFF -DGGML_F16C=OFF -DGGML_FMA=OFF -DGGML_AVX512=OFF \
                     -DGGML_VULKAN=ON
BUILDDIR_VULKAN    = build-vulkan


%:
	dh $@ --buildsystem=cmake

override_dh_auto_clean:
	dh_auto_clean --builddir=$(BUILDDIR_BASELINE)
	dh_auto_clean --builddir=$(BUILDDIR_BLAS)
ifeq (amd64,$(DEB_HOST_ARCH))
	dh_auto_clean --builddir=$(BUILDDIR_X86_64_V2)
	dh_auto_clean --builddir=$(BUILDDIR_X86_64_V3)
	dh_auto_clean --builddir=$(BUILDDIR_X86_64_V4)
else ifeq (ppc64el,$(DEB_HOST_ARCH))
	dh_auto_clean --builddir=$(BUILDDIR_POWER9)
	dh_auto_clean --builddir=$(BUILDDIR_POWER10)
endif
ifeq ($(filter pkg.ggml.nohip,$(DEB_BUILD_PROFILES)),)
ifneq ($(filter $(DEB_HOST_ARCH),amd64 arm64 ppc64el),)
	dh_auto_clean --builddir=$(BUILDDIR_HIP)
endif
endif
	dh_auto_clean --builddir=$(BUILDDIR_VULKAN)

override_dh_auto_configure:
	dh_auto_configure --builddir=$(BUILDDIR_BASELINE) -- $(OPTS_COMMON) $(OPTS_BASELINE)
	dh_auto_configure --builddir=$(BUILDDIR_BLAS) -- $(OPTS_COMMON) $(OPTS_NONBASELINE) $(OPTS_BLAS)
ifeq (amd64,$(DEB_HOST_ARCH))
	dh_auto_configure --builddir=$(BUILDDIR_X86_64_V2) -- $(OPTS_COMMON) $(OPTS_NONBASELINE) $(OPTS_X86_64_V2)
	dh_auto_configure --builddir=$(BUILDDIR_X86_64_V3) -- $(OPTS_COMMON) $(OPTS_NONBASELINE) $(OPTS_X86_64_V3)
	dh_auto_configure --builddir=$(BUILDDIR_X86_64_V4) -- $(OPTS_COMMON) $(OPTS_NONBASELINE) $(OPTS_X86_64_V4)
else ifeq (ppc64el,$(DEB_HOST_ARCH))
	dh_auto_configure --builddir=$(BUILDDIR_POWER9) -- $(OPTS_COMMON) $(OPTS_NONBASELINE) $(OPTS_POWER9)
	dh_auto_configure --builddir=$(BUILDDIR_POWER10) -- $(OPTS_COMMON) $(OPTS_NONBASELINE) $(OPTS_POWER10)
endif
ifeq ($(filter pkg.ggml.nohip,$(DEB_BUILD_PROFILES)),)
ifneq ($(filter $(DEB_HOST_ARCH),amd64 arm64 ppc64el),)
	HIPCXX=clang-17 dh_auto_configure --builddir=$(BUILDDIR_HIP) -- $(OPTS_COMMON) $(OPTS_NONBASELINE) $(OPTS_HIP)
endif
endif
	dh_auto_configure --builddir=$(BUILDDIR_VULKAN) -- $(OPTS_COMMON) $(OPTS_NONBASELINE) $(OPTS_VULKAN)

override_dh_auto_build:
	dh_auto_build --builddir=$(BUILDDIR_BASELINE)
	dh_auto_build --builddir=$(BUILDDIR_BLAS)
ifeq (amd64,$(DEB_HOST_ARCH))
	dh_auto_build --builddir=$(BUILDDIR_X86_64_V2)
	dh_auto_build --builddir=$(BUILDDIR_X86_64_V3)
	dh_auto_build --builddir=$(BUILDDIR_X86_64_V4)
else ifeq (ppc64el,$(DEB_HOST_ARCH))
	dh_auto_build --builddir=$(BUILDDIR_POWER9)
	dh_auto_build --builddir=$(BUILDDIR_POWER10)
endif
ifeq ($(filter pkg.ggml.nohip,$(DEB_BUILD_PROFILES)),)
ifneq ($(filter $(DEB_HOST_ARCH),amd64 arm64 ppc64el),)
	dh_auto_build --builddir=$(BUILDDIR_HIP)
endif
endif
	dh_auto_build --builddir=$(BUILDDIR_VULKAN)

# No tests for now, as many need some kind of model we don't have
override_dh_auto_test:
	:

override_dh_auto_install:
	dh_auto_install --builddir=$(BUILDDIR_BASELINE) --destdir=debian/tmp/$(BUILDDIR_BASELINE)
	dh_auto_install --builddir=$(BUILDDIR_BLAS) --destdir=debian/tmp/$(BUILDDIR_BLAS)
ifeq (amd64,$(DEB_HOST_ARCH))
	dh_auto_install --builddir=$(BUILDDIR_X86_64_V2) --destdir=debian/tmp/$(BUILDDIR_X86_64_V2)
	dh_auto_install --builddir=$(BUILDDIR_X86_64_V3) --destdir=debian/tmp/$(BUILDDIR_X86_64_V3)
	dh_auto_install --builddir=$(BUILDDIR_X86_64_V4) --destdir=debian/tmp/$(BUILDDIR_X86_64_V4)
else ifeq (ppc64el,$(DEB_HOST_ARCH))
	dh_auto_install --builddir=$(BUILDDIR_POWER9) --destdir=debian/tmp/$(BUILDDIR_POWER9)
	dh_auto_install --builddir=$(BUILDDIR_POWER10) --destdir=debian/tmp/$(BUILDDIR_POWER10)
endif
ifeq ($(filter pkg.ggml.nohip,$(DEB_BUILD_PROFILES)),)
ifneq ($(filter $(DEB_HOST_ARCH),amd64 arm64 ppc64el),)
	dh_auto_install --builddir=$(BUILDDIR_HIP) --destdir=debian/tmp/$(BUILDDIR_HIP)
endif
endif
	dh_auto_install --builddir=$(BUILDDIR_VULKAN) --destdir=debian/tmp/$(BUILDDIR_VULKAN)

# dwz doesn't fully support DWARF-5 yet, see #1016936
# The HIP build produces DWARF-5 stuff
override_dh_dwz:
	:
