diff options
Diffstat (limited to 'src/arrow/cpp/build-support/iwyu/iwyu.sh')
-rwxr-xr-x | src/arrow/cpp/build-support/iwyu/iwyu.sh | 90 |
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 |