Введение

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

Автор: Энди Седильник, Билл Хоффман, Брэд Кинг, Кен Мартин, Александр Нойндорф.

Год: 2000

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

CMake или Make

Make (или, скорее, Makefile) — это система сборки, которая управляет компилятором и другими инструментами сборки для создания вашего кода.

CMake — это генератор систем сборки, он может создавать файлы Makefile. Поэтому, если у вас есть проект, независимый от платформы, CMake — это способ сделать его независимым от системы.

Вот преимущества CMake перед Make:

  1. Язык, используемый для написания файлов CMakeLists.txt, удобочитаем и понятен.
  2. Кроссплатформенное обнаружение системных библиотек/функций/заголовков/флагов.
  3. Легче компилировать ваши файлы в общую библиотеку независимо от платформы и в целом проще в использовании, чем Make.
  4. CMake не только полагается на «Make» для сборки проекта, но и поддерживает несколько генераторов, таких как Xcode, Eclipse, Visual Studio и т. д.

Чтобы упростить задачу, вы можете выполнить большинство функций, доступных в CMake, с помощью Make, но с ДОПОЛНИТЕЛЬНЫМИ УСИЛИЯМИ.

CMakeLists.txt и процесс компиляции

CMake задуман как кроссплатформенный диспетчер процессов сборки, поэтому он определяет собственный язык сценариев с определенным синтаксисом и встроенными функциями. Язык CMake записывается либо в CMakeLists.txt, либо файл заканчивается файлом ‹project_name›.cmake.

Процесс компиляции в CMake состоит из двух этапов:
1. Конфигурация
2. Генерация

Команды конфигурации и генерации (сборки) указываются в одном месте и полностью обрабатываются CMake.

Конфигурация: здесь выполняется сценарий CMakeLists.txt. Этот скрипт отвечает за определение целей. Здесь target может быть исполняемым файлом, библиотекой или каким-либо другим выходом конвейера сборки ( конвейер означает файл, который может помочь компилятору искать исполняемые файлы/библиотеки для ссылки на этот проект, который может присутствовать в системной библиотеке, пока вы пытаетесь для кросс-компиляции это будет видно).

Если шаг настройки завершится успешно — это означает, что CMakeLists.txt завершен без ошибок — CMake сгенерирует конвейер сборки, используя цели, определенные сценарием ( CMakeLists.txt ). Тип создаваемого конвейера сборки зависит от типа используемого генератора.
CmakeCache.txt создается таким образом, что он может помочь сократить время создания конвейера в будущем.

Генерация. Этот этап предназначен для создания исполняемого файла в зависимости от целей, созданных на этапе конфигурации.

Вышеупомянутые детали могут быть визуализированы из рисунка ниже.

Иерархия файлов для CMake

Мы попробуем собрать cmakeSampleProject, который пытается выполнять сложение и умножение (определяемые пользователем функции).

Примечание:
1. Наличие файла сценария CmakeLists.txt в каждой папке обязательно.
2. →: представлять папки
3. ->: представлять файлы

Команды для настройки и сборки

Теперь давайте посмотрим, как создать и запустить исполняемый файл для cmakeSampleProject.

$ cmake -H. -Bbuild
Создает файлы конфигурации CMake внутри папки build.

$ cmake — build build — -j3
Создаст выходной файл SampleProjectOutput в папке сборки.

$ ./build/SampleProjectOutput
Hello World
Для запуска исполняемого файла.

Переменные CMake

Вот некоторые глобальные переменные CMake, которые вы должны знать

  1. CMAKE_BINARY_DIR: если вы создаете исходный код, это то же самое, что и CMAKE_SOURCE_DIR, в противном случае это каталог верхнего уровня вашего дерева сборки.
  2. CMAKE_SOURCE_DIR: это каталог, из которого был запущен CMake, т. е. исходный каталог верхнего уровня.
  3. EXECUTABLE_OUTPUT_PATH: установите эту переменную, чтобы указать общее место, куда CMake должен помещать все исполняемые файлы (вместо CMAKE_CURRENT_BINARY_DIR).
    Пример: SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
  4. LIBRARY_OUTPUT_PATH: установите эту переменную, чтобы указать общее место, куда CMake должен поместить все библиотеки (вместо CMAKE_CURRENT_BINARY_DIR).
    Пример: SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)
  5. PROJECT_NAME: имя проекта, заданное командой PROJECT().
  6. PROJECT_SOURCE_DIR: содержит полный путь к корню исходного каталога вашего проекта, т. е. к ближайшему каталогу, где CMakeLists.txt содержит команду PROJECT().

Команды Cmake

Это некоторые наиболее часто используемые команды CMake,

  1. cmake_minimum_required (): эта команда гарантирует, что для процесса сборки требуется минимальная версия CMake.
    В случае сбоя команды возникает исключение.
    Пример: cmake_minimum_required (ВЕРСИЯ 2.6)
  2. project (): эта команда используется для присвоения имени проекту, над которым вы работаете.
    Пример: проект (учебник)
  3. add_executable(): здесь вы говорите CMake, чтобы начать процесс компиляции.
    В приведенном ниже примере мы говорим о компиляции с помощью test.cpp.
    Пример: add_executable (Учебник tutorial.cpp)
  4. configure_file (): копирует файл ‹входной› в файл ‹выходной› и заменяет значения переменных, указанные в содержимом файла.
    синтаксис: configure_file(‹input› ‹output›)
    Пример: configure_file («${PROJECT_SOURCE_DIR}/TutorialConfig.h.in» «${PROJECT_BINARY_DIR}/TutorialConfig.h»)
  5. option (): предоставляет параметр, который пользователь может выбрать по желанию.
    синтаксис: option(‹option_variable› «строка справки, описывающая параметр» [начальное значение])
    В приведенном ниже например, мы говорим о компиляции с помощью test.cpp.
    Ex: опция (USE_MYMATH «Использовать математическую реализацию, предоставленную учебником» ON)
  6. include_directories(): загружает и запускает CMake с файлами, которые требуется включить.
    Пример: include_directories ("${PROJECT_SOURCE_DIR}/MathFunctions").
  7. add_subdirectory(): добавляет запрошенный подкаталог в сборку.
    Пример: add_subdirectory (MathFunctions).
  8. set (): используется для установки заданного значения переменной CMake/cache/environment.
    Пример: set (Tutorial_VERSION_MAJOR 1)
  9. target_link_libraries (): связывает библиотеки с исполняемым файлом.
    Пример: target_link_libraries (учебник ${EXTRA_LIBS})
  10. check_function_exists (): используется для проверки существования системной функции, если она присутствует, можно установить макрос.
    Пример: check_function_exists (printf HAVE_PRINTF)
  11. install (): указывает правила, которым необходимо следовать во время установки, может быть выполнено извне с помощью команды $ make install

Ex:

установить (TARGETS Tutorial DESTINATION bin)

установить (ФАЙЛЫ «${PROJECT_BINARY_DIR}/TutorialConfig.h» НАЗНАЧЕНИЕ включают)

В приведенном выше примере TARGETS используется для исполняемых файлов, а для библиотечных файлов используется FILES.

Параметры CMake:

Вот некоторые варианты, используемые наиболее часто,

  1. — построить ‹dir›: построить бинарное дерево проекта, сгенерированное CMake.
  2. -i: запуск в режиме мастера, режим мастера запускает CMake в интерактивном режиме без графического интерфейса.
  3. -D ‹var›:‹type›=‹value›: создать запись кэша cmake. При первом запуске cmake в пустом дереве сборки создается кэш CMake.
    Он также используется для перезаписи значений переменных на этапе настройки.
  4. -H: распечатать информацию об использовании и выйти.
  5. -B: указывает каталог сборки.

Кросс-компиляция с помощью CMake:

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

Пример: $ cmake -H. -Bcross_build -DCMAKE_CXX_FLAGS="-g -std=c++11 -Wall" -DCMAKE_TOOLCHAIN_FILE=./sample_cross_compile_toolchain_file.cmake -DCMAKE_BUILD_TYPE=Debug

В приведенном выше примере мы перезаписываем определенный «CMAKE_TOOLCHAIN_FILE» на «./sample_cross_compile_toolchain_file.cmake», используя параметр «-D».

Практические примеры:

Эта ссылка ведет к учебнику Git Hub CMake, следуйте инструкциям, приведенным в разделе «Практические примеры» на этой вики-странице.



Ссылки: