#!/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/zircon/+/master/docs/getting_started.md set -eu # Path to toolchain TOOLCHAIN_PREFIX="" function func_help { echo "USAGE: clang-tidy-zircon [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 : 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/zircon/+/master/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-*" $@