mirror of
https://github.com/arcan1s/arcanis.me.git
synced 2025-12-16 02:03:41 +00:00
more pretty md files
This commit is contained in:
@ -7,7 +7,9 @@ tags: разработка, c++, cmake
|
||||
title: Добавляем cppcheck и clang-format для проекта на cmake
|
||||
short: cppcheck-and-clang-format
|
||||
---
|
||||
Небольшое How-To посвященное прикручиванию автоматической проверки стиля, а также статического анализатора к проекту на `C++`, который использует в качестве системы сборки `cmake`.
|
||||
Небольшое How-To посвященное прикручиванию автоматической проверки стиля, а
|
||||
также статического анализатора к проекту на `C++`, который использует в качестве
|
||||
системы сборки `cmake`.
|
||||
|
||||
<!--more-->
|
||||
|
||||
@ -23,27 +25,47 @@ sources/
|
||||
|- second_component/
|
||||
```
|
||||
|
||||
**3rdparty** - директория с различными дополнительными библиотеками, которую надо исключить из проверок (в дальнейшем соответствует переменной cmake `PROJECT_TRDPARTY_DIR`). Дополнительно допустим, что у нас, помимо обычных файлов исходного кода (`*.cpp`, `*.h`) есть еще какие-либо (например, `*.qml`).
|
||||
**3rdparty** - директория с различными дополнительными библиотеками, которую
|
||||
надо исключить из проверок (в дальнейшем соответствует переменной cmake
|
||||
`PROJECT_TRDPARTY_DIR`). Дополнительно допустим, что у нас, помимо обычных
|
||||
файлов исходного кода (`*.cpp`, `*.h`) есть еще какие-либо (например, `*.qml`).
|
||||
|
||||
Дополнительно используемые ниже команды можно вставить в pre-commit hook и невозбранно тролить коллег по ынтырпрайзу, не давая им закоммитить ничего, пока они не научатся читать `CONTRIBUTING.md`.
|
||||
Дополнительно используемые ниже команды можно вставить в pre-commit hook и
|
||||
невозбранно тролить коллег по ынтырпрайзу, не давая им закоммитить ничего, пока
|
||||
они не научатся читать `CONTRIBUTING.md`.
|
||||
|
||||
## <a href="#cppcheck" class="anchor" id="cppcheck"><span class="octicon octicon-link"></span></a>cppcheck
|
||||
|
||||
Коль скоро нормальных (из коробки) статических анализаторов не завезли в open source будем использовать то, что имеется. Знатоки говорят, что [cppcheck](//cppcheck.sourceforge.net/ "Сайт cppcheck") при должной конфигурации будет лучше, чем любой аналог, но конфигурация его для достаточно большого проекта похожа больше на написание нового проекта. Суть добавления cppheck к проекту сводится к указанию очевидных недоработок в коде и тыканью в ~~лужу~~ них.
|
||||
Коль скоро нормальных (из коробки) статических анализаторов не завезли в open
|
||||
source будем использовать то, что имеется. Знатоки говорят, что
|
||||
[cppcheck](//cppcheck.sourceforge.net/ "Сайт cppcheck") при должной конфигурации
|
||||
будет лучше, чем любой аналог, но конфигурация его для достаточно большого
|
||||
проекта похожа больше на написание нового проекта. Суть добавления cppheck к
|
||||
проекту сводится к указанию очевидных недоработок в коде и тыканью в <del>лужу</del>
|
||||
них.
|
||||
|
||||
### <a href="#cppcheck-run" class="anchor" id="cppcheck-run"><span class="octicon octicon-link"></span></a>Общий пример запуска
|
||||
|
||||
Тут все, казалось бы, очень просто:
|
||||
|
||||
```bash
|
||||
cppcheck --enable=warning,performance,portability,information,missingInclude --std=c++11 --library=qt.cfg --template="[{severity}][{id}] {message} {callstack} (On {file}:{line})" --verbose --quiet path/to/source/files/or/directory
|
||||
cppcheck --enable=warning,performance,portability,information,missingInclude
|
||||
--std=c++11 --library=qt.cfg --template="[{severity}][{id}] {message}
|
||||
{callstack} (On {file}:{line})" --verbose --quiet
|
||||
path/to/source/files/or/directory
|
||||
```
|
||||
|
||||
* `--enable` говорит о том, какие уведомления надо включить. Я выключил `style` (для этого ниже мы заведем `clang-format`), `unusedFunction` - выдает false-positive для некоторых мест.
|
||||
* `--enable` говорит о том, какие уведомления надо включить. Я выключил `style`
|
||||
(для этого ниже мы заведем `clang-format`), `unusedFunction` - выдает
|
||||
false-positive для некоторых мест.
|
||||
* `--std` говорит об используемом стандарте.
|
||||
* `--library=qt.cfg` некий файл настроек, который говорит о том, что и как надо обрабатывать. Добрые разработчики предлагаю почитать на эту тему [мануал](//cppcheck.sourceforge.net/manual.pdf "cppcheck мануал"). В данном случае я использовал шаблон из `/usr/share/cppcheck/cfg/`.
|
||||
* `--library=qt.cfg` некий файл настроек, который говорит о том, что и как надо
|
||||
обрабатывать. Добрые разработчики предлагаю почитать на эту тему
|
||||
[мануал](//cppcheck.sourceforge.net/manual.pdf "cppcheck мануал"). В данном
|
||||
случае я использовал шаблон из `/usr/share/cppcheck/cfg/`.
|
||||
* `--template` - шаблон строки уведомления.
|
||||
* `---verbose --quiet` две противоречащие друг другу опции. Первая включает более информативные сообщения, вторая выключает отчет о прогрессе.
|
||||
* `---verbose --quiet` две противоречащие друг другу опции. Первая включает
|
||||
более информативные сообщения, вторая выключает отчет о прогрессе.
|
||||
|
||||
### <a href="#cppcheck-cmake" class="anchor" id="cppcheck-cmake"><span class="octicon octicon-link"></span></a>Интеграция с cmake
|
||||
|
||||
@ -75,7 +97,11 @@ add_custom_target(
|
||||
)
|
||||
```
|
||||
|
||||
`cppcheck` умеет рекурсивно директории проверять, однако, на моем примере, мне нужно было пропустить проверку qml-файлов, потому что open source проект, в лучших традициях, сегфолтился на некоторых из них - именно для этого используется поиск исходных файлов с дальнейшим выбрасыванием из них файлов, которые не должны проверяться.
|
||||
`cppcheck` умеет рекурсивно директории проверять, однако, на моем примере, мне
|
||||
нужно было пропустить проверку qml-файлов, потому что open source проект, в
|
||||
лучших традициях, сегфолтился на некоторых из них - именно для этого
|
||||
используется поиск исходных файлов с дальнейшим выбрасыванием из них файлов,
|
||||
которые не должны проверяться.
|
||||
|
||||
Включаем в проект (`CMakeLists.txt`)...
|
||||
|
||||
@ -95,11 +121,17 @@ make cppcheck
|
||||
### <a href="#cppcheck-adds" class="anchor" id="cppcheck-adds"><span class="octicon octicon-link"></span></a>Дополнительно
|
||||
|
||||
* Можно добавить свои директории для поиска хидеров, используя опцию `-I dir`.
|
||||
* Можно вычеркнуть файлы и/или директории из проверки, используя опцию `-i path/to/file/or/directory`.
|
||||
* Можно вычеркнуть файлы и/или директории из проверки, используя опцию `-i
|
||||
path/to/file/or/directory`.
|
||||
|
||||
## <a href="#clang" class="anchor" id="clang"><span class="octicon octicon-link"></span></a>clang-format
|
||||
|
||||
[clang-format](//clang.llvm.org/docs/ClangFormat.html "Сайт clang-format") предназначен для автоматического подгона стиля под желаемый или требуемый. Среди аналогов стоит выделить [astyle](//astyle.sourceforge.net/ "Сайт astyle"), который имеет очень скромные возможности, и [uncrustify](//uncrustify.sourceforge.net/ "Сайт uncrustify"), который, наоборот, имеет слишком много опций.
|
||||
[clang-format](//clang.llvm.org/docs/ClangFormat.html "Сайт clang-format")
|
||||
предназначен для автоматического подгона стиля под желаемый или требуемый. Среди
|
||||
аналогов стоит выделить [astyle](//astyle.sourceforge.net/ "Сайт astyle"),
|
||||
который имеет очень скромные возможности, и
|
||||
[uncrustify](//uncrustify.sourceforge.net/ "Сайт uncrustify"), который,
|
||||
наоборот, имеет слишком много опций.
|
||||
|
||||
### <a href="#clang-run" class="anchor" id="clang-run"><span class="octicon octicon-link"></span></a>Общий пример запуска
|
||||
|
||||
@ -109,8 +141,10 @@ clang-format -i -style=LLVM /path/to/source/files
|
||||
|
||||
(К сожалению, он **не умеет** в рекурсивный обход директории.)
|
||||
|
||||
* `-i` включает автозамену файлов (в противном случае, результат будет печататься в stdout).
|
||||
* `-style` выбор определенного стиля либо из предустановленных, либо из файла (`file`), см. ниже.
|
||||
* `-i` включает автозамену файлов (в противном случае, результат будет
|
||||
печататься в stdout).
|
||||
* `-style` выбор определенного стиля либо из предустановленных, либо из файла
|
||||
(`file`), см. ниже.
|
||||
|
||||
### <a href="#clang-cmake" class="anchor" id="clang-cmake"><span class="octicon octicon-link"></span></a>Интеграция с cmake
|
||||
|
||||
@ -137,7 +171,8 @@ add_custom_target(
|
||||
)
|
||||
```
|
||||
|
||||
Аналогичных способ поиска исходных файлов, как и для `cppcheck`, поскольку `clang-format` не умеет в рекурсию.
|
||||
Аналогичных способ поиска исходных файлов, как и для `cppcheck`, поскольку
|
||||
`clang-format` не умеет в рекурсию.
|
||||
|
||||
Включаем в проект (`CMakeLists.txt`)...
|
||||
|
||||
@ -156,10 +191,18 @@ make clangformat
|
||||
|
||||
### <a href="#clang-adds" class="anchor" id="clang-adds"><span class="octicon octicon-link"></span></a>Дополнительно
|
||||
|
||||
* Настройка. Можно почитать опции на [официальном сайте](//clang.llvm.org/docs/ClangFormat.html "Сайт clang-format"). Также можно воспользоваться [интерактивной утилитой](//clangformat.com/ "Сайт") для просмотра опций. Для использования уже готового стиля за базу используем следующую команду:
|
||||
* Настройка. Можно почитать опции на [официальном
|
||||
сайте](//clang.llvm.org/docs/ClangFormat.html "Сайт clang-format"). Также можно
|
||||
воспользоваться [интерактивной утилитой](//clangformat.com/ "Сайт") для
|
||||
просмотра опций. Для использования уже готового стиля за базу используем
|
||||
следующую команду:
|
||||
|
||||
```bash
|
||||
clang-format -style=LLVM -dump-config > .clang-format
|
||||
```
|
||||
|
||||
Далее редактируется полученный файл `.clang-format`. Для включения его необходимо передать опцию `-style=file`, файл должен находиться в одной из родительских директории для каждого файла (например, в корне проекта). Также, можно передать нужные опции прямо в командной строке, например `-style="{BasedOnStyle: llvm, IndentWidth: 8}"`.
|
||||
Далее редактируется полученный файл `.clang-format`. Для включения его
|
||||
необходимо передать опцию `-style=file`, файл должен находиться в одной из
|
||||
родительских директории для каждого файла (например, в корне проекта). Также,
|
||||
можно передать нужные опции прямо в командной строке, например
|
||||
`-style="{BasedOnStyle: llvm, IndentWidth: 8}"`.
|
||||
|
||||
Reference in New Issue
Block a user