Как установить cmake на windows

Обновлено: 04.07.2024

CMake считывает файлы сценария и генерирует входные файлы для системы сборки той платформы, на которой он запущен. Он может создавать GNU Makefiles, файлы проекта KDevelop , файлы проекта XCode и файлы проекты Visual Studio.

CMake — это свободное программное обеспечение, выпущенное под лицензией, подобной BSD. CMake разработана Kitware Inc.

Здесь приведены несколько интересных ссылок, где вы можете найти информацию о CMake:

Также вы можете присоединиться к CMake mailing list.

CMake — это официальный инструмент для выпуска KDE 4, решение использовать который было принято в марте 2006, главным образом из-за технических преимуществ по сравнению с более старыми инструментами KDE: automake и unsermake.

  • CMake разработан независимо от KDE и может быть использован другими проектами
  • Время компиляции значительно меньше, главным достоинством является то, что он больше не испольует libtool
  • Файлы сборки более просты для написания

Как скомпилировать KDE с использованием CMake

Получение и установка CMake

Linux, BSD, и другие Unix системы

Загрузите последнюю стабильную версию CMake с [1].

Разархивируйте и скомпилируйте CMake:

По умолчанию CMake будет установлен в /usr/local, поэтому убедитесь, что путь /usr/local/bin есть в переменной окружения PATH. Чтобы изменить путь для установки (например сделать /usr для debian), добавьте '--prefix=PATH' к команде bootstrap.

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

Windows

Загрузите последнюю стабильную версию CMake с [2].

Запустите инсталлятор CMake.

По умолчанию CMake будет установлен в C:\Program Files\CMake 2.4, поэтому убедитесь, что <installpath>\bin находиться в вашей переменной окружения.

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

Запуск CMake

CMake генерирует файлы описывающие правила сборки в формате системного инструментария.

Linux, BSD, и другие Unix системы

Если у вас kdelibs/ в папке

/src/kdelibs/, вам необходимо сделать следующее:

Этот код сгенерирует файлы Makefile для сборки kdelibs/ в kdelibs-build/.

Windows

Если у вас kdelibs\ in c:\src\kdelibs\, вам необходимо сделать следующее:

Этот код сгенерирует файлы Makefile для сборки kdelibs\ в kdelibs-build\. Также см.[Projects/KDE_on_Windows|KDE в Windows]].

Файлы проекта KDevelop

Если вы предпочитайте файлы проекта KDevelop (файлы Makefile и некоторые дополнительные файлы для KDevelop):

Используйте 'cmake -h', чтобы узнать, какие генераторы CMake поддерживаются.

CMake и Qt4

Чтобы определить местонахождение Qt 4, CMake ищет qmake в переменной окружения PATH. CMake не использует переменную окружения QTDIR.

Более подробная информация

Когда CMake завершает работу, он создает файл CMakeCache.txt. Этот файл содержит все данные собранные о вашей системе. Если вы хотите запустить CMake с другим генератором или хотите, чтобы CMake определил всё заново, удалите этот файл.

Если CMake не находит что-либо, но вы знайте, что это что-то у вас установлено, можно вручную сказать CMake, где это следует искать. CMake использует переменные для хранения этой информации. Эти переменные могут кешироваться в уже упомянутом CMakeCache.txt. Есть три способа задать эти переменные вручную:

  • Сказать CMake с помощью командной строки, чтобы он скоректировал значение: cmake ../kdelibs -D <имя_переменной>=<значение>
  • использовать ccmake, который предоставляет интерфейс на базе библиотеки curses для изменения значений переменных CMake (запустив: ccmake ../kdelibs)
  • редактировать файл CMakeCache.txt напрямую (не рекомендуется)

Вам следует запустить ccmake ../kdelibs по крайней мере один раз, чтобы получить представление, какие переменные использует CMake. Нажмите T, чтобы увидеть также «продвинутые» переменные. Так, если CMake не находит что-либо, запустите ccmake и установите это вручную.

Аргументы командной строки

Вы можете установить некоторые параметры через аргументы командной строки:

  • CMAKE_INSTALL_PREFIX: cmake ../kdelibs -DCMAKE_INSTALL_PREFIX=/opt/kde4 это тоже самое, что ./configure --prefix=/opt/kde4
  • CMAKE_BUILD_TYPE: определяет, какой тип сборки: debugfull, debug, profile, relwithdebinfo и release. По умолчанию этот параметр равен relwithdebinfo (-O2 -g). Посмотрите FindKDE4Internal.cmake для более подробной информации.
  • KDE4_BUILD_TESTS=ON: создает файлы Makefile включающие инструкции по сборке тестов, создаёт цели 'test'
  • KDE4_TEST_OUTPUT=xml: Unit tests using the QTestLib framework will create xml formatted logfiles.
  • KDE4_DISABLE_MULTIMEDIA=ON: Компилирует KDE без какой-либо мультимедиа (аудио, видео) поддержки.
  • RPATH_STYLE: Этот параметр больше недоступен. By default everything will be built with RPATH set correctly. If you don't want RPATH at all, set CMAKE_SKIP_RPATH to TRUE.
  • BUILD_чёто=OFF: отключает сборку подпапки 'чёто'.
  • WITH_чёто: есть несколько опций типа WITH_CUPS или WITH_Jasper. Если вы отключите их, cmake даже не будет искать этот пакет в системе. Если опция включена, cmake будет искать установочный пакет. Если у cmake не получится его найти, вы по-прежнему можете настроить cmake вручную как было описано выше.

Переменные окружения

Если у вас есть заголовочные файлы и библиотеки, установленные в нестандартные директории, которые cmake не может найти (например fink на Mac OSX установлена в /sw), тогда вам необходимо установить следующие переменные окружения (несмотря на похожие соглашения о наименовании, они не будут работать как аргументы командной строки cmake):

  • CMAKE_INCLUDE_PATH, например export CMAKE_INCLUDE_PATH=/sw/include
  • CMAKE_LIBRARY_PATH, например export CMAKE_LIBRARY_PATH=/sw/lib

Идём дальше

Если cmake завершился неудачно, вы увидите что-то вроде этого:

Это означает, что у вас не найдена требуемая библиотека (или другая зависимость). Для того, чтобы понять, какая библиотека не найдена, найдите в каталоге cmake/modules переменную, которую сmake не может найти. Например

В данном случае не найдена библиотека Xtst. Вам необходимо найти её (возможно установив libXtst-devel) и перезапустить cmake.

Использование CMake для простого приложения

Здесь самый простой пример CMakeLists.txt

Этот файл создает выполняемый код, который называется "hello" (или "hello.exe" в Windows) из файла исходного текста main.cpp. Вы можете смешивать файлы C и C++ так как вам хочется. Вы можете иметь много исполняемых файлов и библиотек в одном CMakeLists.txt. Один и тот же файл исходного текст может быть использован для нескольких целей или может быть скомпилирован для каждой цели отдельно. Возможно, самая главная часть языка cmake — это переменные:

Используйте команду SET(), чтобы установить значение переменной. Если вы составляйте список более чем из одной строки, переменная может быть списком. Список — это список строк, разделенных точкой с запятой. Если вы установили только один элемент, вам необходимо только значение. Для получение значения переменной используйте $. Вы можете совершать операции над списком, используя FOREACH():

Команды CMake не чувствительны к регистру. Имена переменных и параметров чувствительны к регистру.

Вы можете проверять различные условия:

In the cmake Wiki there is also a tutorial on using cmake to build KDE 4 software. It is recommended reading.

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

Здесь приведен файл CmakeList, который собрирает маленький проект KDE 4:

Переменные, макросы и другую полезную информацию, относящуюся к KD можно найти на странице Development/CMake/Addons for KDE.

Расширение CMake

CMake может быть расширен использованием скриптов cmake. CMake поставляется с некоторым количеством скриптов; в UNIX они по умолчанию устанавливаются в /usr/local/share/CMake/Modules/. Библиотеки KDE также устанавливаются с набором модулей cmake в share/apps/cmake/modules/. The files located there will be preferred over the ones in the system global cmake module path. Для определения программных пакетов существуют файлы FindFOO.cmake. Более подробно об этом смотрите здесь. Вы также можете писать макросы в CMake. Они достаточно мощные, чтобы делать всё что вам нужно для сборки приложения, но они не предназначены для того, чтобы использоваться как язык программирования общего назначения.

Преобразование приложений KDE на базе autotools в приложения KDE на базе CMake

В kdesdk/cmake/ вы можете найти скрипт am2cmake . Это скрипт на языке Ruby, поэтому необходимо чтобы Ruby был установлен. Запустите am2cmake в корневой директории дерева исходных кодов:

Не забудьте переключатель --kde4, в противном случае вы не получите файлов, подходящих для сборки приложений для KDE 4. Преобразованные файлы могут работать сразу, но сложные проекты требует некоторого дополнительного редактирования.

Вы можете также:

  • добавить дополнительные директории, исользуя INCLUDE_DIRECTORIES()
  • добавить дополнительные библиотеки, используя TARGET_LINK_LIBRARIES()
  • добавить дополнительные ключи компиляции, используя ADD_DEFINITIONS()
  • добавлять проверки для "configure" , подробнее об этом можно узнать на How To Do Platform Checks и How To Find Installed Software
  • take special care of former libtool convenience libraries. They are not supported by cmake, instead there will be a file ConvenienceLibs.cmake created. In this file you will find for every convenience lib a variable, which contains all source files of this convenience lib. For the targets which linked to this convenience lib, just add the variable to the sources.
  • a file AdditionalInfo.txt will be created. There you will see all *.in and *.in.in files of your project. The stuff done in these files will have to be converted manually to cmake.

Часто задаваемые вопросы

Прочитайте раздел CMake Wiki CMake Editors Support. В нем описывается, как настроить Emacs (XEmacs тоже работает), VIM, Kate, KWrite и KDevelop.

Используйте ADD_CUSTOM_COMMAND(). Это объясняется в CMake wiki: How can I generate a source file during the build

Как видите, genembed здесь обозначен как зависимость. Это значит, что cmake должен собрать genembed перед тем, как использовать это правило.

Нет. $KDEDIR устарела в KDE 4.

Почему я получаю ошибки при компиляции, такие как /usr/lib/qt4/include/QtCore/qstring.h:536: undefined reference to `QString::fromLatin1_helper(char const*, int)'?

A: Если у вас старая версия Qt4 в директории qt/lib, вы должны удалить старые (4.0.1) файлы.

Как я могу указать cmake создавать подробные makefiles? Я хочу видеть, какие точно запускаются команды в процессе сборки.

Передайте переменную VERBOSE в make, то есть

Более подробную информацию можно найти на CMake wiki: Is there an option to produce more 'verbose' compiling?

В сгенерированном Makefile нет цели 'make distclean'. Как я могу очистить всё, включаю кешированные файлы?

Удалите директорию, в которой было собрано приложение или просто удалите её содержимое.

Возможно, вы слышали о нескольких инструментах Make, таких как GNU Make, qmake QT, MS nmake от Microsoft, Make BSD (pmake), Makepp и так далее. Эти инструменты Make следуют различным спецификациям и стандартам, и формат исполняемого ими файла Makefile сильно различается. Это создает серьезную проблему: если программное обеспечение хочет кросс-платформенное, оно должно гарантировать, что оно может быть скомпилировано на разных платформах. Если вы используете вышеупомянутый инструмент Make, вы должны написать Makefile для каждого стандарта, что будет сумасшедшей работой.

CMake - это инструмент, разработанный для решения вышеуказанной проблемы: сначала он позволяет разработчикам написать независимый от платформы файл CMakeList.txt для настройки всего процесса компиляции, а затем генерирует требуемый локализованный Makefile и файл проекта в соответствии с платформой целевого пользователя. Например, Unix Makefile или Windows Visual Project. Так что «Пиши один раз, беги везде».

Также очень удобно использовать CMake в Windows.В дополнение к традиционному методу командной строки использования CMake, существует также простая программа с графическим интерфейсом cmake-gui.exe для использования CMake.

Установить CMake

Использование CMake GUI


После установки CMake будет создан ярлык. Нажмите Run, чтобы запустить CMake-gui.exe. Это программа с графическим интерфейсом CMake, как показано на следующем рисунке:

Поле редактирования исходного кода - это путь, в который вводится код. Этот путь может найти файл CMakeLists.txt.

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

Поскольку в конечном итоге CMake генерирует соответствующий файл проекта VS в Windows через файл CMakeLists.txt, различные версии VS также влияют на окончательный файл проекта VS, поэтому в диалоговом окне настройки необходимо выбрать инструмент компиляции кода, как показано на рисунке:

Ниже в качестве примера используется код тестового проекта Google для использования CMake-gui, введите путь, соответствующий тесту Google, и нажмите кнопку «Создать», чтобы создать компиляцию в каталоге E: / googletest / googletest / build. Файлы проекта:


Откройте файл gtest.sln с помощью vs, и вы можете скомпилировать тестовый код Google.

Использование командной строки в CMake более сложное, чем в GUI, но оно более мощное и заслуживает изучения. Ниже приведен метод вызова командной строки CMake:

Генерация скомпилированных файлов проекта

cmake <CMakeLists.txt_Path> Это для создания файла проекта, который может быть скомпилирован. Где находится каталог, который работал в то время, и какой каталог является сгенерированным скомпилированным файлом проекта. Например, файл CMakeLists.txt находится в каталоге f: cmake, а когда вы запускаете cmake в каталоге f: cmakebuild, сгенерированный файл проекта компиляции находится в каталоге f: cmakebuild. Вы также можете добавить значения переменных через -D при создании скомпилированного файла проекта. Например, содержимое CMakeLists.txt выглядит следующим образом:

Мы можем установить значение EXECUTABLE_OUTPUT_PATH путем выбора -D, который также является выходным каталогом скомпилированного файла:

Таким образом, мы передали новое значение EXECUTABLE_OUTPUT_PATH в сценарий компиляции CMakeLists.txt.

Скомпилируйте проект

В дополнение к генерации файлов проекта компиляции, CMake может также вызвать проект системы компиляции для компиляции проекта, например:

По умолчанию компиляция выполняется в режиме отладки, и ее также можно передать - после передачи параметра MSBUILD в управление:

Режим командной строки

CMake имеет режим командной строки -E, который предоставляет некоторые часто используемые функции, такие как копирование файлов, создание каталогов, чтение и запись реестра, чтение и запись переменных среды, вычисление значения md5 и так далее. Скрипт может вызывать эти функции.

Создать исполняемую программу

Сначала начните с создания простейшей исполняемой программы. Содержимое CMakeLists.txt выглядит следующим образом:

Первая строка - это минимальная версия, необходимая для cmake. В настоящее время это ВЕРСИЯ 2.6, которая, как правило, не нуждается в модификации.

4 указывают, что мы создали проект с именем LearnCMake, соответствующий LearnCMake.sln. Функция проекта означает создание проекта. В то же время были сгенерированы 4 переменные:

Строка 5 означает добавление исполняемого программного проекта с именем FirstExecutable, исходный код которого - hello_world.cpp. Вот полное использование add_executable:

По умолчанию создается консольный проект, плюс WIN32 указывает, что проект win32 создан следующим образом:

Позади кода проекта, вы можете добавить несколько файлов кода, разделенных пробелами.

Создать проект библиотеки

Создание проекта библиотеки аналогично созданию проекта исполняемой программы. Создание проекта библиотеки использует функцию add_library. Следующий пример:

Использование add_library выглядит следующим образом:

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

target_link_libraries используется для связывания библиотек, используется следующим образом:

установить установить переменную

Add_library и add_executable могут добавлять несколько исходных файлов следующим образом:

Мы можем заменить app_util.h app_util.cpp, определив переменную AppUtilSrc следующим образом:

Эффект эквивалентен вышеуказанному. Вы также можете накапливать значения:

Итак, AppUtilSrcs представляет 3 файла.

Установить режим компиляции

Установите режим компиляции mt:

Установите режим компиляции md:

По умолчанию используется многобайтовый режим, установленный в режим Unicode:

Кроме того, add_definitions может также установить другие параметры.

Добавить другие CMakeLists.txt

Если цель в CMakeLists.txt должна быть связана с целями в другом CMakeLists.txt, вы можете использовать add_subdirectory. Давайте возьмем библиотеку googletest в качестве примера:

Контроль кода

Если вы хотите добавить все исходные файлы из каталога ./pbase/src в проект, вы можете использовать aux_source_directory, чтобы добавить исходные файлы из каталога в переменную, и позже вы можете использовать код, представленный этой переменной, например:

Добавьте заголовочный файл, включающий каталог:

Но файлы в include_directories не будут отражены в первом проекте Visual Studio, а aux_source_directory будет только добавлять исходные файлы и игнорировать файлы заголовков. Если проект Visual Studio, который вы хотите сохранить, также содержит файлы заголовков, вы можете сделать это:

Если вы хотите пережить фильтр в visual studio, вы можете использовать source_group:

Для сборки под Linux рекомендуется запускать следующий контейнер docker:

Пример программы

В общей папке для компьютеров с операционными системами Linux и Windows (один или оба компьютера – виртуальные машины) создайте папку с проектом и разместите в ней следующие исходные коды:

  • в папке src файлы get_os_name.c и main.c ;
  • в папку include файл get_os_name.h .

Содержимое файла get_os_name.c :

Содержимое файла get_os_name.h :

Содержимое файла main.c :

Соберите пример под Windows:

Проверьте его работоспособность в обеих системах.

Сборка с помощью cmake

Создайте новый каталог для изучения примера сборки с помощью cmake и скопируйте в него папки src и include вместе с файлами.

Добавьте в новый каталог файл CMakeLists.txt :

В первой строчке конфигурации (программы для cmake) мы задаем минимальную версию cmake. Во второй – имя проекта.

Функция add_executable добавляет в проект задачу (target, цель) собрать исполняемый файл (программу). Первым аргументом этой функции является имя задачи, последующие аргументы – файлы исходных кодов.

Функция target_include_directories задает для задачи каталог с включаемыми (include, заголовочными) файлами. Первый аргумент – задача. Далее указывается область действия этой функции ( PRIVATE – только указанная задача, PUBLIC – весь проект). После чего указывается каталог.

В последней строке показано использование переменных cmake. Переменная PROJECT_SOURCE_DIR равна пути к каталогу проекта.

Сборка под Windows

Создайте каталог wbuild и перейдите в него.

Выполните в нем команду:

Программа cmake при запуске требует один аргумент – каталог проекта, в котором должен находиться файл CMakeLists.txt . Двоеточие как в Windows, так и в Linux означает родительский каталог по отношению к текущему.

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

При успешном выполнении cmake создаст в каталоге wbuild файл с именем каждой задачи и расширением .vcxproj . В терминах Visual Studio это называется проектом (project).

Также в этом каталоге будет создан файл с именем проекта и расширением .sln . В Visual Studio это называется решением (solution). Оно содержит в себе все проекты, соответствующие задачам в cmake, а также некоторые дополнительные проекты.

Соберите программу с помощью программы:

По умолчанию будет создана отладочная версия программы, которую можно найти в папке Debug . Можно также создать рабочую версию, указав msbuild ключ -p:Configuration=Release (результат будет в папке Release ).

Сборка под Linux

Создайте каталог lbuild и перейдите в него.

Выполните в нем команду:

Соберите программу с помощью программы:

Команда make собирает проект в текущей папки (понятие проекта в make и cmake совпадают). В результате получится готовая программа, имя которой совпадает с именем проекта. Запустите и проверьте правильность ее работы.

Статические библиотеки

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

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

Добавьте в новый каталог файл CMakeLists.txt :

В данном примере будет две задачи: создание библиотеки и готовой программы.

Задача создания библиотеки создается функцией add_library . Первый ее аргумент – название задачи, обычно совпадающее с именем библиотеки. Далее указывается тип библиотеки (статическая), после чего указываются файлы исходных кодов.

Функция target_include_directories , как и в предыдущем примере, задает каталоги с заголовочным файлами. В отличие от предыдущего примера указывается область действия PUBLIC, чтобы подключить эти заголовочные файлы и ко второй задаче (создание программы).

Функция add_executable используется так же, как и в предыдущем примере.

Функция target_link_libraries подключает ко второй задаче библиотеку, создаваемую в первой задаче.

Соберите пример под Windows и под Linux (используя те же команды, что и в предыдущем примере).

Проверьте правильность работы программ.

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

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

Динамические библиотеки

Код функций из динамической библиотеки помещается в отдельный от программы файл. Функции из таких библиотек компонуются к основной программе во время работы программы (поэтому и называются динамическими). Достоинством динамических библиотек является возможность использовать их одновременно из нескольких программ (отсюда второе название – разделяемые (shared) библиотеки). Их недостаток – необходимость контролировать их наличие в операционной системе и версию.

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

Добавьте в новый каталог файл CMakeLists.txt :

Отличие конфигураций статически и динамически присоединяемых библиотек заключается в использовании ключевых слов STATIC и SHARED в функции add_library . Для Linux отличия заканчиваются.

Если сборка ведется под Windows (что проверяется командой if(WIN32) ), переменную CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS нужно установить в значение ON с помощью функции set . Это указывает cmake сгенерировать дополнительные файлы.

В Windows для создания программ, использующие динамические библиотеки, требуются дополнительные файлы для сборки программы. Код самих функций помещается в файлы с расширением .dll , которые используются во время работы. Во время сборки требуются файлы с описанием функций в файле .dll и кодом для доступа к этим функциям.

Соберите пример под Windows и под Linux (используя те же команды, что и в предыдущем примере).

Проверьте правильность работы программ.

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


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

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

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

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

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

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

Как подметили в комментариях, команда cmake_minimum_required выставляет все флаги совместимости (смотреть cmake_policy ). Некоторые разработчики намеренно выставляют низкую версию CMake, а затем корректируют функционал вручную. Это позволяет одновременно поддерживать древние версии CMake и местами использовать новые возможности.

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

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

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

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

Команда add_library компилирует библиотеку с указанным видом и именем из исходников. Важно отметить, что окончательное имя библиотеки зависит от целевой платформы (например, lib<LibraryName>.a или <LibraryName>.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 , а последующие аргументы представляют собой названия целей библиотек или полные пути к библиотекам. Пример:

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

Как упомянули в комментариях, цели в CMake тоже подвержены ручному манипулированию, однако весьма ограниченному.

Имеется возможность управления свойствами целей, предназначенных для задания процесса сборки проекта. Команда get_target_property присваивает предоставленной переменной значение свойства цели. Данный пример выводит значение свойства C_STANDARD цели MyTarget на экран:

Команда set_target_properties устанавливает указанные свойства целей заданными значениями. Данная команда принимает список целей, для которых будут установлены значения свойств, а затем ключевое слово PROPERTIES , после которого следует список вида <название свойства> <новое значение> :

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

Также имеется возможность проверки ранее определённых целей с помощью конструкции if(TARGET <TargetName>) :

Команда 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 продолжать свою работу, даже если пакет не был найден.

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

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

Вам, вероятно, захочеться проверить результат поиска пакета, если Вы указали опцию QUIET . Это можно сделать путём проверки переменной <PackageName>_FOUND , автоматически определяемой после завершения команды find_package . Например, в случае успешного импортирования настроек GSL в Ваш проект, переменная GSL_FOUND обратится в истину.

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

Информировать компилятора о располжении включаемых заголовков можно посредством двух команд: include_directories и target_include_directories . Вы решаете, какую из них использовать, однако стоит учесть некоторые различия между ними (идея предложена в комментариях).

Команда include_directories влияет на область каталога. Это означает, что все директории заголовков, указанные данной командой, будут применяться для всех целей текущего CMakeLists.txt , а также для обрабатываемых подпроектов (смотреть add_subdirectory ).

Команда target_include_directories влияет лишь на указанную первым аргументом цель, а на другие цели никакого воздействия не оказывается. Пример ниже демонстрирует разницу между этими двумя командами:

В комментариях упомянуто, что в современных проектах применение команд include_directories и link_libraries является нежелательным. Альтернатива — это команды target_include_directories и target_link_libraries , действующие лишь на конкретные цели, а не на всю текущую область видимости.

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

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

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

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

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

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

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

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

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

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

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

Читайте также: