#!/usr/bin/make -f # Keep dh defaults, but the actual builds pass explicit flags export DEB_BUILD_MAINT_OPTIONS = hardening=+all export DEB_CFLAGS_MAINT_APPEND = -O2 -fPIC # Match the shell script layout: build in-tree and use .libs directly SQLCIPHER_SRC_DIR := $(CURDIR)/build-sqlcipher export SQLITE_LIBS = $(SQLCIPHER_SRC_DIR)/.libs/ export SQLCIPHER_LIBDIR_ARG = $(SQLITE_LIBS)sqlite3.o export STANDARD_SQLCIPHER_CFLAGS = -DSQLITE_HAS_CODEC -DSQLITE_TEMP_STORE=2 -DSQLITE_MAX_VARIABLE_NUMBER=250000 -DSQLITE_EXTRA_INIT=sqlcipher_extra_init -DSQLITE_EXTRA_SHUTDOWN=sqlcipher_extra_shutdown export STANDARD_SQLCIPHER_LDFLAGS = -lcrypto -L$(SQLITE_LIBS) export SQLITE_CFLAGS = -I$(SQLCIPHER_SRC_DIR) $(STANDARD_SQLCIPHER_CFLAGS) # Detect PHP version on the build host PHPCONFIG_CANDIDATE := $(shell \ if ls -1 /usr/bin/php-config[0-9]* >/dev/null 2>&1; then \ ls -1 /usr/bin/php-config[0-9]* | sed 's#.*/##' | sort -Vr | head -n1; \ elif command -v php-config >/dev/null 2>&1; then echo php-config; \ else echo php-config; fi) PHP_VER ?= $(shell $(PHPCONFIG_CANDIDATE) --version 2>/dev/null | awk -F. '{print $$1"."$$2}') PHPCONFIG := $(shell if command -v php-config$(PHP_VER) >/dev/null 2>&1; then echo php-config$(PHP_VER); else echo $(PHPCONFIG_CANDIDATE); fi) PHPIZE := $(patsubst php-config%,phpize%,$(PHPCONFIG)) # Extension API dir (e.g. 20240924) PHP_API := $(shell $(PHPCONFIG) --extension-dir | awk -F/ '{print $$NF}') # Binary package name (must match debian/.php) PACKAGE ?= php$(PHP_VER)-sqlcipher # Final install path (inside package staging tree) EXTDIR = debian/$(PACKAGE)/usr/lib/php/$(PHP_API) # Markers to persist paths across recipe lines PHP_SRC_MARKER = .php_src_dir SQLITE3_DIR_MARKER = .sqlite3_dir PDO_SQLITE_DIR_MARKER = .pdo_sqlite_dir # Figure out the matching Debian source package from the dev tool that owns php-config PHP_DEV_PKG := $(shell dpkg-query -S $$(command -v $(PHPCONFIG)) 2>/dev/null | cut -d: -f1 | sed 's/:.*//' | head -n1) # PDO sources and build dir PDO_SRC_DIR := $(CURDIR)/pdo_sqlcipher PDO_BUILD_DIR := $(PDO_SRC_DIR)/build %: dh $@ --with php override_dh_auto_build: # 1) Build SQLCipher cd "$(SQLCIPHER_SRC_DIR)" && env -u DEB_BUILD_MAINT_OPTIONS -u DEB_CFLAGS_MAINT_APPEND \ CFLAGS="$(STANDARD_SQLCIPHER_CFLAGS)" \ LDFLAGS="-lcrypto" \ ./configure --with-tempstore=yes $(MAKE) -C "$(SQLCIPHER_SRC_DIR)" # 2) Check PHP sources are present, set string vars @set -eu; \ PHP_SRC_DIR=$$(readlink -f $$(ls -dt php-src/*/ | head -n1 | sed 's#/$$##')); \ test -d "$$PHP_SRC_DIR" || { echo "Could not locate extracted php$(PHP_VER) source dir"; ls -al php-src; exit 1; }; \ printf '%s' "$$PHP_SRC_DIR" > "$(PHP_SRC_MARKER)"; \ SQLITE3_DIR=$$(readlink -f $$(find "$$PHP_SRC_DIR" -type d -path '*/ext/sqlite3' | head -n1)); \ test -d "$$SQLITE3_DIR" || { echo "ext/sqlite3 not found under $$PHP_SRC_DIR"; find "$$PHP_SRC_DIR" -maxdepth 4 -type d -name sqlite3; exit 1; }; \ printf '%s' "$$SQLITE3_DIR" > "$(SQLITE3_DIR_MARKER)"; \ PDO_SQLITE_DIR=$$(readlink -f $$(find "$$PHP_SRC_DIR" -type d -path '*/ext/pdo_sqlite' | head -n1)); \ test -d "$$PDO_SQLITE_DIR" || { echo "ext/pdo_sqlite not found under $$PHP_SRC_DIR"; exit 1; }; \ printf '%s' "$$PDO_SQLITE_DIR" > "$(PDO_SQLITE_DIR_MARKER)" # 2a) Prepare ext/sqlite3 (mv config0.m4, phpize, configure, make) @set -eu; \ SQLITE3_DIR=$$(cat "$(SQLITE3_DIR_MARKER)"); \ if [ -f "$$SQLITE3_DIR/config0.m4" ] && [ ! -f "$$SQLITE3_DIR/config.m4" ]; then \ mv "$$SQLITE3_DIR/config0.m4" "$$SQLITE3_DIR/config.m4"; \ fi; \ cd "$$SQLITE3_DIR" && $(PHPIZE); \ cd "$$SQLITE3_DIR" && env -u DEB_BUILD_MAINT_OPTIONS -u DEB_CFLAGS_MAINT_APPEND \ CFLAGS="$(STANDARD_SQLCIPHER_CFLAGS)" \ LDFLAGS="$(STANDARD_SQLCIPHER_LDFLAGS)" \ ./configure --libdir="$(SQLCIPHER_LIBDIR_ARG)" --with-php-config="$(PHPCONFIG)" $(MAKE) -C "$$(cat "$(SQLITE3_DIR_MARKER)")" # Fix the pic_object in sqlite3.lo so it links to sqlcipher's sqlite3.o @set -eu; \ PHP_SRC_DIR=$$(cat "$(PHP_SRC_MARKER)"); \ sed -i "s|pic_object='.libs/sqlite3.o'|pic_object='.libs/sqlite3.o $(SQLCIPHER_SRC_DIR)/sqlite3.o'|g" \ "$$PHP_SRC_DIR/ext/sqlite3/sqlite3.lo" # Rebuild the sqlite3 extension after the pic_object fix $(MAKE) -C "$$(cat "$(SQLITE3_DIR_MARKER)")" # 3) Build PDO SQLCipher @set -eu; \ PDO_SQLITE_DIR=$$(cat "$(PDO_SQLITE_DIR_MARKER)"); \ mkdir -p "$(PDO_BUILD_DIR)"; \ cp "$$PDO_SQLITE_DIR"/*.c "$$PDO_SQLITE_DIR"/*.h "$(PDO_BUILD_DIR)/"; \ # Bring in sqlcipher amalgamation and config for PDO build cp "$(SQLCIPHER_SRC_DIR)/sqlite3.c" "$(PDO_BUILD_DIR)/sqlite3.c"; \ cp "$(SQLCIPHER_SRC_DIR)/sqlite3.h" "$(PDO_BUILD_DIR)/sqlite3.h"; \ cp "$(SQLCIPHER_SRC_DIR)/sqlite_cfg.h" "$(PDO_BUILD_DIR)/config.h"; \ sed -i '1i#include "config.h"' "$(PDO_BUILD_DIR)/sqlite3.c"; \ cp "$(PDO_SRC_DIR)/config.m4" "$(PDO_BUILD_DIR)/config.m4"; \ cd "$(PDO_BUILD_DIR)" && $(PHPIZE) --clean && $(PHPIZE); \ cd "$(PDO_BUILD_DIR)" && env -u DEB_BUILD_MAINT_OPTIONS -u DEB_CFLAGS_MAINT_APPEND \ CFLAGS="$(STANDARD_SQLCIPHER_CFLAGS)" \ LDFLAGS="$(STANDARD_SQLCIPHER_LDFLAGS)" \ ./configure --libdir="$(SQLCIPHER_LIBDIR_ARG)" --with-php-config="$(PHPCONFIG)" $(MAKE) -C "$(PDO_BUILD_DIR)" override_dh_auto_install: @set -eu; \ SQLITE3_DIR=$$(cat "$(SQLITE3_DIR_MARKER)"); \ install -D -m 0644 "$$SQLITE3_DIR/modules/sqlite3.so" "$(EXTDIR)/sqlite3.so"; \ install -D -m 0644 "$(PDO_BUILD_DIR)/modules/pdo_sqlite.so" "$(EXTDIR)/pdo_sqlite.so"; \ # Install .ini so dh-php can enable them across SAPIs install -D -m 0644 debian/sqlite3.ini "debian/$(PACKAGE)/usr/share/$(PACKAGE)/sqlite3/sqlite3.ini"; \ install -D -m 0644 debian/pdo_sqlite.ini "debian/$(PACKAGE)/usr/share/$(PACKAGE)/sqlite3/pdo_sqlite.ini" override_dh_installexamples: dh_installexamples --sourcedir=. override_dh_missing: dh_missing --fail-missing override_dh_auto_clean: rm -rf "$(PHP_SRC_MARKER)" "$(SQLITE3_DIR_MARKER)" "$(PDO_SQLITE_DIR_MARKER)"