From c296c895b974402faedf51c69e9ca0f7c4f805fc Mon Sep 17 00:00:00 2001 From: Kefu Chai Date: Sun, 31 Mar 2024 14:31:11 +0800 Subject: [PATCH] .github: add iwyu workflow iwyu is short for "include what you use". this workflow is added to identify missing "#include" and extraneous "#include" in C++ source files. This workflow is triggered when a pull request is created targetting the "master" branch. It uses the clang-include-cleaner tool provided by clang-tools package to analyze all the ".cc" and ".hh" source files. Signed-off-by: Kefu Chai --- .github/workflows/iwyu.yaml | 77 +++++++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 .github/workflows/iwyu.yaml diff --git a/.github/workflows/iwyu.yaml b/.github/workflows/iwyu.yaml new file mode 100644 index 000000000000..4e607008e6ce --- /dev/null +++ b/.github/workflows/iwyu.yaml @@ -0,0 +1,77 @@ +name: iwyu + +on: + push: + branches: + - master + pull_request: + branches: + - master + +env: + CLANG_VERSION: 19 + BUILD_TYPE: RelWithDebInfo + BUILD_DIR: build + CLEANER_OUTPUT_PATH: build/clang-include-cleaner.log + +permissions: {} + +jobs: + clang-include-cleaner: + name: "Analyze #includes in source files" + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + submodules: true + - name: Add scylla-ppa repo + env: + scylla_ppa_key: 6B2BFD3660EF3F5B + # "add-apt-repository ppa:scylladb/ppa" does not work, as jammy is not built in this ppa repo, + # so, let's use xenial instead. it is the latest version provided by ppa:scylladb/ppa + run: | + gpg_home=$(mktemp -d) + gpg --homedir $gpg_home --no-default-keyring --keyring ppa.key --keyserver keyserver.ubuntu.com --recv-key $scylla_ppa_key + sudo gpg --homedir $gpg_home --keyring ppa.key --export --output /etc/apt/trusted.gpg.d/ubuntu-scylladb-ppa.gpg $scylla_ppa_key + echo "deb http://ppa.launchpadcontent.net/scylladb/ppa/ubuntu xenial main" | sudo tee -a /etc/apt/sources.list.d/scylla-ppa.list + - name: Install clang-tools + run: | + sudo apt-get install -y curl + curl -fsSL https://apt.llvm.org/llvm-snapshot.gpg.key | sudo tee /etc/apt/trusted.gpg.d/apt.llvm.org.asc >/dev/null + echo "deb http://apt.llvm.org/jammy/ llvm-toolchain-jammy main" | sudo tee -a /etc/apt/sources.list.d/llvm.list + sudo apt-get update + sudo apt-get install -y clang-tools-$CLANG_VERSION + - name: Install more build dependencies + run: | + # - do not install java dependencies, which is not only not necessary, + # and they include "python", which is not EOL and not available. + # - replace "scylla-libthrift010" with "libthrift-dev". because + # scylla-libthrift010 : Depends: libssl1.0.0 (>= 1.0.1) but it is not installable + # - we don't perform tests, so minio is not necessary. + sed -i.orig \ + -e '/tools\/.*\/install-dependencies.sh/d' \ + -e 's/scylla-libthrift010-dev/libthrift-dev/' \ + -e 's/(minio_download_jobs)/(true)/' \ + ./install-dependencies.sh + sudo ./install-dependencies.sh + mv ./install-dependencies.sh{.orig,} + - name: Generate compilation database + run: | + cmake \ + -DCMAKE_BUILD_TYPE=$BUILD_TYPE \ + -DCMAKE_C_COMPILER=clang \ + -DCMAKE_CXX_COMPILER=clang++ \ + -DCMAKE_EXPORT_COMPILE_COMMANDS=ON \ + -G Ninja \ + -B $BUILD_DIR \ + -S . + - name: clang-include-cleaner + run: | + # TODO: run multi-threaded + find $PWD -name "*.cc" -o -name ".hh" | \ + xargs -t -n 1 \ + clang-include-cleaner-$CLANG_VERSION --print=changes -p $BUILD_DIR > $CLEANER_OUTPUT_PATH 2>&1 + - uses: actions/upload-artifact@v4 + with: + name: Logs (clang-include-cleaner) + path: "./${{ env.CLEANER_OUTPUT_PATH }}"