REGISTRY ?= /usr/share/cargo/registry/ltk
DOCDIR   ?= /usr/share/doc/libltk-doc/html

# The Android build uses Debian's own packages: rustc and rust-src of the
# same version, whose std `-Zbuild-std` compiles for the target, and the NDK
# that google-android-ndk-r27c-installer (non-free) unpacks.
NDK            ?= /usr/lib/android-sdk/ndk/27.2.12479018
ANDROID_API    ?= 26
ANDROID_TARGET ?= aarch64-linux-android
NDK_BIN         = $(NDK)/toolchains/llvm/prebuilt/linux-x86_64/bin
NDK_CC          = $(NDK_BIN)/$(ANDROID_TARGET)$(ANDROID_API)-clang
ANDROID_ENV     = RUSTC_BOOTSTRAP=1 \
	CC_$(subst -,_,$(ANDROID_TARGET))=$(NDK_CC) \
	CXX_$(subst -,_,$(ANDROID_TARGET))=$(NDK_CC)++ \
	AR_$(subst -,_,$(ANDROID_TARGET))=$(NDK_BIN)/llvm-ar \
	CARGO_TARGET_$(shell echo $(ANDROID_TARGET) | tr a-z- A-Z_)_LINKER=$(NDK_CC)
ANDROID_CARGO   = -Zbuild-std=std,panic_abort --target $(ANDROID_TARGET) --no-default-features --features android
# Where `android-assets` writes the `ltk/` tree an APK carries under `assets/`.
ANDROID_ASSETS ?= target/android/assets
# The example APK, packaged with aapt, zipalign, apksigner and
# android-framework-res, and installed with adb (android-sdk-platform-tools).
ANDROID_ABI    ?= arm64-v8a
ANDROID_APK    ?= target/android/ltk-hello.apk

# The browser build uses Debian's std for wasm32 (libstd-rust-dev-wasm32) and
# wasm-bindgen-cli, which Debian does not package and whose version must be
# the one of the wasm-bindgen crate ltk pins.
WEB_TARGET      = wasm32-unknown-unknown
WEB_CARGO       = --target $(WEB_TARGET) --no-default-features --features web
WEB_OUT        ?= target/web
# web_hello runs alone on a page; web_shell needs forge/web, whose `make hello` serves both.
WEB_EXAMPLES    = web_hello web_shell
# Fallback fonts a page bundles beyond the theme's, for text Sora does not
# cover: Cyrillic, Greek and extended Latin, symbols, arrows and box drawing.
WEB_FONTS      ?= $(wildcard /usr/share/fonts/truetype/noto/NotoSans-Regular.ttf /usr/share/fonts/truetype/dejavu/DejaVuSans.ttf /usr/share/fonts/truetype/noto/NotoSansSymbols2-Regular.ttf)
# Where web-deps installs wasm-bindgen-cli, so nothing needs to be on PATH;
# one already on PATH is used when there is none here.
WEB_TOOLS        = target/tools
WASM_BINDGEN    ?= $(or $(wildcard $(WEB_TOOLS)/bin/wasm-bindgen),$(shell command -v wasm-bindgen 2>/dev/null))

# The Windows build, like the Android one, compiles std from Debian's rust-src
# with `-Zbuild-std`, since Debian packages no std for the target, and links
# with MinGW (gcc-mingw-w64-x86-64).
WINDOWS_TARGET ?= x86_64-pc-windows-gnu
WINDOWS_ENV     = RUSTC_BOOTSTRAP=1 \
	CC_$(subst -,_,$(WINDOWS_TARGET))=x86_64-w64-mingw32-gcc \
	AR_$(subst -,_,$(WINDOWS_TARGET))=x86_64-w64-mingw32-ar \
	CARGO_TARGET_$(shell echo $(WINDOWS_TARGET) | tr a-z- A-Z_)_LINKER=x86_64-w64-mingw32-gcc
WINDOWS_CARGO   = -Zbuild-std=std,panic_abort --target $(WINDOWS_TARGET) --no-default-features --features windows

# Targets are recipes, not files. Listing them as PHONY tells make to
# ignore filesystem entries with the same name — without this `examples`
# silently no-ops because the `examples/` directory exists, and `doc`
# would do the same once `target/doc` is around.
.PHONY: all deps android-deps test doctest-md stylecheck clippy audit doc install examples clean distclean android-check android-assets android-apk android-install windows-deps windows-check web-deps web-check web-assets web-example web-serve

all:
	cargo build --release

# What building, testing and linting need, from Debian.
deps:
	sudo apt-get install -y cargo rustc rust-clippy pkg-config libwayland-dev libegl-dev libxkbcommon-dev

# What the android-* targets need, from Debian: std's sources for -Zbuild-std,
# the NDK installer (non-free), the APK tools, rsvg-convert for SVG icons, javac, dx and
# android.jar (non-free) for the keep-alive service, and adb.
android-deps:
	sudo apt-get install -y rust-src google-android-ndk-r27c-installer aapt zipalign apksigner android-framework-res librsvg2-bin default-jdk-headless art-standalone google-android-platform-34-installer android-sdk-platform-tools

test:
	cargo test --features test-support

# Typecheck the `no_run` snippets in docs/*.md by feeding each markdown
# file to `rustdoc --test`. Catches API drift in cookbook + widget
# reference: drops a renamed builder, removed function, etc. surface
# here just like `cargo test --doc` does for in-source doctests.
doctest-md:
	./scripts/doctest-md.sh

# Mechanical style checks (tabs, attribute-bracket spacing) — the
# grep-verifiable subset of code_style_guide.md.
stylecheck:
	./scripts/style-check.sh

# Semantic lints, mirroring the CI invocation. Warnings are errors so a
# local run predicts the CI verdict.
clippy:
	cargo clippy --workspace --all-targets --features test-support -- -D warnings

# Typecheck the Android backend. Needs rust-src and the NDK (see NDK above).
android-check:
	@test -x $(NDK_CC) || { echo "No NDK compiler at $(NDK_CC); install google-android-ndk-r27c-installer or set NDK="; exit 1; }
	$(ANDROID_ENV) cargo check $(ANDROID_CARGO)

# The in-tree default theme and the fonts it names, as an APK carries them.
android-assets:
	./scripts/android-assets.sh $(ANDROID_ASSETS) themes default

# examples/android_hello.rs as an APK, with the in-tree default theme.
android-apk: android-assets
	@test -x $(NDK_CC) || { echo "No NDK compiler at $(NDK_CC); install google-android-ndk-r27c-installer or set NDK="; exit 1; }
	$(ANDROID_ENV) cargo build --release --example android_hello $(ANDROID_CARGO)
	ANDROID_ABI=$(ANDROID_ABI) MIN_SDK=$(ANDROID_API) ./scripts/android-apk.sh $(ANDROID_APK) \
		target/$(ANDROID_TARGET)/release/examples/libandroid_hello.so net.liberux.ltk.Hello "ltk hello" $(ANDROID_ASSETS)

android-install: android-apk
	adb install -r $(ANDROID_APK)

# What the windows-* targets need, from Debian: std's sources for -Zbuild-std and MinGW.
windows-deps:
	sudo apt-get install -y rust-src gcc-mingw-w64-x86-64

# Typecheck the Windows backend.
windows-check:
	$(WINDOWS_ENV) cargo check $(WINDOWS_CARGO)

# What the web-* targets need: Debian's std for wasm32, and wasm-bindgen-cli at the version ltk pins, which scripts/wasm-bindgen-cli.sh builds.
web-deps:
	sudo apt-get install -y libstd-rust-dev-wasm32 curl
	./scripts/wasm-bindgen-cli.sh $(WEB_TOOLS)

# Typecheck the browser backend.
web-check:
	cargo check $(WEB_CARGO)

# The in-tree default theme, the fonts it names and $(WEB_FONTS), as a page serves them.
web-assets:
	EXTRA_FONTS="$(WEB_FONTS)" ./scripts/web-assets.sh $(WEB_OUT) themes default

# examples/web_hello.rs as a page under $(WEB_OUT), with its resources.
web-example: web-assets
	@test -n "$(WASM_BINDGEN)" || { echo "No wasm-bindgen in $(WEB_TOOLS)/bin or on PATH; run make web-deps"; exit 1; }
	cargo build --release $(addprefix --example ,$(WEB_EXAMPLES)) $(WEB_CARGO)
	for example in $(WEB_EXAMPLES); do \
		$(WASM_BINDGEN) --target web --no-typescript --out-dir $(WEB_OUT)/pkg target/$(WEB_TARGET)/release/examples/$$example.wasm || exit 1; \
	done
	cp web/index.html $(WEB_OUT)/

web-serve: web-example
	cd $(WEB_OUT) && python3 -m http.server 8000

audit:
	@command -v cargo-audit >/dev/null 2>&1 || cargo install cargo-audit --locked
	cargo audit

doc:
	cargo doc --no-deps

install: doc
	install -d $(REGISTRY)
	cp -r src benches examples locales protocols keyboards scripts java web build.rs Cargo.toml liberux.toml $(REGISTRY)/
	cp debian/cargo-checksum.json $(REGISTRY)/.cargo-checksum.json
	install -d $(DOCDIR)
	cp -r target/doc/* $(DOCDIR)/

examples:
	LTK_THEMES_DIR=themes cargo run --release --example showcase
	LTK_THEMES_DIR=themes cargo run --release --example responsive
	LTK_THEMES_DIR=themes cargo run --release --example inputs
	LTK_THEMES_DIR=themes cargo run --release --example scroll
	LTK_THEMES_DIR=themes cargo run --release --example sliders
	LTK_THEMES_DIR=themes cargo run --release --example combo
	LTK_THEMES_DIR=themes cargo run --release --example mini_shell
	LTK_THEMES_DIR=themes cargo run --release --example widgets
	LTK_THEMES_DIR=themes cargo run --release --example pickers
	LTK_THEMES_DIR=themes cargo run --release --example dialog
	LTK_THEMES_DIR=themes cargo run --release --example carousel
	LTK_THEMES_DIR=themes cargo run --release --example clip_path
	LTK_THEMES_DIR=themes cargo run --release --example tab_strip
	LTK_THEMES_DIR=themes cargo run --release --example file_chooser

clean:
	dh_clean
	cargo clean
	rm -rf target

distclean: clean
	rm -f Cargo.lock
