.PHONY: help deps-debug deps-release deps-cross build build-debug build-release build-install test test-debug test-all asan msan fuzz fuzz-smoke fuzz-long integration install install-smoke package package-source package-source-smoke package-checksums package-verify verify-release-archives verify-release-privacy release-matrix finalize-slice prerelease prerelease-hardening release print-release-version format clean clean-dist

BUILD_DIR := build/debug
PREFIX ?= /usr/local

help:
	@printf '%s\n' \
	  'Targets:' \
	  '  make build                 Configure and build debug binaries' \
	  '  make build-install         Build host static xws for sudo make install' \
	  '  make test                  Run debug tests' \
	  '  make asan                  Run ASan/UBSan tests' \
	  '  make msan                  Run MSan tests when clang supports it' \
	  '  make fuzz-smoke           Run bounded libFuzzer smoke tests' \
	  '  make integration          Run live X11 workspace integration test' \
	  '  make install              Install prebuilt host static xws under PREFIX/bin' \
	  '  make package              Build release artifacts for available Linux targets' \
	  '  make package-verify       Verify checksums, layouts, ELF metadata, and privacy' \
	  '  make release-matrix       Package and verify all available Linux release targets' \
	  '  make prerelease           Run deterministic local release gates' \
	  '  make prerelease-hardening Run prerelease plus release matrix' \
	  '  make release              Clean, build release artifacts, and verify them' \
	  '  make clean                Remove generated build, cache, and dist output'

deps-debug:
	@printf 'xwmshim uses the host C toolchain and no vendored debug dependencies.\n'

deps-release:
	@printf 'Release builds use configured Linux compilers from CMake presets.\n'

deps-cross:
	@scripts/run_linux_release_matrix.sh --check-tools

build: build-debug build-install

build-debug:
	cmake --preset debug
	cmake --build --preset debug

build-release:
	cmake --preset x86_64-linux-gnu-release
	cmake --build --preset x86_64-linux-gnu-release

build-install:
	scripts/build_host_xws.sh

test: test-debug

test-debug: build-debug
	ctest --preset debug

test-all: test-debug asan msan

asan:
	cmake --preset asan
	cmake --build --preset asan
	ctest --preset asan

msan:
	cmake --preset msan
	cmake --build --preset msan
	ctest --preset msan

fuzz-smoke:
	cmake --preset fuzz
	cmake --build --preset fuzz
	scripts/fuzz.sh smoke

fuzz:
	cmake --preset fuzz
	cmake --build --preset fuzz
	scripts/fuzz.sh normal

fuzz-long:
	cmake --preset fuzz
	cmake --build --preset fuzz
	scripts/fuzz.sh long

integration: build-debug
	tests/test_workspace_integration.sh

install:
	scripts/install_xws.sh "$(PREFIX)" "$(DESTDIR)"

install-smoke:
	scripts/test_install_xws.sh

package:
	scripts/package.sh

package-source:
	scripts/package.sh --source-only

package-source-smoke: package-source
	scripts/test_release_from_source.sh

package-checksums:
	scripts/package.sh --checksums-only

package-verify:
	scripts/package-verify.sh

verify-release-archives: package-verify

verify-release-privacy:
	scripts/verify_release_privacy.sh

release-matrix:
	scripts/run_linux_release_matrix.sh

finalize-slice: build-debug test-debug

prerelease: test-all fuzz-smoke install-smoke package-source-smoke package-checksums package-verify

prerelease-hardening: prerelease release-matrix

release: clean
	scripts/run_linux_release_matrix.sh

print-release-version:
	@scripts/release_version.sh

format:
	clang-format -i src/*.c src/*.h tests/*.c fuzz/*.c

clean:
	scripts/clean.sh

clean-dist:
	rm -rf dist
