Clang-Tidy and Clazy 6.7 #242
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: Clang-Tidy and Clazy Qt5.15/6.7 | |
# Invoke manually from the command-line using the gh command, eg.: | |
# gh workflow run --ref silverqx-develop | |
# The reason for this is that I have 2 self-hosted runners on one PC (one for Linux and other for | |
# Windows) and I'm not able to serialize all these workflows and because of that I would have to | |
# decrease parallel and it would take hours to finish, so all Linux workflows must be invoked | |
# manually. | |
on: workflow_dispatch | |
concurrency: | |
group: tinyorm-linux | |
jobs: | |
analyzers: | |
name: Clang-Tidy and Clazy | |
# Self-hosted runner is Fedora 40 | |
runs-on: [ self-hosted, linux ] | |
env: | |
# Settings (constant variables) | |
TINY_PARALLEL: 8 | |
# State variables | |
TINY_CLANG_TIDY_COMPLETED: false | |
TINY_VCPKG_NEEDS_UPGRADE: false | |
# Clang Tidy can't be executed on Release builds, it's designed to be run on Debug builds only | |
strategy: | |
matrix: | |
qt: | |
- key: qt5 | |
name: Qt5 | |
version: 5.15.2 | |
- key: qt6 | |
name: Qt6 | |
version: 6.7.1 | |
steps: | |
- uses: actions/checkout@v4 | |
with: | |
path: main | |
- name: TinyORM prepare environment | |
run: | | |
runnerWorkPath=$(realpath "$RUNNER_WORKSPACE/..") | |
echo "TinyRunnerWorkPath=$runnerWorkPath" >> $GITHUB_ENV | |
tinyormPath=$(realpath ./main) | |
echo "TinyORMPath=$tinyormPath" >> $GITHUB_ENV | |
tinyormBuildName='analyzers-${{ matrix.qt.key }}-clang-debug' | |
echo "TinyORMBuildName=$tinyormBuildName" >> $GITHUB_ENV | |
tinyormBuildTree="$RUNNER_WORKSPACE/TinyORM-builds-cmake/build-$tinyormBuildName" | |
echo "TinyORMBuildTree=$tinyormBuildTree" >> $GITHUB_ENV | |
# lukka/get-cmake@latest needed because of Fedora | |
- name: CMake and Ninja install latest versions | |
uses: lukka/get-cmake@latest | |
with: | |
useLocalCache: true | |
useCloudCache: false | |
# Don't use the default CCACHE_DIR path on self-hosted runners | |
# analyzers.yml and vcpkg-linux.yml use the same /ccache_vcpkg folder | |
- name: Ccache prepare environment | |
run: | | |
ccacheDirPath=$(realpath "$RUNNER_WORKSPACE/ccache_vcpkg") | |
echo "CCACHE_DIR=$ccacheDirPath" >> $GITHUB_ENV | |
- name: Ccache print version and configuration | |
run: | | |
echo '::group::Print version' | |
ccache --version | |
echo '::endgroup::' | |
echo '::group::Print ccache config' | |
ccache --show-config | |
echo '::endgroup::' | |
- name: vcpkg prepare environment | |
run: | | |
echo "VCPKG_ROOT=$VCPKG_INSTALLATION_ROOT" >> $GITHUB_ENV | |
echo 'VCPKG_DEFAULT_TRIPLET=x64-linux-dynamic' >> $GITHUB_ENV | |
echo "VCPKG_MAX_CONCURRENCY=$TINY_PARALLEL" >> $GITHUB_ENV | |
- name: vcpkg needs upgrade? (once per day) | |
run: | | |
vcpkgUpgradedAtFilepath="$RUNNER_WORKSPACE/.vcpkg_upgraded_at" | |
if [ ! -f "$vcpkgUpgradedAtFilepath" ] || [ ! -r "$vcpkgUpgradedAtFilepath" ] || \ | |
! read datePreviousUpgradeRaw < "$vcpkgUpgradedAtFilepath" | |
then | |
echo 'TINY_VCPKG_NEEDS_UPGRADE=true' >> $GITHUB_ENV | |
exit 0 | |
fi | |
datePreviousUpgrade=$(date --date="$datePreviousUpgradeRaw" +%s) | |
if [ $? -ne 0 ] || [ -z "$datePreviousUpgrade" ]; then | |
echo "Parsing the '.vcpkg_upgraded_at' failed." >&2 | |
exit 1 | |
fi | |
dateToday=$(date --date=$(date +%Y-%m-%d) +%s) | |
if [ "$datePreviousUpgrade" -lt "$dateToday" ]; then | |
echo 'TINY_VCPKG_NEEDS_UPGRADE=true' >> $GITHUB_ENV | |
fi | |
- name: vcpkg upgrade repository (latest version) | |
if: env.TINY_VCPKG_NEEDS_UPGRADE == 'true' | |
run: | | |
cd "$VCPKG_INSTALLATION_ROOT" | |
git switch master | |
git fetch --tags origin | |
git reset --hard origin/master | |
./bootstrap-vcpkg.sh | |
date +%Y-%m-%d > "$RUNNER_WORKSPACE/.vcpkg_upgraded_at" | |
- name: ${{ matrix.qt.name }} prepare environment | |
run: | | |
echo '/opt/Qt/${{ matrix.qt.version }}/bin' >> $GITHUB_PATH | |
echo "LD_LIBRARY_PATH=/opt/Qt/${{ matrix.qt.version }}/gcc_64/lib${LD_LIBRARY_PATH:+:}$LD_LIBRARY_PATH" >> $GITHUB_ENV | |
# The CMAKE_PREFIX_PATH must be defined on the GitHub Actions, this is some kind of a bug because the CMake | |
# can't find the Qt, but if I export the PATH directly in the step it works but doesn't work using | |
# the GITHUB_PATH like define two line above. 🫤 | |
echo "CMAKE_PREFIX_PATH=/opt/Qt/${{ matrix.qt.version }}/gcc_64${CMAKE_PREFIX_PATH:+:}$CMAKE_PREFIX_PATH" >> $GITHUB_ENV | |
- name: CMake print version | |
run: | | |
cmake --version | |
- name: vcpkg print version | |
run: | | |
vcpkg --version | |
- name: Clazy print version | |
run: | | |
clazy-standalone --version | |
- name: TinyORM create folder for build trees | |
run: | | |
mkdir --parents '../TinyORM-builds-cmake' | |
- name: Ccache clear statistics | |
run: | | |
ccache --zero-stats | |
# CMAKE_DISABLE_PRECOMPILE_HEADERS=ON is correct (Clazy is failing with OFF) | |
# TinyDrivers are disabled for Qt v5.15 | |
- name: TinyORM cmake configure (${{ env.TinyORMBuildName }}) | |
working-directory: ${{ env.TinyORMPath }} | |
run: >- | |
[[ '${{ matrix.qt.key }}' == 'qt6' ]] && tinyBuildDrivers='ON' || tinyBuildDrivers='OFF' | |
[[ '${{ matrix.qt.key }}' == 'qt6' ]] && | |
tinyDriversType='-D DRIVERS_TYPE:STRING=Loadable' || tinyDriversType='' | |
cmake | |
--log-level=DEBUG --log-context | |
-S . | |
-B "$TinyORMBuildTree" | |
-G Ninja | |
-D CMAKE_CXX_COMPILER_LAUNCHER:FILEPATH=ccache | |
-D CMAKE_CXX_COMPILER:FILEPATH=clang++-18 | |
-D CMAKE_TOOLCHAIN_FILE:FILEPATH="$VCPKG_INSTALLATION_ROOT/scripts/buildsystems/vcpkg.cmake" | |
-D CMAKE_DISABLE_PRECOMPILE_HEADERS:BOOL=ON | |
-D CMAKE_EXPORT_COMPILE_COMMANDS:BOOL=ON | |
-D CMAKE_EXPORT_PACKAGE_REGISTRY:BOOL=OFF | |
-D CMAKE_BUILD_TYPE:STRING=${{ matrix.build-type.name }} | |
-D CMAKE_CXX_SCAN_FOR_MODULES:BOOL=OFF | |
-D VCPKG_APPLOCAL_DEPS:BOOL=OFF | |
-D VERBOSE_CONFIGURE:BOOL=ON | |
-D BUILD_TREE_DEPLOY:BOOL=OFF | |
-D MATCH_EQUAL_EXPORTED_BUILDTREE:BOOL=OFF | |
-D STRICT_MODE:BOOL=ON | |
-D MYSQL_PING:BOOL=ON | |
-D BUILD_TESTS:BOOL=ON | |
-D ORM:BOOL=ON | |
-D TOM:BOOL=ON | |
-D TOM_EXAMPLE:BOOL=ON | |
-D BUILD_DRIVERS:BOOL=$tinyBuildDrivers | |
$tinyDriversType | |
- name: TinyORM cmake build ✨ (${{ env.TinyORMBuildName }}) | |
working-directory: ${{ env.TinyORMBuildTree }} | |
run: >- | |
cmake --build . --target all --parallel $TINY_PARALLEL | |
- name: Ccache print statistics | |
run: | | |
ccache --show-stats -vv | |
- name: TinyORM execute clang-tidy 🔥 | |
working-directory: ${{ env.TinyORMPath }} | |
run: >- | |
echo 'TINY_CLANG_TIDY_COMPLETED=true' >> $GITHUB_ENV | |
run-clang-tidy | |
-extra-arg-before='-Qunused-arguments' | |
-p="$TinyORMBuildTree" | |
-j $TINY_PARALLEL | |
'[\\\/]+(?:drivers|examples|orm|src|tests|tom)[\\\/]+.+?[\\\/]+(?!mocs_)[\w\d_\-\+]+\.cpp$' | |
# Disabled checks | |
# Level 2 - qstring-allocations | |
# Manual level - qt4-qstring-from-array, qt6-qlatin1stringchar-to-u, | |
# qvariant-template-instantiation | |
- name: TinyORM execute clazy-standalone 🚀 | |
# Run the clazy if the clang-tidy was executed and was success or failed | |
if: env.TINY_CLANG_TIDY_COMPLETED == 'true' && (success() || failure()) | |
working-directory: ${{ env.TinyORMPath }} | |
run: | | |
checks=\ | |
'level0,level1,level2,'\ | |
`# Manual checks`\ | |
'assert-with-side-effects,container-inside-loop,detaching-member,'\ | |
'heap-allocated-small-trivial-type,ifndef-define-typo,isempty-vs-count,jni-signatures,'\ | |
'qhash-with-char-pointer-key,qproperty-type-mismatch,qrequiredresult-candidates,'\ | |
'qstring-varargs,qt-keywords,qt6-deprecated-api-fixes,qt6-fwd-fixes,qt6-header-fixes,'\ | |
'qt6-qhash-signature,raw-environment-function,reserve-candidates,'\ | |
'signal-with-return-value,thread-with-slots,tr-non-literal,unneeded-cast,'\ | |
'use-chrono-in-qtimer,'\ | |
`# New in Clazy 1.11`\ | |
'unexpected-flag-enumerator-value,'\ | |
'use-arrow-operator-instead-of-data,'\ | |
`# Checks Excluded from level2`\ | |
'no-qstring-allocations' | |
python3 ./tools/run-clazy-standalone.py \ | |
-checks="$checks" \ | |
-extra-arg-before='-Qunused-arguments' \ | |
-header-filter='[\\\/]+(drivers|examples|orm|tests|tom)[\\\/]+.+\.(h|hpp)$' \ | |
-j $TINY_PARALLEL \ | |
-p="$TinyORMBuildTree" \ | |
'[\\\/]+(?:drivers|examples|orm|src|tests|tom)[\\\/]+.+?[\\\/]+(?!mocs_)[\w\d_\-\+]+\.cpp$' |