Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Create compilation database & introduce 'clang_tidy_review.sh' #23

Open
wants to merge 2 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
90 changes: 90 additions & 0 deletions clang-tidy-review/clang_tidy_review.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
#!/bin/bash

# We need this export to enable color output to the terminal using GitHub
# Actions. If no, we will get the error while using commands in bash such
# as `tput`.
export TERM=xterm-color

# Check if there is clang-tidy installed.
clang-tidy --version >/dev/null
if [[ ${?} != 0 ]]; then
tput setaf 1 # Red font in terminal.
printf "Error: failed to find 'clang-tidy'.\n"
tput sgr0 # Make font be default in terminal.
printf "Make sure you have clang-tidy installed!\n"
exit 1
fi

# Check for existence of compile_commands.json.
IFS=:
compilation_database=$(find . -name 'compile_commands.json')
unset IFS

if [[ ${#compilation_database} == 0 ]]; then
tput setaf 1 # Red font in terminal.
printf "Error: there is no compilation database "
printf "(compile_commands.json) in your workspace!\n"
tput sgr0 # Make font be default in terminal.
exit 1
fi

# Check for existence of .clang-tidy.
IFS=:
clang_tidy_config_file=$(find . -name '\.clang-tidy')
unset IFS

if [[ ${#clang_tidy_config_file} == 0 ]]; then
tput setaf 1 # Red font in terminal.
printf "Error: there is no .clang-tidy config file in your workspace!\n"
tput sgr0 # Make font be default in terminal.
exit 1
fi

# Find all source files (.cc|.cxx|.cpp|.c) we want to check with clang-tidy.
# We do not include headers since clang-tidy has `--header-filter` option or
# `HeaderFilterRegex` option (in .clang-tidy). With the help of this option
# we can easily grab all warnings|errors from headers included in the source
# files.
IFS=:
source_files=$(find . -name '*.cc' -o -name '*.cpp' -o -name '*.cxx')
unset IFS

# Exit with success if there is no work to do.
if [[ ${#source_files} == 0 ]]; then
tput setaf 2 # Green font in terminal.
printf "There are no source files to check with clang-tidy!\n"
tput sgr0 # Reset terminal.
exit 0
fi

status_exit=0

# Run clang-tidy checks for every file.
for file in ${source_files}
do
printf "Run clang-tidy on ${file} ...\n"

clang-tidy --config-file="${clang_tidy_config_file}" \
-p ${compilation_database} ${file} -- -std=c++17 \
-I$(bazel info workspace) \
-I$(bazel info workspace)/bazel-bin/external/com_github_google_glog/src \
-I$(bazel info workspace)/bazel-bin/external/com_github_google_glog/_virtual_includes/glog \
-I$(bazel info workspace)/bazel-bin/external/com_github_gflags_gflags/_virtual_includes/gflags \
-I$(bazel info workspace)/bazel-bin/external/com_github_libuv_libuv/libuv/include \
-I$(bazel info workspace)/external/com_github_google_googletest/googlemock/include \
-I$(bazel info workspace)/external/com_github_google_googletest/googletest/include \
-I$(bazel info workspace)/external/com_github_curl_curl/include \
-I$(bazel info workspace)/external/com_github_chriskohlhoff_asio/asio/include \
-I$(bazel info workspace)/external/boringssl/src/include

clang_tidy_status=$(echo $?)
if [[ ${clang_tidy_status} != 0 ]]
then
tput setaf 1 # Red font in terminal.
printf "Error: ${file} needs to be fixed from clang-tidy warnings.\n"
tput sgr0 # Reset terminal.
status_exit=1
fi
done

exit ${status_exit}
17 changes: 17 additions & 0 deletions clang-tidy-review/generate_compilation_database.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
#!/bin/bash

INSTALL_DIR="$(bazel info workspace)/dev-tools"
VERSION="0.5.2"

# Check if `generate.py` is already present.
which ${INSTALL_DIR}/bazel-compilation-database-${VERSION}/generate.py &> /dev/null || (
# Download all source files for generating compilation database.
cd "${INSTALL_DIR}" \
&& curl -L "https://github.com/grailbio/bazel-compilation-database/archive/${VERSION}.tar.gz" | tar -xz
)

# Run python script which generates compilation database.
# We should add `--action_env=CC=clang` cause we need clang
# for using clang-tidy. This script should be executed in
# the root directory containing `WORKSPACE.bazel`.
${INSTALL_DIR}/bazel-compilation-database-${VERSION}/generate.py -s -- --action_env=CC=clang