diff --git a/tools/run-clang-tidy.sh b/tools/run-clang-tidy.sh new file mode 100755 index 0000000000..c9f1cb4cd0 --- /dev/null +++ b/tools/run-clang-tidy.sh @@ -0,0 +1,63 @@ +#!/usr/bin/env bash + +# run-clang-tidy.sh - Clang-tidy runner +# Usage: ./run-clang-tidy.sh [-j N] [--dry-run] [--no-fix] + +# NOTE: This was mostly generated by Claude Sonnet 4 + +set -euo pipefail + +# Change to project root directory +cd "$(dirname "$0")/.." + +# Parse options +DRY_RUN=false +FIX=true + +for arg in "$@"; do + case $arg in + --dry-run) DRY_RUN=true ;; + --no-fix) FIX=false ;; + esac +done + +# Configuration +BUILD_DIR="./build" +INCLUDES=( + "-I./include" + "-I./src" + "-I./third_party/shared_mutex" + "-I$BUILD_DIR" + "-I./rocm_smi/include" + "-I./esmi_ib_library/include" + "-I./tests/amd_smi_test" +) + +ARGS=("--header-filter=.*") +[[ "$FIX" == true ]] && ARGS+=("--fix") + +# Fail if build dir doesn't exist +if ! test -d "$BUILD_DIR"; then + echo "Error: Build directory '$BUILD_DIR' does not exist. Please run the build first." + exit 1 +fi + +# Find all source files +mapfile -t FILES < <( + find . \( -name build -o -name .git -o -path "./src/aca-decode" -o -path "./esmi_ib_library" -o -path "./rocm_smi/include/rocm_smi/kfd_ioctl.h" \) -prune -o \ + \( -name "*.cc" -o -name "*.cpp" -o -name "*.c" \) -print +) + +# Dry run - show what would be processed +if [[ "$DRY_RUN" == true ]]; then + printf '%s\n' "${FILES[@]}" + echo "Would process ${#FILES[@]} files" + exit 0 +fi + +# Run clang-tidy +printf '%s\0' "${FILES[@]}" | \ + xargs -0 -I{} \ + clang-tidy "${ARGS[@]}" {} -- "${INCLUDES[@]}" -std=c++17 + +echo "Processed ${#FILES[@]} files"