# 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)"` src_files := "find /src/src /src/include -name '*.c' -o -name '*.h'" # 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}}" # reformat all source files in-place with clang-format format: image-build {{engine}} run --rm \ {{user_ns}} \ -v "{{justfile_directory()}}:/src:z" \ {{image}} \ sh -c "{{src_files}} | xargs clang-format -i --style=file:/src/.clang-format" # check formatting without modifying files (used in CI) format-check: image-build {{engine}} run --rm \ {{user_ns}} \ -v "{{justfile_directory()}}:/src:z" \ {{image}} \ sh -c "{{src_files}} | xargs clang-format --dry-run --Werror --style=file:/src/.clang-format" # static analysis with cppcheck lint: image-build {{engine}} run --rm \ {{user_ns}} \ -v "{{justfile_directory()}}:/src:z" \ {{image}} \ sh -c "cppcheck --error-exitcode=1 \ --enable=warning,style,performance,portability \ --suppress=missingInclude \ --inline-suppr \ --std=c11 \ -I /src/include \ /src/src/" # generate HTML documentation with Doxygen docs: image-build {{engine}} run --rm \ {{user_ns}} \ -v "{{justfile_directory()}}:/src:z" \ {{image}} \ sh -c "cd /src && doxygen Doxyfile" # 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 and generated docs clean: rm -rf {{build_dir}} docs # remove build artifacts, docs AND the container image clean-all: clean {{engine}} rmi {{image}} 2>/dev/null || true