Skip to content

Использование CMake для проектов на C и CPP

Sergej Jaskiewicz edited this page Aug 16, 2016 · 2 revisions

Для сборки криптографической библиотеки мы используем CMake в качестве фронтенда.

CMake — кросс-платформенное семейство инструментов, созданных для сборки, тестирования и упаковки программного обеспечения. CMake позволяет контролировать процесс компиляции с помощью простых конфигурационных файлов, независимых от платформы и компилятора, а также генерировать нативные мейкфайлы и воркспейсы, работающие во многих средах.

Используя CMake, можно не только генерировать мейкфайлы Unix для сборки и тестирования с помощью команд make и make test, но также и полнофункциональные проекты Microsoft Visual Studio или Apple Xcode, то есть для разработки можно продолжать использовать IDE, которая вам нравится.

Все настройки сборки прописаны в файле CMakeLists.txt.

Установка

Прежде всего необходимо установить CMake. Загрузить его для вашей операционной системы можно здесь. Установите инструмент и выполните следующие инструкции

Если вам нравится графический интерфейс

  1. Откройте CMake.
  2. В первом текстовом поле (source code) пропишите путь до директории с файлом CMakeLists.txt, в нашем случае — папки GroupLockCrypto.
  3. Во втором поле (binaries) пропишите путь до папки Build. CMake GUI
  4. Нажмите Configure. Выберите, для какой среды вы хотите сгенерировать проект: Visual Studio, Makefile или какой-то другой. CMake Configuration
  5. Когда закончится конфигурирование, нажмите Generate. После этого в директории Build появятся файлы сгенерированных проектов.

Если вам нравится командная строка (и краткость)

  1. Убедитесь в наличии утилит CMake для командной строки и при необходимости установите их (ToolsHow To Install For Command Line Use).
  2. Смените текущую директорию на Build (GroupLockCrypto/Build)
  3. Выполните команду cmake .. (обратите внимание на точки!), если хотите сгенерировать мейкфайл — это происходит по умолчанию, если другие возможности не указаны в качестве параметров. В противном случае выполните cmake .. -G <generator name>. Замените <generator name> на "Visual Studio 15" или Xcode или whatever you want.

Когда всё готово и необходимые файлы сгенерированы, вы можете работать над проектом в той среде, в которой привыкли. Важно следить за тем, чтобы исходники не покидали папку Source, так как в текущей конфигурации CMake ищет все файлы с расширениями *.h и *.cpp, находящиеся в этой папке.

Важно: Не коммитьте файлы, сгенерированные CMake. После генерации воркспейса для вашей любимой IDE можно создавать, удалять и изменять исходники (опять же, чтобы они не покидали директории Source/), коммитить их, пушить и выгружать с сервера. Если в файле CMakeLists.txt что-то изменится, CMake переконфигурирует и сгенерирует заново проект, как только вы нажмёте Build, так что нет никакого смысла держать эти сгенерированные файлы в репозитории.

Добавление зависимости

В этой статье мы не будем полностью описывать синтаксис и схему работы конфигов CMake. Её цель — рассказать вкратце и как можно более понятно о том, как добавить внешнюю библиотеку в проект.

Прежде всего нужно организовать правильную иерархию директорий. На настоящий момент используется следующая иерархия:

GroupLockCrypto
|---- Build
|     |---- .gitignore
|
|---- Source
|     |---- *.h
|     |---- *.cpp
|
|---- libsodium
|     |---- Darwin
|     |     |---- libsodium.a
|     |
|     |---- Linux
|     |     |---- libsodium.a
|     |
|     |---- Windows
|     |     |---- libsodium.lib
|     |
|     |---- include
|           |---- *.h
|
|----CMakeLists.txt

В корне находится конфигурационный файл CMakeLists.txt. Директория Build предназначена для исполнения в ней команды cmake .. — CMake складывает в неё сгенерированные файлы. Мы не хотим, чтобы они попали в репозиторий, поэтому файл .gitignore предотвращает попадание в репозиторий всего содержимого Build, кроме себя.

Директория Source содержит исходные коды и заголовки основного проекта, в данном случае — нашей криптографической библиотеки.

Все остальные директории в корне служат для внешних библиотек. Допустим, мы хотим подключить к нашему проекту библиотеку libsodium. Мы также хотим без особых усилий подключать заголовки этой библиотеки в исходниках. Нам нужно только организовать иерархию и добавить имя библиотеки в CMakeLists.txt, а всё остальное CMake сделает за нас.

Для начала создадим в корне папку libsodium и поместим внутрь четыре поддиректории: include, Darwin, Linux и Windows. В первой будут лежать все заголовочные файлы внешней библиотеки, которые мы сможем подключать. В трёх остальных директориях, названия которых совпадают с названиями операционных систем, лежат скомпилированные файлы импортируемой нами библиотеки. (В папке Darwin — файлы для macOS, ибо в основе macOS лежит операционная система Darwin). Имена этих файлов без расширения также должны совпадать с именем библиотеки.

Теперь добавим имя нашей библиотеки в конфиг. В секции IMPORTED LIBRARIES файла CMakeLists.txt есть строка

set(IMPORTED_LIBS libsodium)

Эта строка устанавливает значение переменной IMPORTED_LIBS как libsodium и это всё, что нам нужно сделать. Если мы хотим несколько библиотек, нужно просто перечислить их имена через пробел:

set(IMPORTED_LIBS libsodium libdispatch libwhatever)

(Не забыв, разумеется, точно так же для каждой из них организовать иерархию директорий.)

Разработка

  1. Стили кодирования
  • [Java](Код стайл для языка Java)
  • [C/C++](Стиль написания кода на С )
  • [C#](Стиль написания кода на С# )
  • [Swift](Руководство по оформлению кода на языке Swift )
  • Написание комментариев к коммитам
  1. Android
  • Android DevGuide
  • [QR codes](Работа c QR на Android)
  • [Полезные вещи](Полезные вещи для Android разработки)
  • [Архитектура приложения](Архитектура приложения)
  • [Используемые компоненты](Используемые компоненты)
  • [Инструкция по сборке проекта](Инструкция по сборке проекта)
  1. iOS
  1. C и C++
  • [Использование CMake для проектов на C++ и C ](Использование CMake для проектов на C и CPP)

Описание

  1. Форматы файлов
  • [.bmp](Cтруктура хранения bmp файлов)
  • [.jpg](Cтруктура хранения jpg файлов)
  • [.png](Cтруктура хранения png файлов)
  1. Алгоритмы шифрования
  1. Примеры использования
  • [Библиотека матричной алгебры](Пример использования библиотеки матричной алгебры)
  1. Описание процесса кодирования файла
  2. Способ обезопасить использование приложения
  3. Java фасад библиотеки алгоритмов
  4. Алгоритм шифрования bmp на java заглушке

Тест-кейсы

  1. Матричная арифметика
  • [A+B](Сложение матриц)
  • [A*p](Умножение матрицы на скаляр)
  • [A*B](Умножение матриц)
  • [Обратные матрицы](Нахождение обратной матрицы)
  1. Взятие по модулю
  • [A mod p](Взятие матрицы по модулю простого числа)
  • [A mod P](Взятие матрицы по модулю - матрицы из простых чисел)
  1. Суперпозиция (модуль - простое число)
  • [A+B mod p](Сложение матриц по модулю простого числа)
  • [A*c mod p](Умножение матрицы на скаляр по модулю простого числа)
  • [A*B mod p](Умножение матриц по модулю простого числа)
  1. Суперпозиция (модуль - матрицы из простых чисел)
  • [A+B mod P](Сложение матриц по модулю - матрице простых чисел)
  • [A*c mod P](Умножение матрицы на скаляр по модулю - матрице простых чисел)
  • [A*B mod P](Умножение матриц по модулю - матрице простых чисел)

##Прочее

  1. [Утечки памяти](Memory Leaks)
  2. [Базовые цвета](Базовые цвета)
  3. [Clean Architecture](Clean Architecture)
Clone this wiki locally