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 <mbonadei@webrtc.org>
Reviewed-by: Harald Alvestrand <hta@webrtc.org>
Commit-Queue: (Daniel.L) Byoungchan Lee <daniel.l@hpcnt.com>
Cr-Commit-Position: refs/heads/main@{#35674}
diff --git a/tools_webrtc/iwyu/apply-iwyu b/tools_webrtc/iwyu/apply-iwyu
index a26f46b..c0242aa 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 @@
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 @@
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 @@
fi
echo "Finished. Check diff, compile and git cl format before uploading."
-
-