#!/usr/bin/make -f

export DH_VERBOSE = 1
export DEB_BUILD_MAINT_OPTIONS = hardening=+bindnow

include /usr/share/dpkg/architecture.mk
include /usr/share/dpkg/pkg-info.mk

PKGVER := $(shell echo $(DEB_VERSION_UPSTREAM) | sed -E 's/\+dfsg[0-9]*$$//')

# Silence GCC 16's new -Wsfinae-incomplete warnings
DEB_CXXFLAGS_MAINT_APPEND = -Wno-sfinae-incomplete

# reduce dbgsym file size
DEB_CXXFLAGS_MAINT_APPEND += -g1
DEB_CFLAGS_MAINT_APPEND = -g1

# Fix ELF_LITERAL overflow
ifeq ($(DEB_HOST_ARCH),alpha)
  DEB_LDFLAGS_MAINT_APPEND = -Wl,--sort-section,name
endif

export DEB_CXXFLAGS_MAINT_APPEND
export DEB_CFLAGS_MAINT_APPEND
export DEB_LDFLAGS_MAINT_APPEND

%:
	dh $@ --buildsystem=cmake

cmake_flags := \
	-DCMAKE_BUILD_TYPE=Release \
	-DBUILD_SHELL=TRUE \
	-DBUILD_UNITTESTS=FALSE \
	-DENABLE_SANITIZER=FALSE

# Sets MAJOR/MINOR/PATCH version variables and the SOVERSION on the shared
# library. DUCKDB_EXPLICIT_VERSION does NOT set these.
cmake_flags += \
	-DOVERRIDE_GIT_DESCRIBE=v2.0.0 \
	-DSET_DUCKDB_LIBRARY_VERSION=TRUE

# Release builds on amd64 default to -march=x86-64-v3
# since https://github.com/duckdb/duckdb/commit/84c0e6cebe
# Use Debian's plain x86-64 (SSE2) baseline.
ifeq ($(DEB_HOST_ARCH),amd64)
cmake_flags += \
	-DDUCKDB_OPTIMIZATION_PROFILE=NONE
endif

# In-tree extensions to compile statically into libduckdb.so, in addition to
# the built-ins (parquet, core_functions, json, icu).
cmake_flags += \
	-DBUILD_EXTENSIONS="autocomplete" \
	-DLINK_CORE_EXTENSIONS=TRUE

# Out-of-tree extensions, built as standalone loadable .duckdb_extension
DUCKDB_EXTERNAL_EXTENSIONS := httpfs quack sqlite_scanner postgres_scanner mysql_scanner
cmake_flags += \
	-DDUCKDB_EXTENSION_CONFIGS="$(CURDIR)/debian/extension-configs/httpfs.cmake;$(CURDIR)/debian/extension-configs/quack.cmake;$(CURDIR)/debian/extension-configs/sqlite.cmake;$(CURDIR)/debian/extension-configs/postgres.cmake;$(CURDIR)/debian/extension-configs/mysql.cmake"

cmake_flags += \
	-DEXTENSION_DIRECTORIES="~/.duckdb/extensions;/usr/lib/duckdb/extensions" \
	-DDEBIAN_DUCKDB_SYSTEM_EXTENSION_PATH="/usr/lib/duckdb/extensions/"

# Use system zstd and xxhash via shim headers in src/include/shims/zstd/.
cmake_flags += \
	-DUSE_SYSTEM_ZSTD=TRUE

# Use system snappy, lz4 and brotli for parquet codecs.
cmake_flags += \
	-DUSE_SYSTEM_SNAPPY=TRUE \
	-DUSE_SYSTEM_LZ4=TRUE \
	-DUSE_SYSTEM_BROTLI=TRUE

# Use system yyjson for JSON parsing.
cmake_flags += \
	-DUSE_SYSTEM_YYJSON=TRUE

# Use system mbedtls instead of bundled 3.6.x sources.
cmake_flags += \
	-DUSE_SYSTEM_MBEDTLS=TRUE

override_dh_auto_configure:
	@echo " ### Build flags: $$(date '+%Y-%m-%dT%H:%M:%S')"
	@echo "  CFLAGS:   $$(dpkg-buildflags --get CFLAGS)"
	@echo "  CXXFLAGS: $$(dpkg-buildflags --get CXXFLAGS)"
	@echo "  CPPFLAGS: $$(dpkg-buildflags --get CPPFLAGS)"
	@echo "  LDFLAGS:  $$(dpkg-buildflags --get LDFLAGS)"
	dh_auto_configure -- $(cmake_flags)

# Static archives are needed during linking but are not shipped.
# Remove them because Salsa is running out of disk space.
override_dh_auto_install:
	dh_auto_install
	find debian/tmp/usr/lib -name '*.a' -delete
	# Install the loadable extensions, stripping the ELF content before
	# DuckDB's metadata footer is appended.
	set -e; \
	PLATFORM=linux_$$(dpkg-architecture -q DEB_HOST_ARCH); \
	for ext in $(DUCKDB_EXTERNAL_EXTENSIONS); do \
	    DEST=debian/duckdb/usr/lib/duckdb/extensions/v$(PKGVER)/$${PLATFORM}/$$ext.duckdb_extension; \
	    install -D -m0644 obj-*/repository/v$(PKGVER)/$${PLATFORM}/$$ext.duckdb_extension "$$DEST"; \
	    SRC_SIZE=$$(stat -c%s "$$DEST"); \
	    tail -c 512 "$$DEST" > "$$DEST.footer"; \
	    head -c $$((SRC_SIZE - 512)) "$$DEST" > "$$DEST.elf"; \
	    strip --strip-unneeded "$$DEST.elf"; \
	    cat "$$DEST.footer" >> "$$DEST.elf"; \
	    mv "$$DEST.elf" "$$DEST"; \
	    rm -f "$$DEST.footer"; \
	    chmod 0644 "$$DEST"; \
	done

# Raise dwz's 50M DIE limit (libduckdb exceeds it) and exclude the loadable
# extensions (dwz/dh_strip would corrupt their trailing metadata footer).
override_dh_dwz:
	dh_dwz --exclude=duckdb/extensions/ -- -L none

override_dh_strip:
	dh_strip --exclude=duckdb/extensions/
