Commit 3a934f94 authored by Nikita Akatiev's avatar Nikita Akatiev Committed by Nikita Akatyev
Browse files

Add build system docs

parent c74346c6
No related merge requests found
......@@ -229,46 +229,55 @@ bmp-заголовка.
## Система сборки и тестирования
- Используйте команду `make` для того, чтобы собрать ваш код в исполняемый файл
`build/image-transformer`. Проверьте, что в вашей системе установлены программа
`make` версии как минимум 4.0 и компилятор `clang`. Флаги для компиляции берутся
из `compile_flags.txt` — вы можете добавить свои флаги в конец
этого файла или в саму команду `make`. Например, чтобы собрать код с оптимизациями
и протестировать скорость выполнения, вы можете использовать `make CFLAGS=-O3`.
С помощью `LDFLAGS` можно передать дополнительные параметры линковщику.
- Используйте `make check`, чтобы проверить вашу программу через статический анализатор
`clang-tidy`. Список проверок описан в файле `clang-tidy-checks.txt`. Вы можете добавить
свои проверки в конец этого файла или в параметр `CLANG_TIDY_CHECKS` для `make`.
- Вы можете собрать код с поддержкой определенных динамических анализаторов (санитайзеров).
Санитайзеры могут дать подробную информацию о возможных и реальных ошибках в программе вместо
классического сообщения о segmentation fault. Исполняемые файлы будут также размещены в директории `build`, но для санитайзеров выделены отдельные
поддиректории с их названием.
Поддерживаются следующие санитайзеры:
- `make SANITIZER=asan` — [AddressSanitizer](https://clang.llvm.org/docs/AddressSanitizer.html),
Для сборки кода вам предоставлена система сборки на языке CMake, самим писать систему сборки не требуется.
- В зависимости от платформы и компилятора, система сборки поддерживает несколько конфигураций с динамическими
анализаторами (санитайзерами). Санитайзеры могут дать подробную информацию о возможных и реальных ошибках в
программе вместо классического сообщения о segmentation fault. Выбрать подходящую конфигурацию вы можете с
помощью переменной `CMAKE_BUILD_TYPE`:
- `ASan` — [AddressSanitizer](https://clang.llvm.org/docs/AddressSanitizer.html),
набор проверок на некорректное использование адресов памяти. Примеры:
use-after-free, double-free, выход за пределы стека, кучи или статического блока.
- `make SANITIZER=lsan` — [LeakSanitizer](https://clang.llvm.org/docs/LeakSanitizer.html),
- `LSan` — [LeakSanitizer](https://clang.llvm.org/docs/LeakSanitizer.html),
проверки на утечки памяти.
- `make SANITIZER=msan` — [MemorySanitizer](https://clang.llvm.org/docs/MemorySanitizer.html),
- `MSan` — [MemorySanitizer](https://clang.llvm.org/docs/MemorySanitizer.html),
проверяет, что любая используемая ячейка памяти проинициализирована на момент чтения из нее.
- `make SANITIZER=usan` — [UndefinedBehaviourSanitizer](https://clang.llvm.org/docs/UndefinedBehaviorSanitizer.html),
- `UBSan` — [UndefinedBehaviourSanitizer](https://clang.llvm.org/docs/UndefinedBehaviorSanitizer.html),
набор базовых проверок на неопределенное поведение. Примеры: переполнение численного типа,
null-pointer dereference.
- `make SANITIZER=none` — собрать код без санитайзеров (по умолчанию).
- `make SANITIZER=all` — собрать 5 версий кода, каждая с одной из предыдущих опций.
- Используйте `make clean` для очистки временных файлов и директории `build`.
- Директория `tester` содержит код и изображения для тестирования вашей программы. Используйте
`make -k test`, чтобы запустить тесты и вывести отчет по их выполнению. Параметры `CFLAGS`,
`LDFLAGS` и `SANITIZER` также могут быть переданы программам, используемым в тестах.
- Чтобы запустить конкретный тест, посмотрите его название в отчете всех тестов (оно же название
директории с изображениями в `testers/tests`) и запустите `make -k test-<name>`. Например,
чтобы запустить тест №1 ([изначальная картинка](testers/tests/1/input.bmp) ->
[ожидаемый результат](testers/tests/1/output_expected.bmp)), используйте `make -k test-1`.
- Ваша программа будет тестироваться в
[Docker-контейнере](https://gitlab.se.ifmo.ru/low-level-programming/docker-c-test-machine/),
вы можете использовать его для тестирования вашего кода локально. В контейнере будут запущены:
- Статический анализатор - аналогичен команде `make check`
- Тесты с санитайзерами - аналогичен команде `make -k test SANITIZER=all`
- Если в вашей системе имеется статический анализатор `clang-tidy`, он будет запущен во время компиляции программы.
Список проверок описан в файле `clang-tidy-checks.txt`. Вы можете добавить свои проверки в конец этого файла.
- Директория `tester` содержит код и изображения для тестирования вашей программы. Для запуска тестов используется CTest.
- Поддержана интеграция системы сборки со средами разработки CLion, Visual Studio и Visual Studio Code.
Чтобы система сборки работала на вашей системе, вам необходимо:
### Linux и MacOS
- Компилятор (`gcc`/`clang`) и `cmake` (проверьте, что `cmake` версии 3.12 или выше)
- Если вы хотите использовать санитайзеры с GCC, установите `libasan`, `liblsan` и `libubsan` с помощью пакетного менеджера (названия могут отличаться).
- Если вы хотите использовать санитайзеры с Clang, на некоторых системах вам может понадобиться пакет `compiler-rt`.
- Если вы хотите пользоваться `clang-tidy`, установите `clang-tools-extra`.
### Windows
- Какая-либо среда разработки (CLion, Visual Studio, Visual Studio Code)
- Если вы хотите пользоваться `clang-tidy`, скачайте LLVM: https://github.com/llvm/llvm-project/releases (найдите установщик win64 под одной из версий)
- Для VS Code требуется отдельно поставить Visual Studio (с сайта Microsoft) и CMake: https://cmake.org/download/
### Инструкции по сборке и тестированию
- [Работа с терминалом](docs/Terminal.md)
- [CLion](docs/CLion.md)
- [Visual Studio](docs/Visual%20Studio.md)
- [Visual Studio Code](docs/VSCode.md)
# Для самопроверки
......
# Разработка с CLion
## 1. Выберите и склонируйте ваш форк с GitLab
![Select project from VCS](CLion/01-get-from-vcs.png)
## 2. В окне проекта, выберите `CMakeLists.txt` на панели слева
![Load CMake project](CLion/02-load-cmake-project.png)
Сверху окна с редактором появится подсказка, предлагающая загрузить CMake в проект. Нажмите **`Load CMake project`**.
В окне сборки может появиться ошибка, например: `Unexpected build type MSan, possible values: Debug;Release;ASan;LSan;UBSan`.
Она означает, что данной конфигурации на вашей ОС или с вашим компилятором не предусмотрено,
но разработке с другими конфигурациями она не помешает.
## 3. Выберите необходимую конфигурацию в раскрывающемся списке
![Choose Config](CLion/03-choose-configuration.png)
- **`Debug`** быстро компилируется и подходит для разработки.
- **`ASan, LSan, MSan, UBSan`** подходят для отладки ошибок сегментации и других проблем с памятью. Рекомендуется
запустить ваш код с санитайзерами перед отправкой на проверку!
- **`Release`** нужен для сборки кода с оптимизациями и проверки скорости выполнения.
В качестве цели для сборки выберите **`All CTest`**. Теперь вы можете собирать проект и
запускать его через кнопки сверху справа как обычно.
Если при сборке вы получили ошибку вроде `C:\CLion 2022.2.4\bin\mingw\bin/ld.exe: cannot find -lasan`, значит, у вас
нет нужной библиотеки для запуска данного профиля. Можете просто выбрать другую конфигурацию.
docs/CLion/01-get-from-vcs.png

23.6 KB

docs/CLion/02-load-cmake-project.png

152 KB

docs/CLion/03-choose-configuration.png

161 KB

# Работа с терминалом
## 1. Конфигурация
```bash
$ mkdir ./build/
$ cd ./build/
$ cmake .. -DCMAKE_BUILD_TYPE=<config>
```
Вместо `<config>` можно использовать одну из существующих конфигураций:
- **`Debug`** быстро компилируется и подходит для разработки.
- **`ASan, LSan, MSan, UBSan`** подходят для отладки ошибок сегментации и других проблем с памятью. Рекомендуется
запустить ваш код с санитайзерами перед отправкой на проверку!
- **`Release`** нужен для сборки кода с оптимизациями и проверки скорости выполнения.
## 2. Сборка
```bash
$ cmake --build ./build/
```
Исполняемые файлы `./build/solution/image-transformer` и `./build/tester/image-matcher`
будут собраны, их можно использовать для ручного тестирования.
## 3. Тестирование
```bash
$ cmake --build ./build/ --target check
# ИЛИ
$ cd ./build/
$ ctest --output-on-failure
```
## Бонус: `ssh` + `git`
### Как настроить SSH ключи
```bash
$ ssh-keygen
$ cat ~/.ssh/id_rsa.pub
```
В настройках профиля GitLab нужно открыть категорию `SSH Keys`, добавить новый
ключ и скопировать содержимое `id_rsa.pub` туда.
### Как склонировать форк
```bash
$ git clone ssh://git@gitlab.se.ifmo.ru:4815/<my username>/assignment-image-rotation.git
$ cd ./assignment-image-rotation/
```
### Как отправить свои изменения обратно в форк
```bash
$ git add ./solution/
$ git status
$ git commit -m "Lab complete"
$ git push origin master
```
После того, как вы откроете merge request, каждое новое изменение, добавленное таким образом,
будет появляться там автомагически.
### Как обновить свою лабораторную, если преподаватель попросил "подтянуть к себе свежие изменения" из основного репозитория
```bash
$ git remote add upstream ssh://git@gitlab.se.ifmo.ru:4815/programming-languages/assignment-image-rotation.git
$ git fetch upstream
$ git checkout master
$ git merge upstream/master
$ git remote remove upstream
```
docs/VS/01-vcs.png

20.7 KB

docs/VS/02-folder-view.png

40.5 KB

docs/VS/03-choose-config.png

55.4 KB

docs/VS/04-tests.png

63.7 KB

# Разработка с Visual Studio Code
Для разработки требуются расширения:
- **`CMake`** от `twxs`
- **`CMakeTools`** от `Microsoft`
- **`C/C++`** от `Microsoft`
Перезагрузите VSCode после установки расширений.
## 1. Выберите и склонируйте ваш форк с GitLab
![Clone repository](VSCode/01-clone.png)
## 2. В окне проекта, выберите компилятор
![Choose Kit](VSCode/02-choose-kit.png)
VSCode предложит выбрать компилятор при открытии проекта. Если он этого не сделал,
кликните по кнопке с гаечным ключом на нижней панели.
На Windows, вероятнее всего, вам нужен компилятор `Visual Studio` с версией `amd64`.
## 3. Выберите конфигурацию на нижней панели
![Choose Config](VSCode/03-choose-config.png)
- **`Debug`** быстро компилируется и подходит для разработки.
- **`ASan, LSan, MSan, UBSan`** подходят для отладки ошибок сегментации и других проблем с памятью. Рекомендуется
запустить ваш код с санитайзерами перед отправкой на проверку!
- **`Release`** нужен для сборки кода с оптимизациями и проверки скорости выполнения.
На той же нижней панели, используйте кнопку **`Build`** для сборки кода и **`Run CTests tests`** для запуска тестов.
Если во время сборки вы видите ошибку вроде `...\Microsoft.CppBuild.targets(457,5): error MSB8013: This project doesn't contain the Configuration and Platform combination of MSan|x64`, это означает что выбранная конфигурация на вашей системе не поддержана - выберите другую.
docs/VSCode/01-clone.png

66.6 KB

docs/VSCode/02-choose-kit.png

114 KB

docs/VSCode/03-choose-config.png

85.9 KB

# Разработка с Visual Studio
## 1. Выберите и склонируйте ваш форк с GitLab
![Select project from VCS](VS/01-vcs.png)
## 2. В окне решения, выберите `Folder View` на панели слева
![Select Folder View](VS/02-folder-view.png)
Visual Studio запустит конфигурацию проекта с помощью CMake в профиле по умолчанию (**`x64-Debug`**).
## 3. Выберите необходимую конфигурацию в раскрывающемся списке
![Choose Config](VS/03-choose-config.png)
- **`x64-Debug`** быстро компилируется и подходит для разработки.
- **`x64-Asan`** подходит для отладки ошибок сегментации и других проблем с памятью. Рекомендуется
запустить ваш код в Asan перед отправкой на проверку!
- **`x64-Release`** нужен для сборки кода с оптимизациями и проверки скорости выполнения.
## 4. Используйте панели сверху для запуска сборки и тестирования
![Run build and tests](VS/04-tests.png)
- Варианты для сборки находятся в меню **`Build`**. Для сборки всего решения нажмите **`F7`**.
- Для запуска тестов выберите **`Run CTests for ...`** в меню **`Test`**.
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment