blob: c0168e8132c52cdbeae41fbee2a86595ea6a2904 [file] [log] [blame]
#!/usr/bin/env bash
# Copyright 2018 The Fuchsia Authors
#
# Use of this source code is governed by a MIT-style
# license that can be found in the LICENSE file or at
# https://opensource.org/licenses/MIT
# This script will run the checkers in the Fuchsia module of Clang-tidy on
# Zircon. It requires either a prebuilt Clang toolchan or a Clang toolchain
# built from official Clang repository. For instructions on how to obtain a
# prebuilt toolchain or build the toolchain from scratch, please refer to
# document at
# https://fuchsia.googlesource.com/fuchsia/+/master/zircon/docs/getting_started.md
set -eu
# Path to toolchain
TOOLCHAIN_PREFIX=""
function func_help {
echo "USAGE: clang-tidy-zircon <options> [files ...]"
echo ""
echo "Make sure that you generate the compile_commands.json file with the "
echo "-c flag (or USE_CLANG=true if using make directly)."
echo "options:"
echo ""
echo "-p <toolchain prefix> : path to the directory containing bin/clang"
echo "-h : for help"
exit 1
}
SOURCE="${BASH_SOURCE[0]}"
while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink
SCRIPT_DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
SOURCE="$(readlink "$SOURCE")"
# if $SOURCE was a relative symlink, we need to resolve it relative to the
# path where the symlink file was located
[[ "$SOURCE" != /* ]] && SOURCE="$SCRIPT_DIR/$SOURCE"
done
SCRIPT_DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
ZIRCON_ROOT="$SCRIPT_DIR/.."
# Read args from command line
while getopts "p:t:hn" opt; do
case $opt in
p) TOOLCHAIN_PREFIX="$OPTARG";;
h) func_help;;
\?)
echo "Invalid option"
func_help
esac
done
shift $((OPTIND -1))
# Determine the clang prefix
if [ -z "$TOOLCHAIN_PREFIX" ]; then
# User did not provide toolchain prefix
# Assume user prefer prebuilt toolchain
PREBUILT_DIR="$ZIRCON_ROOT/prebuilt/downloads/clang"
if [ ! -d "$PREBUILT_DIR" ]; then
echo "Toolchain prefix is not defined and prebuilt toolchain has not yet been downloaded."
echo "Abort!"
exit -1
fi
TOOLCHAIN_PREFIX="$PREBUILT_DIR"
fi
# Change dir to zircon
cd "$ZIRCON_ROOT"
# Check the prebuilt clang-tidy binary
CLANGTIDY="$TOOLCHAIN_PREFIX/bin/clang-tidy"
if [ ! -f "$CLANGTIDY" ]; then
echo "$CLANGTIDY not found in prebuilts."
echo "Ensure the toolchain prefix includes the clang-tidy binary."
echo ""
exit 0
fi
cd "$ZIRCON_ROOT"
# Check compile_commands.json
COMPILE_COMMANDS="$ZIRCON_ROOT/compile_commands.json"
if [ ! -f "$COMPILE_COMMANDS" ]; then
echo "compile_commands.json missing, see "
echo "https://fuchsia.googlesource.com/fuchsia/+/master/zircon/docs/editors.md for "
echo "instructions on how to generate it (make sure you use the "
echo "USE_CLANG=true option when building zircon)."
exit -1
fi
# Due to a bug in clang-tidy (https://bugs.llvm.org/show_bug.cgi?id=34900),
# the checks have to be specified here instead of in the .clang-tidy file
# if we're not running clang-analyzer-* checks.
$CLANGTIDY -checks="-*,fuchsia-*" $@