脚本内容:
#!/bin/bash
############################################################
# Usage:
# clang_tidy.sh BAZEL_TARGET
############################################################
set -e
function join_by { local IFS="$1"; shift; echo "$*"; }
SOURCE_DIR=$(dirname "${BASH_SOURCE[0]}")
BAZEL_TARGET=$1
if [ -z "$BAZEL_TARGET" ]; then
echo "Script requires a bazel target as argument"
echo "For example:"
echo " bash ${BASH_SOURCE[0]} //nnrt:nnrt"
exit 1
fi
shift
export PATH=$PATH:$SOURCE_DIR/bin
if [ -z "${CLANG_TIDY:=$(which run-clang-tidy.py)}" ]; then
echo "Unable to find clang-tidy" 1>&2
exit 1
fi
############################################################
# Add excluded checks
############################################################
EXCLUDED_CHECKS="
-android-cloexec-fopen \
-llvm-include-order
"
############################################################
JOINED_CHECKS=$(join_by , $EXCLUDED_CHECKS)
JOINED_CHECKS="*,${JOINED_CHECKS}"
TIME=$(date '+%Y-%m-%d-%H-%M-%S')
TARGET_NAME=${BAZEL_TARGET//[\/:]/_}
LOG_FILE_PREFIX="clang-tidy_${TARGET_NAME}_${TIME}"
LOG_FILE_NAME="${LOG_FILE_PREFIX}.log"
STAT_LOG_FILE_NAME="${LOG_FILE_PREFIX}_stat.log"
# generate compilation database
OLD_MODE=$(stat -c '%a' $SOURCE_DIR/generate_compilation_database.sh)
chmod +x $SOURCE_DIR/generate_compilation_database.sh
$SOURCE_DIR/generate_compilation_database.sh $BAZEL_TARGET
chmod $OLD_MODE $SOURCE_DIR/generate_compilation_database.sh
cmd="$CLANG_TIDY -extra-arg=-ferror-limit=0 -checks=${JOINED_CHECKS} -p $(bazel info execution_root) $@"
echo "Saving clang-tidy log to ${LOG_FILE_NAME}"
set +e
$cmd > "${LOG_FILE_NAME}" 2>&1
set -e
if [ ! -e ${LOG_FILE_NAME} ]; then
echo "Cannot find ${LOG_FILE_NAME}"
exit 1
fi
echo '==================== Warnings ===================='
cat "${LOG_FILE_NAME}" | grep warning: | grep -oE '[^ ]+$' | sort | uniq -c | tee "${STAT_LOG_FILE_NAME}"
echo '==================== Errors ===================='
cat "${LOG_FILE_NAME}" | grep error: | grep -oE '[^ ]+$' | sort | uniq -c | tee -a "${STAT_LOG_FILE_NAME}"
echo "Done - Find log in ${LOG_FILE_NAME} and ${STAT_LOG_FILE_NAME}"