From e286a7bbf7a3f94d31eabc9e0b3b0aaf53b8edcd Mon Sep 17 00:00:00 2001 From: Byoungchan Lee Date: Thu, 13 Jan 2022 01:04:58 +0900 Subject: [PATCH] Modify apply-iwyu to utilize compile_commands.json Bug: webrtc:13532 Change-Id: I06e5987469e732296deb1eefd317e2478add98b8 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/246040 Reviewed-by: Mirko Bonadei Reviewed-by: Harald Alvestrand Commit-Queue: (Daniel.L) Byoungchan Lee Cr-Commit-Position: refs/heads/main@{#35674} --- tools_webrtc/iwyu/apply-iwyu | 46 +++++++++++++++++++++++++++++------- 1 file changed, 37 insertions(+), 9 deletions(-) diff --git a/tools_webrtc/iwyu/apply-iwyu b/tools_webrtc/iwyu/apply-iwyu index a26f46b933..c0242aa6b4 100755 --- a/tools_webrtc/iwyu/apply-iwyu +++ b/tools_webrtc/iwyu/apply-iwyu @@ -6,14 +6,43 @@ # The script uses a subsequent grep pass to remove #include files from .cc # that are also in the .h file, or are problematic to include. # +# In order to handle include paths correctly, you need to provide +# a compile DB (aka compile_commands.json). +# You can create it in one of the following ways: +# "gn gen --export-compile-commands path/to/out" +# "tools/clang/scripts/generate_compdb.py -p path/to/out > compile_commands.json" +# # To get iwyu on Debian/glinux, do "sudo apt-get install iwyu". set -e set -x -FILE=$1 + +IWYU_TOOL="${IWYU_TOOL:-/usr/bin/iwyu_tool}" +FIX_INCLUDE="${FIX_INCLUDE:-/usr/bin/fix_include}" # If you want to exclude files that are in $FILE.h from $FILE.cc, set # the following variable to "yes". This is a style guide violation. REMOVE_CC_INCLUDES=no +COMPILE_COMMANDS='' + +error() { + echo "$*" >&2 + exit 1 +} + +while getopts 'c:r' opts; do + case "${opts}" in + c) COMPILE_COMMANDS="${OPTARG}" ;; + r) REMOVE_CC_INCLUDES=yes ;; + *) error "Unexpected option ${opts}" ;; + esac +done +shift $(expr $OPTIND - 1 ) + +if [[ -z "$COMPILE_COMMANDS" ]]; then + error "compile_commands.json must be passed." +fi + +FILE="$1" if [ ! -f $FILE ]; then # See if we have the root name of a .cc/.h pair @@ -34,11 +63,8 @@ else fi # IWYU has a confusing set of exit codes. Discard it. -iwyu -Xiwyu --no_fwd_decls -D__X86_64__ -DWEBRTC_POSIX -I . \ - -I third_party/abseil-cpp \ - -I third_party/googletest/src/googlemock/include \ - -I third_party/googletest/src/googletest/include \ - $FILE_CC >& /tmp/includefixes$$ || echo "IWYU done, code $?" +"$IWYU_TOOL" -p "$COMPILE_COMMANDS" "$FILE_CC" \ + >& /tmp/includefixes$$ || echo "IWYU done, code $?" if grep 'fatal error' /tmp/includefixes$$; then echo "iwyu run failed" @@ -46,7 +72,11 @@ if grep 'fatal error' /tmp/includefixes$$; then rm /tmp/includefixes$$ exit 1 else - fix_include < /tmp/includefixes$$ || echo "Some files modified" + # In compile_commands.json, the file name is recorded + # as a relative path to the build directory. + pushd "$(dirname "$COMPILE_COMMANDS")" || error "pushd failed" + "$FIX_INCLUDE" < /tmp/includefixes$$ || echo "Some files modified" + popd rm /tmp/includefixes$$ fi @@ -70,5 +100,3 @@ if [ -n "$FILE_H" ]; then fi echo "Finished. Check diff, compile and git cl format before uploading." - -