PREFIX  ?= /usr
DESTDIR ?=
# Rust target triple. Empty builds for this machine, into target/release.
RUST_TARGET ?=

CARGO_FLAGS = --release $(if $(RUST_TARGET),--target $(RUST_TARGET))
RELEASE_DIR = target/$(if $(RUST_TARGET),$(RUST_TARGET)/)release

BINDIR    = $(DESTDIR)$(PREFIX)/bin
APPSDIR   = $(DESTDIR)$(PREFIX)/share/applications
ICONSDIR  = $(DESTDIR)$(PREFIX)/share/icons/hicolor/scalable/apps
METAINFODIR = $(DESTDIR)$(PREFIX)/share/metainfo

LAUNCH    = LTK_THEMES_DIR=$(CURDIR)/../ltk/themes $(CURDIR)/target/release/eydos-trust

WINDOWS_TARGET   = x86_64-pc-windows-msvc
WINDOWS_RELEASE  = target/$(WINDOWS_TARGET)/release
WINDOWS_DIST    ?= target/windows/eydos-trust
# Debian packages no std for Windows, so it is compiled from rust-src.
WINDOWS_XWIN     = cargo xwin build --release --target $(WINDOWS_TARGET) -Zbuild-std=std,panic_abort
LLVM_BIN        ?= /usr/lib/llvm-19/bin
LTK_WEBKIT_DIR  ?= ../ltk-webkit
LTK_SHARE       ?= /usr/share/ltk
# Where cef-dll-sys keeps the CEF distribution it downloads, so `make clean` does not fetch it again.
CEF_PATH        ?= $(HOME)/.cache/cef

FLATPAK_ID              = io.eydos.Trust
FLATPAK_MANIFEST        = flatpak/$(FLATPAK_ID).yml
FLATPAK_REPO           ?= flatpak/repo
# From https://github.com/flatpak/flatpak-builder-tools, under cargo/.
FLATPAK_CARGO_GENERATOR ?= flatpak-cargo-generator.py
FLATPAK_BRANCH         ?= stable
# Clients verify every commit, so the key has to be set when building too, not only when publishing.
FLATPAK_GPG_KEY        ?=
FLATPAK_GPG_HOME       ?=
FLATPAK_GPG_FLAGS       = $(if $(FLATPAK_GPG_KEY),--gpg-sign=$(FLATPAK_GPG_KEY) $(if $(FLATPAK_GPG_HOME),--gpg-homedir=$(FLATPAK_GPG_HOME)))
# rsync destination of the repository, e.g. user@host:/srv/flatpak/repo
FLATPAK_REMOTE         ?=
# rsync source of another machine's build repository, e.g. build-arm64.eydos.io:git/trust/flatpak/repo
FLATPAK_IMPORT         ?=
FLATPAK_IMPORT_ARCH    ?= aarch64
# Extra flatpak-builder flags, e.g. --jobs=N, --arch=aarch64.
FLATPAK_BUILDER_FLAGS  ?=
FLATPAK_BUILDER         = flatpak-builder --force-clean --state-dir=flatpak/.flatpak-builder --repo=$(FLATPAK_REPO) --default-branch=$(FLATPAK_BRANCH) $(FLATPAK_GPG_FLAGS) $(FLATPAK_BUILDER_FLAGS)

.PHONY: all arm64 arm64-deps windows windows-deps windows-dist run start start-desktop install uninstall deb deb-arm64 flatpak-deps flatpak flatpak-install flatpak-bundle flatpak-import flatpak-publish clean distclean

all:
	cargo build $(CARGO_FLAGS)

arm64: export CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER = aarch64-linux-gnu-gcc
arm64: export PKG_CONFIG = aarch64-linux-gnu-pkg-config
arm64: export PKG_CONFIG_ALLOW_CROSS = 1
arm64:
	$(MAKE) all RUST_TARGET=aarch64-unknown-linux-gnu

arm64-deps:
	sudo dpkg --add-architecture arm64
	sudo apt-get update
	sudo apt-get install -y crossbuild-essential-arm64 libstd-rust-dev:arm64 libwayland-dev:arm64 libxkbcommon-dev:arm64 libegl-dev:arm64 libgles2-mesa-dev:arm64 libwpewebkit-2.0-dev:arm64 libwpe-1.0-dev:arm64 libsqlite3-dev:arm64

windows-deps:
	sudo apt-get install -y clang lld llvm cmake ninja-build rust-src
	cargo install --locked cargo-xwin

windows: export PATH := $(LLVM_BIN):$(PATH)
windows: export RUSTC_BOOTSTRAP = 1
windows: export CARGO_TARGET_DIR = $(CURDIR)/target
windows: export CEF_PATH := $(CEF_PATH)
windows:
	$(WINDOWS_XWIN)
	$(WINDOWS_XWIN) --manifest-path $(LTK_WEBKIT_DIR)/Cargo.toml --bin ltk-webkit-helper

# The folder to copy to Windows: the executables, CEF's runtime beside them, and ltk's resource bundle.
windows-dist: windows
	rm -rf $(WINDOWS_DIST)
	install -d $(WINDOWS_DIST)/ltk/themes $(WINDOWS_DIST)/ltk/fonts $(WINDOWS_DIST)/ltk/mime
	cp $(WINDOWS_RELEASE)/eydos-trust.exe $(WINDOWS_RELEASE)/ltk-webkit-helper.exe $(WINDOWS_DIST)/
	cp $(WINDOWS_RELEASE)/*.dll $(WINDOWS_RELEASE)/*.pak $(WINDOWS_RELEASE)/*.dat $(WINDOWS_RELEASE)/*.bin $(WINDOWS_RELEASE)/vk_swiftshader_icd.json $(WINDOWS_DIST)/
	cp -r $(WINDOWS_RELEASE)/locales $(WINDOWS_DIST)/
	cp -r $(LTK_SHARE)/themes/default $(WINDOWS_DIST)/ltk/themes/
	cp -r $(LTK_SHARE)/keyboards $(WINDOWS_DIST)/ltk/
	cp /usr/share/mime/globs2 $(WINDOWS_DIST)/ltk/mime/
	grep -ohE '/usr/share/fonts/[^"]+' $(LTK_SHARE)/themes/default/theme.json | sort -u | xargs cp -t $(WINDOWS_DIST)/ltk/fonts/

run: all
	$(LAUNCH)

start: all
	$(LAUNCH) --mode mobile

start-desktop: all
	$(LAUNCH) --mode desktop

install:
	install -Dm755 $(RELEASE_DIR)/eydos-trust  $(BINDIR)/eydos-trust
	install -Dm644 data/io.eydos.Trust.desktop $(APPSDIR)/io.eydos.Trust.desktop
	install -Dm644 res/trust-app-icon.svg      $(ICONSDIR)/io.eydos.Trust.svg
	install -Dm644 data/io.eydos.Trust.metainfo.xml $(METAINFODIR)/io.eydos.Trust.metainfo.xml

uninstall:
	rm -f $(BINDIR)/eydos-trust
	rm -f $(APPSDIR)/io.eydos.Trust.desktop
	rm -f $(ICONSDIR)/io.eydos.Trust.svg
	rm -f $(METAINFODIR)/io.eydos.Trust.metainfo.xml

# `deb-arm64` cross-builds the arm64 package from amd64; see `make arm64-deps`.
deb:
	dpkg-buildpackage -us -uc -b

deb-arm64:
	dpkg-buildpackage -us -uc -b -a arm64

flatpak-deps:
	sudo apt-get install -y flatpak-builder
	flatpak install -y flathub org.freedesktop.Sdk//25.08 org.freedesktop.Sdk.Extension.rust-stable//25.08

Cargo.lock:
	cargo generate-lockfile

# The Flatpak build has no network: every crate in Cargo.lock becomes a source.
flatpak/cargo-sources.json: Cargo.lock
	$(FLATPAK_CARGO_GENERATOR) $< -o $@

# Builds ../ltk and ../ltk-webkit as they are on disk, and WPE WebKit from source.
flatpak: flatpak/cargo-sources.json
	$(FLATPAK_BUILDER) flatpak/build $(FLATPAK_MANIFEST)

flatpak-install: flatpak/cargo-sources.json
	$(FLATPAK_BUILDER) --user --install flatpak/build $(FLATPAK_MANIFEST)

flatpak-bundle:
	flatpak build-bundle $(FLATPAK_REPO) eydos-trust.flatpak $(FLATPAK_ID) $(FLATPAK_BRANCH)

# Merges another machine's unsigned build as fresh commits signed here, so the key never leaves this machine.
flatpak-import:
	@test -n "$(FLATPAK_GPG_KEY)" || { echo "FLATPAK_GPG_KEY is not set" >&2; exit 1; }
	@test -n "$(FLATPAK_IMPORT)"  || { echo "FLATPAK_IMPORT is not set" >&2; exit 1; }
	@test -d $(FLATPAK_REPO)/objects || { echo "$(FLATPAK_REPO) does not exist yet: run 'make flatpak' first" >&2; exit 1; }
	rsync -a --delete $(FLATPAK_IMPORT)/ flatpak/import/
	refs=$$(cd flatpak/import/refs/heads && find . -type f -path '*/$(FLATPAK_IMPORT_ARCH)/*' | sed 's|^\./||'); \
	test -n "$$refs" || { echo "no $(FLATPAK_IMPORT_ARCH) refs in $(FLATPAK_IMPORT)" >&2; exit 1; }; \
	flatpak build-commit-from --src-repo=flatpak/import --untrusted --no-update-summary $(FLATPAK_GPG_FLAGS) $(FLATPAK_REPO) $$refs

# Publishes what $(FLATPAK_REPO) holds; it does not rebuild. Objects go up before the summary that names them.
flatpak-publish:
	@test -n "$(FLATPAK_GPG_KEY)" || { echo "FLATPAK_GPG_KEY is not set" >&2; exit 1; }
	@test -n "$(FLATPAK_REMOTE)"  || { echo "FLATPAK_REMOTE is not set" >&2; exit 1; }
	flatpak build-update-repo $(FLATPAK_REPO) --default-branch=$(FLATPAK_BRANCH) --generate-static-deltas --prune $(FLATPAK_GPG_FLAGS)
	rsync -a --ignore-existing $(FLATPAK_REPO)/objects $(FLATPAK_REPO)/deltas $(FLATPAK_REMOTE)/
	rsync -a --delete $(FLATPAK_REPO)/ $(FLATPAK_REMOTE)/

clean:
	cargo clean

distclean: clean
	rm -f Cargo.lock flatpak/cargo-sources.json eydos-trust.flatpak
	rm -rf flatpak/build flatpak/repo flatpak/import flatpak/.flatpak-builder
	dh_clean
