﻿# Использование PVS\-Studio в CMake\-проектах

Помимо режима работы с [compile\_commands\.json](https://pvs-studio.ru/ru/docs/manual/6557/), работать с PVS\-Studio в CMake можно с помощью официальной интеграции или специального CMake\-модуля\. Он позволяет вам интегрировать анализатор в проект на основе CMake более глубоким образом\. Например, вы можете указать конкретные цели для анализа, чтобы не проверять весь проект полностью, а лишь те части, которые вам нужны\.


> \*\*Примечание\\\.\*\* Минимальная версия CMake для использования CMake\\\-модуля – 3\\\.15 \\\(апрель 2019\\\)\\\.

## Прежде чем начать

Убедитесь, что вы ввели лицензионный ключ, иначе анализ не заработает\. О том, как это сделать, подробно написано [здесь](https://pvs-studio.ru/ru/docs/manual/0046/)\.

## Использование официальной интеграции

Начиная с версии 4\.3\.0, CMake предлагает сценарий использования анализатора без `compile_commands.json`\. Срабатывания анализатора PVS\-Studio будут появляться в процессе компиляции проекта\.

Чтобы включить анализ через официальную интеграцию, добавьте следующее правило в `CMakeLists.txt`:

```cpp
set(CMAKE_<LANG>_PVS_STUDIO <EXECUTABLE> analyze -a "GA\;OP")
```

* `LANG` может принимать значения `C` или `CXX`;
* `EXECUTABLE` — путь до исполняемого файла `pvs-studio-analyzer` на GNU/Linux или `CompilerCommandsAnalyzer.exe` на Windows\. CMake извлечёт его расположение из `PATH`, если до него указан не абсолютный путь\.

Указанные после `EXECUTABLE` [параметры](https://pvs-studio.ru/ru/docs/manual/6615/#flags) будут переданы исполняемому файлу C\+\+ анализатора `pvs-studio-analyzer`/`CompilerCommandsAnalyzer.exe`\.


> Использование этой интеграции накладывает ограничения на формат вывода результатов анализа — вам будет недоступна конвертация отчёта через \`plog\-converter\`, так как анализ этим способом осуществляется индивидуально для каждого файла и без сохранения результирующего отчёта PVS\\\-Studio\\\.

Поскольку срабатывания анализатора PVS\-Studio являются частью журнала сборки, вы можете воспользоваться CTest для передачи отчёта в систему отслеживания результатов [CDash](https://cmake.org/cmake/help/book/mastering-cmake/chapter/CDash.html)\.

Если вы по какой\-то причине не можете запускать анализ при каждой сборке, то оберните настройку в условие:

```cpp
if(ENABLE_PVS_STUDIO_CHECKS)
  set(CMAKE_<LANG>_PVS_STUDIO <EXECUTABLE> analyze -a "GA\;OP")
endif()
```

Кроссплатформенные проекты могут задействовать автоматический выбор названия исполняемого файла анализатора PVS\-Studio для C и C\+\+ проектов:

```cpp
find_program(PVS_STUDIO_COMMAND NAMES
             pvs-studio-analyzer CompilerCommandsAnalyzer)
set(CMAKE_CXX_PVS_STUDIO ${PVS_STUDIO_COMMAND} analyze -a "GA\;OP")
```

Можно не редактировать `CMakeLists.txt` для проведения анализа, а сгенерировать папку сборки с добавлением параметра `-DCMAKE_<LANG>_PVS_STUDIO` со значением командной строки запуска анализатора PVS\-Studio\. Обратите внимание, что в этом случае разделение параметров осуществляется через символ `;`, поэтому для указания нескольких групп диагностических правил в параметре `-a` потребуется экранирование:

```cpp
cmake -B build -DCMAKE_C_PVS_STUDIO="<EXECUTABLE>;analyze;-a;GA\;OP"
```

## Добавление CMake\-модуля в проект

Альтернативный способ добавить анализ с помощью PVS\-Studio в проект — это использовать CMake\-модуль\. Для его автоматической загрузки используйте `[FetchContent](https://cmake.org/cmake/help/latest/module/FetchContent.html)`:

```cpp
include(FetchContent)
FetchContent_Declare(
    PVS_CMakeModule
    GIT_REPOSITORY "https://github.com/viva64/pvs-studio-cmake-module.git"
    GIT_TAG        "master" 
)
FetchContent_MakeAvailable(PVS_CMakeModule)
include("${pvs_cmakemodule_SOURCE_DIR}/PVS-Studio.cmake")
```

Этот код самостоятельно загрузит Git\-репозиторий с модулем в генерируемую папку кэша и позволит интегрировать анализатор в ваш проект\. Обратите внимание, что `master` — это самая свежая версия\. Если у вас возникнут проблемы с ней, то попробуйте взять последний релизный тег текущей версии анализатора\.

Вы также можете [загрузить](https://raw.githubusercontent.com/viva64/pvs-studio-cmake-module/master/PVS-Studio.cmake) файл с модулем `PVS-Studio.cmake` самостоятельно, если вы не хотите иметь лишних зависимостей от `FetchContent`\.

Пожалуйста, не забывайте обновлять модуль с выходом новой версии анализатора во избежание проблем в его работе\. В параметре `GIT_TAG` также можно указать master\-ветку, чтобы всегда использовать последнюю версию модуля\.

## Настройка CMake\-модуля

Для запуска анализатора CMake\-модуль добавляет отдельную цель для сборки\. При запуске сборки этой цели на самом деле будет запущен анализ с параметрами, которые были указаны при добавлении этой цели\. Чтобы добавить цель для анализа, нужно использовать команду `pvs_studio_add_target`\. Например:

```cpp
cmake_minimum_required(VERSION 3.5)
project(pvs-studio-cmake-example CXX)

add_executable(example main.cpp)

# Optional:
# include(FetchContent)
# FetchContent_Declare(....)
# FetchContent_MakeAvailable(....)
include(PVS-Studio.cmake)
pvs_studio_add_target(TARGET example.analyze ALL
                      OUTPUT FORMAT json
                      ANALYZE example
                      MODE GA:1,2
                      LOG target.err
                      ARGS -e /path/to/exclude-path)
```

Этот небольшой CMake\-файл содержит одну цель для сборки исполняемого файла и одну цель для запуска анализа\. Разберем параметры команды `pvs_studio_add_target`:

### Опции целей

* `ALL` — анализ будет запускаться автоматически при сборке цели `all`, т\. е\. будет работать при каждой сборке проекта;
* `TARGET` — название создаваемой цели для анализа\. Чтобы запустить анализ, достаточно собрать эту цель;
* `ANALYZE` — цели, которые нужно проанализировать\. Должны быть уникальны при параллельной сборке нескольких целей CMake\-модулем\. Чтобы также проанализировать зависимости этих целей, стоит добавить флаг `RECURSIVE`;
* `RECURSIVE` — рекурсивно анализировать зависимости целей;
* `COMPILE_COMMANDS` — использовать `compile_commands.json` вместо указания целей в опции `ANALYZE`\. Работает за счет `CMAKE_EXPORT_COMPILE_COMMANDS`, доступно только при использовании Makefile или Ninja генераторов\.

### Опции вывода

* `OUTPUT` — печатать вывод анализатора в лог сборки;
* `LOG` — файл отчета\. Если его не указывать, будет использоваться файл `PVS-Studio.log` в директории с CMake кэшем;
* `FORMAT` — формат отчета\. В данном случае `json` — формат ошибок с поддержкой многофайловой навигации\. Список доступных форматов можно найти [здесь](https://pvs-studio.ru/ru/docs/manual/0036/) \(раздел "Утилита Plog Converter"\)\. Можно использовать несколько форматов \(пример: `FORMAT "gitlab,tasklist-verbose"`\);
* `MODE` — включение групп диагностик и их уровней\.

### Опции анализа

* `PLATFORM`_ — _название платформы, доступные опции: `win32`, `x64`/`win64`, `linux32`, `linux64`, `macos`, `arm` \(IAR Embedded Workbench\), pic8 \(MPLAB XC8\), `tms` \(Texas Instruments C6000\);
* `PREPROCESSOR` — формат препроцессированного файла \(`clang`/`visualcpp`/`gcc`\);
* `LICENSE`_ _— путь до \.lic файла;
* `CONFIG`_ _— путь до \.cfg файла;
* `CFG_TEXT`_ _— содержимое \.cfg файла;
* `SUPPRESS_BASE`_ _— путь до [suppress\-файла](https://pvs-studio.ru/ru/docs/manual/0032/) в формате `.suppress.json`;
* `KEEP_COMBINED_PLOG`_ _— не удалять совмещенный файл `.pvs.raw` для последующей обработки утилитой `plog-converter`\.

### Прочие опции

* `DEPENDS` — дополнительные зависимости для цели;
* `SOURCES` — список исходных файлов для анализа;
* `BIN` — путь до `pvs-studio-analyzer` \(macOS/Linux\) или `CompilerCommandsAnalyzer.exe` \(Windows\);
* `CONVERTER` — путь до `plog-converter` \(macOS/Linux\) или `HtmlGenerator.exe` \(Windows\);
* `C_FLAGS` — дополнительные флаги для C компилятора;
* `CXX_FLAGS` — дополнительные флаги для C\+\+ компилятора;
* `ARGS` — [дополнительные аргументы](https://pvs-studio.ru/ru/docs/manual/6615/#flags) для `pvs-studio-analyzer`/`CompilerCommandsAnalyzer.exe`;
* `CONVERTER_ARGS` — [дополнительные аргументы](https://pvs-studio.ru/ru/docs/manual/0038/#plog-converter_flags) для `plog-converter`/`HtmlGenerator.exe`\.

### Исключение файлов из анализа

Для исключения файлов из анализа можно воспользоваться опцией `ARGS`, передав пути через флаг `-e` \(`--exclude-path`\), как указано в примере выше\. Вы можете задать абсолютные, относительные пути или маску поиска \(glob\)\. Учтите, что относительные пути будут раскрыты относительно каталога сборки\. Такой подход позволяет, например, исключить из анализа сторонние библиотеки\.

## Запуск анализа

Для запуска анализа надо собрать цель, которая была добавлена в `pvs_studio_add_target`\. Например, так выглядит запуск анализа для примера выше:

```cpp
cmake --build <path-to-cache-dir> --target example.analyze
```

Перед запуском будут собраны все цели, указанные для анализа в параметре `ANALYZE`\.

[Здесь](https://github.com/viva64/pvs-studio-cmake-examples) вы можете найти примеры интеграции PVS\-Studio в CMake\.