diff --git a/.clang-tidy b/.clang-tidy new file mode 100644 index 000000000000..d2467898d7a9 --- /dev/null +++ b/.clang-tidy @@ -0,0 +1,126 @@ +# vim: set ft=yaml: +HeaderFilterRegex: '/gpt4all-(backend|chat)/(src|include)/' +Checks: +- 'bugprone-*' +- 'cert-*' +- 'clang-analyzer-*' +- 'cppcoreguidelines-*' +- 'google-*' +- 'misc-*' +- 'modernize-*' +- 'performance-*' +- 'portability-*' +- 'readability-*' +- '-*-avoid-c-arrays' +- '-*-macro-to-enum' +- '-*-magic-numbers' +- '-*-narrowing-conversions' +- '-*-non-private-member-variables-in-classes' +- '-*-use-default-member-init' +- '-*readability-braces-around-statements' +- '-bugprone-assignment-in-if-condition' +- '-bugprone-branch-clone' +- '-bugprone-crtp-constructor-accessibility' +- '-bugprone-easily-swappable-parameters' +- '-bugprone-implicit-widening-of-multiplication-result' +- '-bugprone-inc-dec-in-conditions' +- '-bugprone-suspicious-string-compare' +- '-bugprone-suspicious-stringview-data-usage' +- '-bugprone-switch-missing-default-case' +- '-cert-dcl03-c' +- '-cert-err33-c' +- '-cert-err58-cpp' +- '-clang-analyzer-core.CallAndMessage' +- '-clang-analyzer-cplusplus.Move' +- '-clang-analyzer-deadcode.DeadStores' +- '-clang-analyzer-optin.performance.Padding' +- '-clang-diagnostic-missing-include-dirs' +- '-clang-diagnostic-unreachable-code-break' +- '-cppcoreguidelines-avoid-do-while' +- '-cppcoreguidelines-avoid-goto' +- '-cppcoreguidelines-avoid-non-const-global-variables' +- '-cppcoreguidelines-explicit-virtual-functions' +- '-cppcoreguidelines-init-variables' +- '-cppcoreguidelines-macro-usage' +- '-cppcoreguidelines-no-malloc' +- '-cppcoreguidelines-noexcept-move-operations' +- '-cppcoreguidelines-owning-memory' +- '-cppcoreguidelines-prefer-member-initializer' +- '-cppcoreguidelines-pro-bounds-array-to-pointer-decay' +- '-cppcoreguidelines-pro-bounds-pointer-arithmetic' +- '-cppcoreguidelines-pro-type-const-cast' +- '-cppcoreguidelines-pro-type-cstyle-cast' +- '-cppcoreguidelines-pro-type-member-init' +- '-cppcoreguidelines-pro-type-reinterpret-cast' +- '-cppcoreguidelines-pro-type-static-cast-downcast' +- '-cppcoreguidelines-pro-type-union-access' +- '-cppcoreguidelines-pro-type-vararg' +- '-cppcoreguidelines-rvalue-reference-param-not-moved' +- '-cppcoreguidelines-special-member-functions' +- '-cppcoreguidelines-virtual-class-destructor' +- '-google-build-using-namespace' +- '-google-default-arguments' +- '-google-explicit-constructor' +- '-google-global-names-in-headers' +- '-google-readability-casting' +- '-google-readability-namespace-comments' +- '-google-readability-todo' +- '-google-runtime-int' +- '-misc-const-correctness' +- '-misc-include-cleaner' +- '-misc-no-recursion' +- '-misc-static-assert' +- '-misc-unused-parameters' +- '-misc-use-anonymous-namespace' +- '-misc-use-internal-linkage' +- '-modernize-avoid-bind' +- '-modernize-deprecated-headers' +- '-modernize-loop-convert' +- '-modernize-pass-by-value' +- '-modernize-raw-string-literal' +- '-modernize-return-braced-init-list' +- '-modernize-use-auto' +- '-modernize-use-designated-initializers' +- '-modernize-use-equals-default' +- '-modernize-use-nodiscard' +- '-modernize-use-override' +- '-modernize-use-ranges' +- '-modernize-use-std-print' +- '-modernize-use-trailing-return-type' +- '-modernize-use-using' +- '-performance-avoid-endl' +- '-performance-enum-size' +- '-performance-faster-string-find' +- '-performance-for-range-copy' +- '-performance-implicit-conversion-in-loop' +- '-performance-move-const-arg' +- '-performance-noexcept-move-constructor' +- '-performance-no-automatic-move' +- '-performance-unnecessary-copy-initialization' +- '-performance-unnecessary-value-param' +- '-readability-avoid-const-params-in-decls' +- '-readability-avoid-nested-conditional-operator' +- '-readability-avoid-return-with-void-value' +- '-readability-avoid-unconditional-preprocessor-if' +- '-readability-const-return-type' +- '-readability-container-size-empty' +- '-readability-convert-member-functions-to-static' +- '-readability-else-after-return' +- '-readability-function-cognitive-complexity' +- '-readability-identifier-length' +- '-readability-implicit-bool-conversion' +- '-readability-inconsistent-declaration-parameter-name' +- '-readability-isolate-declaration' +- '-readability-math-missing-parentheses' +- '-readability-named-parameter' +- '-readability-non-const-parameter' +- '-readability-qualified-auto' +- '-readability-redundant-access-specifiers' +- '-readability-redundant-inline-specifier' +- '-readability-redundant-member-init' +- '-readability-redundant-string-init' +- '-readability-simplify-boolean-expr' +- '-readability-static-accessed-through-instance' +- '-readability-suspicious-call-argument' +- '-readability-uppercase-literal-suffix' +- '-readability-use-anyofallof' diff --git a/.github/workflows/cpp-linter.yml b/.github/workflows/cpp-linter.yml new file mode 100644 index 000000000000..4ca5941b7d14 --- /dev/null +++ b/.github/workflows/cpp-linter.yml @@ -0,0 +1,62 @@ +name: cpp-linter + +on: + pull_request: + paths: ['.github/workflows/cpp-linter.yml', '**.c', '**.cpp', '**.h', '**.inl', '**CMakeLists.txt', '**.cmake'] + push: + branches: [main] + paths: ['.github/workflows/cpp-linter.yml', '**.c', '**.cpp', '**.h', '**.inl', '**CMakeLists.txt', '**.cmake'] + +jobs: + cpp-linter: + runs-on: ubuntu-24.04 + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + submodules: 'recursive' + - name: Install dependencies + run: | + wget -qO- 'https://apt.llvm.org/llvm-snapshot.gpg.key' | sudo tee /etc/apt/trusted.gpg.d/apt.llvm.org.asc >/dev/null + sudo add-apt-repository -y 'deb http://apt.llvm.org/noble/ llvm-toolchain-noble-19 main' + packages=( + clang-19 clang-format-19 clang-tidy-19 cmake git libgl-dev libopengl-dev libx11-6 libx11-xcb1 libxcb-glx0 + libxcb-icccm4 libxcb-image0 libxcb-keysyms1 libxcb-randr0 libxcb-render-util0 libxcb-render0 libxcb-shape0 + libxcb-shm0 libxcb-sync1 libxcb-xfixes0 libxcb-xinput0 libxcb-xkb1 libxcb1 libxkbcommon-dev + libxkbcommon-x11-0 libxkbcommon0 make + ) + sudo apt-get update + sudo apt-get install -y "${packages[@]}" --no-install-recommends + - name: Install Qt + env: + QT_EMAIL: ${{ secrets.QT_EMAIL }} + QT_PASSWORD: ${{ secrets.QT_PASSWORD }} + run: | + wget 'https://qt.mirror.constant.com/archive/online_installers/4.8/qt-online-installer-linux-x64-4.8.0.run' + chmod +x qt-online-installer-linux-x64-4.8.0.run + ./qt-online-installer-linux-x64-4.8.0.run --no-force-installations --no-default-installations \ + --no-size-checking --default-answer --accept-licenses --confirm-command --accept-obligations \ + --email "$QT_EMAIL" --password "$QT_PASSWORD" install \ + qt.qt6.680.linux_gcc_64 extensions.qtpdf.680.linux_gcc_64 qt.qt6.680.addons.qthttpserver + - name: Configure + run: | + sed -i '/file(DOWNLOAD/,+4 s/^/#/' gpt4all-chat/CMakeLists.txt + cmake -S gpt4all-chat -B gpt4all-chat/build \ + -DCMAKE_PREFIX_PATH=~/Qt/6.8.0/gcc_64/lib/cmake \ + -DCMAKE_C_COMPILER=clang-19 \ + -DCMAKE_CXX_COMPILER=clang++-19 \ + -DLLMODEL_CUDA=OFF \ + -DLLMODEL_KOMPUTE=OFF + - uses: cpp-linter/cpp-linter-action@v2 + id: linter + with: + style: '' # no clang-format + extensions: 'c,cpp' + tidy-checks: '' # use .clang-tidy config + database: gpt4all-chat/build + version: 19 + files-changed-only: false + ignore: 'gpt4all-chat/build/_deps|gpt4all-bindings' + - name: Fail Fast + if: steps.linter.outputs.clang-tidy-checks-failed > 0 + run: exit 1