KVCS_EFC_DIR  ?= ../../../kvcs-efc
KVCS_SDK_DIR  ?= ..
EFC_BUILD_DIR  := $(abspath $(KVCS_EFC_DIR)/build)
SDK_PYTHON_DIR := $(abspath $(KVCS_SDK_DIR))

# libkvcs.so search order: kvcs-efc/build (source tree), then the binding copy (tarball).
LIBKVCS_SO ?= $(if $(wildcard $(EFC_BUILD_DIR)/libkvcs.so),$(EFC_BUILD_DIR)/libkvcs.so,$(SDK_PYTHON_DIR)/kvcs/libkvcs.so)
# CI image ships python3 = 3.6 (AliOS 7); kvcs needs >=3.9. Prefer python3.9.
PYTHON ?= $(shell command -v python3.9 >/dev/null 2>&1 && echo python3.9 || echo python3)
PIP    ?= $(PYTHON) -m pip

E2E_COMPOSE ?= ../../../kvcs-test/runtimes/data-plane-e2e/docker-compose.yaml
BENCH_ARGS  ?= --low-level --duration 10 --batches 4 --batch-size 32

.PHONY: unittest run run-docker wheel clean help

unittest: ## Run bench unit tests (no libkvcs.so needed)
	PYTHONPATH=$(SDK_PYTHON_DIR):. $(PYTHON) -m pytest tests/ -v

run: ## Run bench on the host (physical machine)
	PYTHONPATH=$(SDK_PYTHON_DIR):$$PYTHONPATH \
	LD_LIBRARY_PATH=$(EFC_BUILD_DIR):$$LD_LIBRARY_PATH \
	$(PYTHON) kvcs_bench/bench.py $(BENCH_ARGS)

run-docker: ## Run bench inside EFC container (for CI)
	docker compose -f $(E2E_COMPOSE) exec kvcs-efc-1 \
		bash -c "PYTHONPATH=/kvcs-efc-rt/kvcs-sdk/python \
		LD_LIBRARY_PATH=/kvcs-efc-rt/kvcs-efc/build \
		python3 /kvcs-efc-rt/kvcs-sdk/python/bench/kvcs_bench/bench.py $(BENCH_ARGS)"

# Stage the vendored binding into kvcs_bench/_sdk (libkvcs.so next to _capi.py,
# where the loader looks); the kvcs_bench package itself is committed source.
wheel: ## Build self-contained kvcs_bench wheel (bench + vendored binding + libkvcs.so)
	rm -rf kvcs_bench/_sdk dist build kvcs_bench.egg-info
	cp -r ../kvcs kvcs_bench/_sdk
	cp $(LIBKVCS_SO) kvcs_bench/_sdk/libkvcs.so
	$(PIP) wheel --no-deps -w dist .
	rm -rf kvcs_bench/_sdk build kvcs_bench.egg-info

clean:
	rm -rf kvcs_bench/_sdk dist build kvcs_bench.egg-info

help: ## Show this help
	@grep -E '^[a-z].*:.*##' $(MAKEFILE_LIST) | sed 's/:.*## /\t/' | sort
