Установить cmake для windows

Знакомство с CMake. Часть 1. Установка, CMakeLists.txt, сборка.

Введение.

Многие, кто начинал создавать собственные программы, пользовался какой-либо системой сборки. В общем, система сборки – это набор инструментов, облегчающий работу с компилятором. Это включает в себя компиляцию, линковку, установку, а также сбор исходных файлов для передачи их компилятору и слежение за зависимостями. Также современные системы сборки облегчают работу с библиотеками, позволяют создавать переносимые проекты и выполняют ещё массу других вкусностей. Эта статья посвящена популярной системе сборки CMake и расскажет, как правильно её установить и настроить, а также будет рассмотрен простой пример её использования. Она рассчитана на тех, что хоть немного знаком с понятиями make, Makefile, компиляция, линковка.

Установка в Linux.

Для популярных дистрибутивов Linux типа Debian, Gentoo, Fedora и т.д. CMake давно лежит в официальных репозиториях. Нам нужно всего лишь установить пакет cmake с помощью менеджера пакетов. Как правило, он устанавливается в системные директории, и необходимости править переменные окружения нету. Можете проверить её работоспособность, выполнив

Если же в репозитории нет такого пакета, то можно его собрать вручную. Скачиваем Unix/Linux Source, например, cmake-3.5.0-rc3.tar.gz, распаковываем и собираем:

Если нет необходимости устанавливать в системную /usr директорию, можно в аргументе —prefix прописать нужный корень установки. По умолчанию, без явного указания —prefix, установка будет произведена в /usr/local. -j используется для ускорения сборки, например, на 4-х ядерном процессоре можно указать -j4, и сборка будет вестись параллельно в 4 потока.

Установка в Windows.

Для Windows на сайте CMake лежит установочный файл msi. Рекомендую при установке отметить галочку добавления пути в переменные окружения PATH для всех пользователей. Тогда, после перелогинивания, CMake будет доступен из любого места. Проверить можно, открыв cmd и выполнив тот же

Полное руководство по CMake. Часть вторая: Система сборки

В данной статье рассмотрено использование системы сборки CMake, применяемой в колоссальном количестве проектов на C/C++. Строго рекомендуется прочитать первую часть руководства во избежание непонимания синтаксиса языка CMake, явным образом фигурирующего на протяжении всей статьи.

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

Система сборки CMake представляет из себя оболочку над другими платформенно зависимыми утилитами (например, Ninja или Make). Таким образом, в самом процессе сборки, как бы парадоксально это ни звучало, она непосредственного участия не принимает.

Система сборки CMake принимает на вход файл CMakeLists.txt с описанием правил сборки на формальном языке CMake, а затем генерирует промежуточные и нативные файлы сборки в том же каталоге, принятых на Вашей платформе.

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

Проверка версии CMake

Команда cmake_minimum_required проверяет запущенную версию CMake: если она меньше указанного минимума, то CMake завершает свою работу фатальной ошибкой. Пример, демонстрирующий типичное использование данной команды в начале любого CMake-файла:

Читайте также:  Processor architecture in windows

Оформление проекта

В начале любого CMakeLists.txt следует задать характеристики проекта командой project для лучшего оформления интегрированными средами и прочими инструментами разработки.

Стоит отметить, что если ключевое слово LANGUAGES опущено, то по умолчанию задаются языки C CXX . Вы также можете отключить указание любых языков путём написания ключевого слова NONE в качестве списка языков или просто оставить пустой список.

Запуск скриптовых файлов

Команда include заменяет строку своего вызова кодом заданного файла, действуя аналогично препроцессорной команде include языков C/C++. Этот пример запускает скриптовый файл MyCMakeScript.cmake описанной командой:

В данном примере, первое сообщение уведомит том, что переменная TEST_VARIABLE ещё не определена, однако если скрипт MyCMakeScript.cmake определит данную переменную, то второе сообщение уже будет информировать о новом значении тестовой переменной. Таким образом, скриптовый файл, включаемый командой include , не создаёт собственной области видимости, о чём метко упомянули в комментариях к предыдущей статье.

Компиляция исполняемых файлов

Команда add_executable компилирует исполняемый файл с заданным именем из списка исходников. Важно отметить, что окончательное имя файла зависит от целевой платформы (например, .exe или просто ). Типичный пример вызова данной команды:

Компиляция библиотек

Команда add_library компилирует библиотеку с указанным видом и именем из исходников. Важно отметить, что окончательное имя библиотеки зависит от целевой платформы (например, lib

  • .a или
  • .lib ). Типичный пример вызова данной команды:

    • Статические библиотеки задаются ключевым словом STATIC вторым аргументом и представляют из себя архивы объектных файлов, связываемых с исполняемыми файлами и другими библиотеками во время компиляции.
    • Динамические библиотеки задаются ключевым словом SHARED вторым аргументом и представляют из себя двоичные библиотеки, загружаемые операционной системой во время выполнения программы.
    • Модульные библиотеки задаются ключевым словом MODULE вторым аргументом и представляют из себя двоичные библиотеки, загружаемые посредством техник выполнения самим исполняемым файлом.
    • Объектные библиотеки задаются ключевым словом OBJECT вторым аргументом и представляют из себя набор объектных файлов, связываемых с исполняемыми файлами и другими библиотеками во время компиляции.

    Добавление исходников к цели

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

    Первым аргументом команда target_sources принимает название цели, ранее указанной с помощью команд add_library или add_executable , а последующие аргументы являются списком добавляемых исходных файлов.

    Повторяющиеся вызовы команды target_sources добавляют исходные файлы к цели в том порядке, в каком они были вызваны, поэтому нижние два блока кода являются функционально эквивалентными:

    Генерируемые файлы

    Местоположение выходных файлов, сгенерированных командами add_executable и add_library , определяется только на стадии генерации, однако данное правило можно изменить несколькими переменными, определяющими конечное местоположение двоичных файлов:

    • Переменные RUNTIME_OUTPUT_DIRECTORY и RUNTIME_OUTPUT_NAME определяют местоположение целей выполнения.
    • Переменные LIBRARY_OUTPUT_DIRECTORY и LIBRARY_OUTPUT_NAME определяют местоположение библиотек.
    • Переменные ARCHIVE_OUTPUT_DIRECTORY и ARCHIVE_OUTPUT_NAME определяют местоположение архивов.

    Исполняемые файлы всегда рассматриваются целями выполнения, статические библиотеки — архивными целями, а модульные библиотеки — библиотечными целями. Для «не-DLL» платформ динамические библиотеки рассматриваются библиотечными целями, а для «DLL-платформ» — целями выполнения. Для объектных библиотек таких переменных не предусмотрено, поскольку такой вид библиотек генерируется в недрах каталога CMakeFiles .

    Важно подметить, что «DLL-платформами» считаются все платформы, основанные на Windows, в том числе и Cygwin.

    Компановка с библиотеками

    Команда target_link_libraries компанует библиотеку или исполняемый файл с другими предоставляемыми библиотеками. Первым аргументом данная команда принимает название цели, сгенерированной с помощью команд add_executable или add_library , а последующие аргументы представляют собой названия целей библиотек или полные пути к библиотекам. Пример:

    Читайте также:  Как узнать свою версию windows 10 build

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

    Добавление подпроектов

    Команда add_subdirectory побуждает CMake к незамедлительной обработке указанного файла подпроекта. Пример ниже демонстрирует применение описанного механизма:

    В данном примере первым аргументом команды add_subdirectory выступает подпроект subLibrary , а второй аргумент необязателен и информирует CMake о папке, предназначенной для генерируемых файлов включаемого подпроекта (например, CMakeCache.txt и cmake_install.cmake ).

    Стоит отметить, что все переменные из родительской области видимости унаследуются добавленным каталогом, а все переменные, определённые и переопределённые в данном каталоге, будут видимы лишь ему (если ключевое слово PARENT_SCOPE не было определено аргументом команды set ). Данную особенность упомянули в комментариях к предыдущей статье.

    Поиск пакетов

    Команда find_package находит и загружает настройки внешнего проекта. В большинстве случаев она применяется для последующей линковки внешних библиотек, таких как Boost и GSL. Данный пример вызывает описанную команду для поиска библиотеки GSL и последующей линковки:

    В приведённом выше примере команда find_package первым аргументом принимает наименование пакета, а затем требуемую версию. Опция REQUIRED требует печати фатальной ошибки и завершении работы CMake если требуемый пакет не найден. Противоположность — это опция QUIET , требующая CMake продолжать свою работу, даже если пакет не был найден.

    Далее вызывается команда include_directories , информирующая компилятора о расположении заголовочных файлов библиотеки GSL. Обратите внимание на то, что используется переменная GSL_INCLUDE_DIRS , хранящая местоположение описанных мною заголовков (это пример импортированных настроек пакета).

    В конечном итоге, исполняемый файл MyExecutable линкуется с библиотекой GSL командой target_link_libraries с помощью переменной GSL::gsl , инкапсулирующей расположение самой GSL.

    Вам, вероятно, захочеться проверить результат поиска пакета, если Вы указали опцию QUIET . Это можно сделать путём проверки переменной

    _FOUND , автоматически определяемой после завершения команды find_package . Например, в случае успешного импортирования настроек GSL в Ваш проект, переменная GSL_FOUND обратится в истину.

    В общем случае, команда find_package имеет две разновидности запуска: модульную и конфигурационную. Пример выше применял модульную форму. Это означает, что во время вызова команды CMake ищет скриптовый файл вида Find

    .cmake в директории CMAKE_MODULE_PATH , а затем запускает его и импортирует все необходимые настройки (в данном случае CMake запустила стандартный файл FindGSL.cmake ).

    Установка проекта

    Команда install генерирует установочные правила для Вашего проекта. Данная команда способна работать с целями, файлами, папками и многим другим. Сперва рассмотрим установку целей.

    Для установки целей необходимо первым аргументом описанной функции передать ключевое слово TARGETS , за которым должен следовать список устанавливаемых целей, а затем ключевое слово DESTINATION с расположением каталога, в который установятся указанные цели. Данный пример демонстрирует типичную установку целей:

    Процесс описания установки файлов аналогичен, за тем исключением, что вместо ключевого слова TARGETS следует указать FILES . Пример, демонстрирующий установку файлов:

    Процесс описания установки папок также аналогичен, за тем исключением, что вместо ключевого слова FILES следует указать DIRECTORY . Важно подметить, что при установке будет копироваться всё содержимое папки, а не только её название. Пример установки папок выглядит следующим образом:

    После завершения обработки CMake всех Ваших файлов Вы можете выполнить установку всех описанных объектов командой sudo make install (если CMake генерирует Makefile ), или же выполнить данное действие интегрированной средой разработки, поддерживающей CMake.

    Читайте также:  Transcribe для windows 10

    Наглядный пример проекта

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

    Главный файл сборки CMakeLists.txt описывает компиляцию всей программы: сперва происходит вызов команды add_executable , компилирующей исполняемый файл, затем вызывается команда add_subdirectory , побуждающая обработку подпроекта, и наконец, исполняемый файл линкуется с собранной библиотекой:

    Файл core/CMakeLists.txt вызывается главным файлом сборки и компилирует статическую библиотеку MyProgramCore , предназначенную для линковки с исполняемым файлом:

    После череды команд cmake . && make && sudo make install работа системы сборки CMake завершается успешно. Первая команда побуждает обработку файла CMakeLists.txt в корневом каталоге проекта, вторая команда окончательно компилирует необходимые двоичные файлы, а третья команда устанавливает скомпанованный исполняемый файл MyProgram в систему.

    Заключение

    Теперь Вы способны писать свои и понимать чужие CMake-файлы, а подробно прочитать про остальные механизмы Вы можете на официальном сайте.

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

    Toliak / Guide.md

    Прописывается основная информация для сборки через CMake.

    Прописываются возможные опции сборки (могут отсутствовать)

    Чтобы установить значение опции, отличное от «по умолчанию», необходимо дописать -DНАЗВАНИЕ_ОПЦИИ=Значение к команде конфигурирования. Команда после этого может выглядеть, например, так:

    Чтобы сделать такое действие в CLion, необходимо перейти в: Settings -> CMake -> CMake options.

    Если используется Hunter (пакетный менеджер), то прописываются его настройки

    На этапе конфигурирования, CMake ожидает файл tools/gate/cmake/HunterGate.cmake .

    Если этот файл не существует, возможны 2 варианта:

    • Необходимо добавить гит подмодуль:

    git submodule add https://github.com/hunter-packages/gate.git tools/gate

    • Либо (если используется шаблонный репозиторий) необходимо обновить подмодули:

    git submodule update —init —recursive

    URL и SHA1 ядра Hunter можно получить в релизах: https://github.com/hunter-packages/gate.git

    Дополнительные опции для компилятора (могут отсутствовать)

    Подключение зависимых библиотек

    Затем осуществляется подключение библиотек, в которых нуждается проект (Boost, GTest, Threads и т.д.)

    Указания для Hunter о необходимо коллекционирования указанных пакетов

    Указания о том, какие пакеты будут использованы (ожидается их наличие)

    CONFIG — ключевое слово, показывающее маску названий конфигурационных файлов.

    REQUIRED — обязательность подключения пакета (иначе — ошибка).

    Добавление целей сборки

    После настройки окружающией среды пишется информация о том, что ожидается получить в результате сборки

    Указание директорий с заголовочными файлами

    Указание библиотек для линковки

    Названия библиотек из Hunter, как правило, имеют вид LibraryName::ComponentName .

    Данные о библиотеках из пакета, добавленного через find_package хранятся в переменных. Например, для Threads: $

    Для сборки тестирования необходимо наличие:

    1. Добавления пакета googletest (GTest в Hunter)
    2. Цели для сборки исполняемого файла
    3. Линковки gtest_main и gtest (GTest::main и GTest::gtest в Hunter) к цели
    4. Включенного тестирования в конфигурационном файле

    Можно добавлять несколько тестовых целей под разными названиями. И даже с использованием разных фреймворков.

    Для сборки и выполнения тестирования необходимо выполнить следующую команду (ожидается предварительное конфигурирование):

    Пример тела конфигурационного файла с тестированием:

    Для удобства в CLion необходимо добавить конфигурацию сборки google test.

    Начало конфигурации. Как правило, его трогать не надо.

    Далее прописываются цели, которые будут проанализированы на процент покрытия.

    Конец конфигурации. Как правило, не надо трогать.

    Для начала необходимо настроить окружение. Как правило, это не надо трогать

    Далее необходимо указать jobs’ы, которые будет выполнять Travis. Jobs содержит название и команды.

    К таким относятся, например, правила для веток и для уведомлений. Например:

  • Оцените статью