Add clang-tidy.sh am: ecfe10a574
Original change: https://android-review.googlesource.com/c/platform/prebuilts/clang/host/darwin-x86/+/2110845
Change-Id: I3e5a29c41f5ac114b1347d654266ec2a72f71eb5
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
diff --git a/clang-r450784e/bin/clang-tidy.sh b/clang-r450784e/bin/clang-tidy.sh
new file mode 100755
index 0000000..1b6ecdc
--- /dev/null
+++ b/clang-r450784e/bin/clang-tidy.sh
@@ -0,0 +1,133 @@
+#!/bin/bash -e
+
+# Copyright 2022 Google Inc. All rights reserved.
+
+# Wrapper of clang-tidy
+
+# Use case #1: by RBE input processor to get resource dir.
+# Command:
+# clang-tidy.sh --version -- -print-resource-dir
+# Outputs:
+# same as clang-tidy --version -- -print-resource-dir
+
+# Use case #2: by soong generated ninja build rules.
+# Calls clang-tidy and touch output .tidy file.
+# Calls clang or clang++ to generate .tidy.d file.
+# Environment:
+# CLANG_CMD: 'clang' or 'clang++'
+# TIDY_FILE: path to output .tidy file
+# TIDY_TIMEOUT: optional for clang-tidy
+# Arguments: # same as clang-tidy
+# <in-file-path> (required, input file)
+# <clang-tidy flags> (optional)
+# "--" (required to separate arguments)
+# <clang/clang++ flags> (optional)
+# Outputs:
+# .../*.tidy (the output file)
+# .../*.tidy.d (the dependent file is output file plus .d suffix)
+# stdout and stderr from clang-tidy
+# stdout and stderr from clang/clang++ if clang-tidy succeeds
+
+BIN_DIR=`dirname $0`
+for x in "$@"; do
+ if [ "$x" == "--version" ]; then
+ exec "${BIN_DIR}/clang-tidy" "$@"
+ fi
+done
+
+usage() {
+ cat <<EOF
+Environment Variable:
+ required: CLANG_CMD={clang|clang++}
+ required: TIDY_FILE=<path to the output .tidy file>
+ optional: TIDY_TIMEOUT=<seconds>
+Usage: clang-tidy.sh <file> <clang-tidy flags> -- <clang/clang++ flags>
+EOF
+ exit 1
+}
+
+INF="$1"
+if [ -z "${CLANG_CMD}" ]; then
+ echo "ERROR: CLANG_CMD environment variable must be set"
+ usage
+fi
+if [ "${CLANG_CMD}" != "clang" -a "${CLANG_CMD}" != "clang++" ]; then
+ echo "ERROR: CLANG_CMD must be 'clang' or 'clang++'"
+ usage
+fi
+if [ -z "${TIDY_FILE}" ]; then
+ echo "ERROR: TIDY_FILE environment variable must be set"
+ usage
+fi
+
+ARGS=("$@")
+NARGS=${#@}
+# call clang-tidy with all arguments
+TIDY_CLANG_FLAGS=("${ARGS[@]}")
+
+# find "--" in ARGS and set CLANG_FLAGS
+LONGDASH=""
+for idx in ${!ARGS[@]}; do
+ if [ "${ARGS[$idx]}" == "--" ]; then
+ LONGDASH=$idx
+ fi
+done
+if [ -z "${LONGDASH}" ]; then
+ echo "ERROR: missing '--' argument"
+ usage
+fi
+# call clang with clang flags, after INF
+N=$(expr $LONGDASH + 1)
+CLANG_FLAGS=("${ARGS[@]:$N:$NARGS}")
+# add more flags to generate .tidy.d file
+CLANG_FLAGS+=("-E" "-o" "/dev/null" "-MQ" "${TIDY_FILE}" "-MD" "-MF" "${TIDY_FILE}.d")
+
+TIDY_STDOUT="${TIDY_FILE}.stdout"
+TIDY_STDERR="${TIDY_FILE}.stderr"
+CLANG_STDOUT="${TIDY_FILE}.d.stdout"
+CLANG_STDERR="${TIDY_FILE}.d.stderr"
+
+OUT_DIR=`dirname ${TIDY_FILE}`
+mkdir -p ${OUT_DIR}
+
+call_clang() {
+ "${BIN_DIR}/${CLANG_CMD}" "${INF}" "${CLANG_FLAGS[@]}" \
+ > ${CLANG_STDOUT} 2> ${CLANG_STDERR} & \
+ CLANG_PID=$!
+}
+
+call_clang_tidy() {
+ "${BIN_DIR}/clang-tidy" "${TIDY_CLANG_FLAGS[@]}" \
+ > ${TIDY_STDOUT} 2> ${TIDY_STDERR} & \
+ TIDY_PID=$!
+}
+
+rm -f ${TIDY_FILE} ${TIDY_STDOUT} ${TIDY_STDERR} ${CLANG_STDOUT} ${CLANG_STDERR}
+call_clang
+call_clang_tidy
+
+CLANG_RESULT=0
+TIDY_RESULT=0
+wait ${CLANG_PID} || CLANG_RESULT=$?
+if [ "${CLANG_RESULT}" == 0 ]; then
+ # RBE put some files in /b/f/w/, which should be removed in .d files.
+ # Or ninja dependency check will not find them and run this script again.
+ sed -i -e 's:/b/f/w/::' ${TIDY_FILE}.d
+fi
+wait ${TIDY_PID} || TIDY_RESULT=$?
+
+cat ${TIDY_STDOUT}
+cat ${TIDY_STDERR} 1>&2
+if [ "${TIDY_RESULT}" == 0 ]; then
+ touch ${TIDY_FILE}
+ # dump clang/clang++ output and use its exit code
+ cat ${CLANG_STDOUT}
+ cat ${CLANG_STDERR} 1>&2
+ TIDY_RESULT=${CLANG_RESULT}
+else
+ # ignore clang/clang++ output
+ rm -f ${TIDY_FILE}.d
+fi
+
+rm -f ${TIDY_STDOUT} ${TIDY_STDERR} ${CLANG_STDOUT} ${CLANG_STDERR}
+exit ${TIDY_RESULT}