# ── variables ────────────────────────────────────────────────────────────── image := "ptt-builder" build_dir := "build" # podman takes priority over docker engine := `command -v podman 2>/dev/null \ || command -v docker 2>/dev/null \ || { echo "error: podman or docker required" >&2; exit 1; }` # user-namespace mapping: podman rootless vs docker user_ns := `command -v podman >/dev/null 2>&1 \ && echo "--userns=keep-id" \ || echo "--user $(id -u):$(id -g)"` # ── recipes ──────────────────────────────────────────────────────────────── # build container image (only rebuilt when Dockerfile changes) image-build: {{engine}} build -t {{image}} . # compile firmware inside the container build: image-build {{engine}} run --rm \ {{user_ns}} \ -v "{{justfile_directory()}}:/src:z" \ {{image}} \ sh -c "cmake -B /src/{{build_dir}} -G Ninja \ -DCMAKE_BUILD_TYPE=MinSizeRel /src \ && ninja -C /src/{{build_dir}}" # flash firmware via pyocd on the host (requires USB / DAPLink) flash: build pyocd flash --target nrf52840 {{build_dir}}/firmware.hex # start GDB server for debugging gdbserver: pyocd gdbserver --target nrf52840 --port 3333 # remove build artifacts clean: rm -rf {{build_dir}} # remove build artifacts AND the container image clean-all: clean {{engine}} rmi {{image}} 2>/dev/null || true