# kappa — build convenience Makefile
#
# Targets:
#   build        — default build (build/)
#   debug        — Debug build (build-debug/)
#   release      - Release build (build-release/)
#   dist         - tar.zst tarball of the release build (requires zstd)
#   dist-clean   - remove everything under dist/
#
# Overridable: make release CXX=g++ GENERATOR="Unix Makefiles"

CC        ?= clang
CXX       ?= clang++
GENERATOR ?= Ninja

BUILD_DIR    ?= build
DEBUG_DIR    ?= build-debug
RELEASE_DIR  ?= build-release
DIST_DIR     ?= dist

GIT_COMMIT := $(shell git rev-parse --short HEAD 2>/dev/null || echo unknown)
GIT_TAG    := $(shell git describe --tags --abbrev=0 2>/dev/null || echo 0.1.0)
STAMP      := $(shell date +%Y-%M)
DIST_NAME  := kappa-$(GIT_COMMIT)-$(GIT_TAG)-$(STAMP)

CMAKE := cmake

.PHONY: build debug release dist dist-clean

build:
	$(CMAKE) -S . -B $(BUILD_DIR) -G $(GENERATOR) \
		-DCMAKE_C_COMPILER=$(CC) -DCMAKE_CXX_COMPILER=$(CXX)
	$(CMAKE) --build $(BUILD_DIR)

debug:
	$(CMAKE) -S . -B $(DEBUG_DIR) -G $(GENERATOR) \
		-DCMAKE_BUILD_TYPE=Debug \
		-DCMAKE_C_COMPILER=$(CC) -DCMAKE_CXX_COMPILER=$(CXX)
	$(CMAKE) --build $(DEBUG_DIR)

release:
	$(CMAKE) -S . -B $(RELEASE_DIR) -G $(GENERATOR) \
		-DCMAKE_BUILD_TYPE=Release \
		-DCMAKE_C_COMPILER=$(CC) -DCMAKE_CXX_COMPILER=$(CXX)
	$(CMAKE) --build $(RELEASE_DIR)

dist: release
	rm -rf $(DIST_DIR)/$(DIST_NAME)
	$(CMAKE) --install $(RELEASE_DIR) --prefix $(DIST_DIR)/$(DIST_NAME)
	tar --zstd -cf $(DIST_DIR)/$(DIST_NAME).tar.zst -C $(DIST_DIR) $(DIST_NAME)
	rm -rf $(DIST_DIR)/$(DIST_NAME)
	@echo "dist: $(DIST_DIR)/$(DIST_NAME).tar.zst"

dist-clean:
	rm -rf $(DIST_DIR)
