blob: 66c2abb28e1deb306759fcd4220c37c2caa11dae [file] [log] [blame]
#!/usr/bin/env bash
# src/tools/tidy
# This script checks C++ code with clang-tidy in the following location:
#
# src/backend/gporca
#
# To genarate a CMake build directory with compilation database:
#
# for debug build:
#
# $ CXX=clang++ cmake -GNinja -Hsrc/backend/gporca -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DCMAKE_BUILD_TYPE=Debug -Bbuild.debug
#
# and release:
#
# $ CXX=clang++ cmake -GNinja -Hsrc/backend/gporca -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DCMAKE_BUILD_TYPE=RelWithDebInfo -Bbuild.release
#
# To check (it's unsurprising if we pass the check in one configuration but not another)
# $ src/tools/tidy chk-orca build.debug
# and
# $ src/tools/tidy chk-orca build.release
#
# If clang-tidy is under a different name, or it's not in your PATH, specify it
# in the CLANG_TIDY environment variable.
#
# To install clang-tidy:
# macOS: brew install llvm (typically clang-tidy will be under /usr/local/opt/llvm/bin)
# Debian derivatives: apt install clang-tidy
# Or consult your operating system's package manager
#
# For more details about running clang-tidy against ORCA, see src/backend/gporca/README.tidy.md
set -e -u -o pipefail
: "${CLANG_TIDY:=clang-tidy}"
# This depends on GNU parallel (https://www.gnu.org/software/parallel/). To install:
# macOS: brew install parallel
# Debian-derivatives: apt install parallel
chk() {
local build_dir compdb
build_dir=$1
compdb=$1/compile_commands.json
test -f "${compdb}" || die "compilation database not found at ${compdb}"
parallel -0 -q --halt now,fail=1 \
"${CLANG_TIDY}" -p "${build_dir}" -quiet
}
chk_orca() {
local build_dir
build_dir=$1
orca_files_to_tidy | chk "${build_dir}"
}
chk_gpopt() {
local vpath
vpath=$1
gpopt_files_to_tidy | chk "${vpath}"
}
usage() {
printf >&2 "Usage: [CLANG_TIDY=clang-tidy] %s (chk-gpopt|chk-orca) /path/to/build-dir\n" "$0"
echo >&2 "Make sure a compilation database (compile_commands.json) exists in the build directory you specified"
echo >&2 "compilation databases are typically generated by CMake (using -DCMAKE_EXPORT_COMPILE_COMMANDS=ON) or interceptors like bear"
return 1
}
die() {
local msg
msg=$1
echo >&2 "${msg}"
exit 1
}
# NUL-delimited list of files to tidy
orca_files_to_tidy() {
git ls-files -z 'src/backend/gporca/*.cpp'
}
gpopt_files_to_tidy() {
git ls-files -z 'src/backend/gpopt/*.cpp'
}
_main() {
local cmd
cmd=${1:-}
shift
local TOPLEVEL
TOPLEVEL=$(git rev-parse --show-toplevel)
cd "${TOPLEVEL}"
case "${cmd}" in
chk-gpopt)
chk_gpopt "$@"
;;
chk-orca)
chk_orca "$@"
;;
*)
usage
;;
esac
}
_main "$@"