summaryrefslogtreecommitdiffstats
path: root/src/arrow/cpp/build-support/iwyu/iwyu.sh
diff options
context:
space:
mode:
Diffstat (limited to 'src/arrow/cpp/build-support/iwyu/iwyu.sh')
-rwxr-xr-xsrc/arrow/cpp/build-support/iwyu/iwyu.sh90
1 files changed, 90 insertions, 0 deletions
diff --git a/src/arrow/cpp/build-support/iwyu/iwyu.sh b/src/arrow/cpp/build-support/iwyu/iwyu.sh
new file mode 100755
index 000000000..55e39d772
--- /dev/null
+++ b/src/arrow/cpp/build-support/iwyu/iwyu.sh
@@ -0,0 +1,90 @@
+#!/usr/bin/env bash
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+set -uo pipefail
+
+ROOT=$(cd $(dirname $BASH_SOURCE)/../../..; pwd)
+
+IWYU_LOG=$(mktemp -t arrow-cpp-iwyu.XXXXXX)
+trap "rm -f $IWYU_LOG" EXIT
+
+IWYU_MAPPINGS_PATH="$ROOT/cpp/build-support/iwyu/mappings"
+IWYU_ARGS="\
+ --mapping_file=$IWYU_MAPPINGS_PATH/boost-all.imp \
+ --mapping_file=$IWYU_MAPPINGS_PATH/boost-all-private.imp \
+ --mapping_file=$IWYU_MAPPINGS_PATH/boost-extra.imp \
+ --mapping_file=$IWYU_MAPPINGS_PATH/gflags.imp \
+ --mapping_file=$IWYU_MAPPINGS_PATH/glog.imp \
+ --mapping_file=$IWYU_MAPPINGS_PATH/gmock.imp \
+ --mapping_file=$IWYU_MAPPINGS_PATH/gtest.imp \
+ --mapping_file=$IWYU_MAPPINGS_PATH/arrow-misc.imp"
+
+set -e
+
+affected_files() {
+ pushd $ROOT > /dev/null
+ local commit=$($ROOT/cpp/build-support/get-upstream-commit.sh)
+ git diff --name-only $commit | awk '/\.(c|cc|h)$/'
+ popd > /dev/null
+}
+
+# Show the IWYU version. Also causes the script to fail if iwyu is not in your
+# PATH
+include-what-you-use --version
+
+if [[ "${1:-}" == "all" ]]; then
+ python $ROOT/cpp/build-support/iwyu/iwyu_tool.py -p ${IWYU_COMPILATION_DATABASE_PATH:-.} \
+ -- $IWYU_ARGS | awk -f $ROOT/cpp/build-support/iwyu/iwyu-filter.awk
+elif [[ "${1:-}" == "match" ]]; then
+ ALL_FILES=
+ IWYU_FILE_LIST=
+ for path in $(find $ROOT/cpp/src -type f | awk '/\.(c|cc|h)$/'); do
+ if [[ $path =~ $2 ]]; then
+ IWYU_FILE_LIST="$IWYU_FILE_LIST $path"
+ fi
+ done
+
+ echo "Running IWYU on $IWYU_FILE_LIST"
+ python $ROOT/cpp/build-support/iwyu/iwyu_tool.py \
+ -p ${IWYU_COMPILATION_DATABASE_PATH:-.} $IWYU_FILE_LIST -- \
+ $IWYU_ARGS | awk -f $ROOT/cpp/build-support/iwyu/iwyu-filter.awk
+else
+ # Build the list of updated files which are of IWYU interest.
+ file_list_tmp=$(affected_files)
+ if [ -z "$file_list_tmp" ]; then
+ exit 0
+ fi
+
+ # Adjust the path for every element in the list. The iwyu_tool.py normalizes
+ # paths (via realpath) to match the records from the compilation database.
+ IWYU_FILE_LIST=
+ for p in $file_list_tmp; do
+ IWYU_FILE_LIST="$IWYU_FILE_LIST $ROOT/$p"
+ done
+
+ python $ROOT/cpp/build-support/iwyu/iwyu_tool.py \
+ -p ${IWYU_COMPILATION_DATABASE_PATH:-.} $IWYU_FILE_LIST -- \
+ $IWYU_ARGS | awk -f $ROOT/cpp/build-support/iwyu/iwyu-filter.awk > $IWYU_LOG
+fi
+
+if [ -s "$IWYU_LOG" ]; then
+ # The output is not empty: the changelist needs correction.
+ cat $IWYU_LOG 1>&2
+ exit 1
+fi