Введение
CMake означает кроссплатформенную систему Make. CMake используется для управления процессом компиляции программного обеспечения с помощью простых файлов конфигурации, независимых от платформы и компилятора. CMake создает собственные make-файлы и рабочие пространства, которые можно использовать в выбранной вами среде компилятора.
Автор: Энди Седильник, Билл Хоффман, Брэд Кинг, Кен Мартин, Александр Нойндорф.
Год: 2000
Система сборки, которую вы хотите создать, может быть передана в CMake в качестве параметра. Однако CMake делает разумный выбор по умолчанию в зависимости от конфигурации вашей системы.
CMake или Make
Make (или, скорее, Makefile) — это система сборки, которая управляет компилятором и другими инструментами сборки для создания вашего кода.
CMake — это генератор систем сборки, он может создавать файлы Makefile. Поэтому, если у вас есть проект, независимый от платформы, CMake — это способ сделать его независимым от системы.
Вот преимущества CMake перед Make:
- Язык, используемый для написания файлов CMakeLists.txt, удобочитаем и понятен.
- Кроссплатформенное обнаружение системных библиотек/функций/заголовков/флагов.
- Легче компилировать ваши файлы в общую библиотеку независимо от платформы и в целом проще в использовании, чем Make.
- 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, которые вы должны знать
- CMAKE_BINARY_DIR: если вы создаете исходный код, это то же самое, что и CMAKE_SOURCE_DIR, в противном случае это каталог верхнего уровня вашего дерева сборки.
- CMAKE_SOURCE_DIR: это каталог, из которого был запущен CMake, т. е. исходный каталог верхнего уровня.
- EXECUTABLE_OUTPUT_PATH: установите эту переменную, чтобы указать общее место, куда CMake должен помещать все исполняемые файлы (вместо CMAKE_CURRENT_BINARY_DIR).
Пример: SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin) - LIBRARY_OUTPUT_PATH: установите эту переменную, чтобы указать общее место, куда CMake должен поместить все библиотеки (вместо CMAKE_CURRENT_BINARY_DIR).
Пример: SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib) - PROJECT_NAME: имя проекта, заданное командой PROJECT().
- PROJECT_SOURCE_DIR: содержит полный путь к корню исходного каталога вашего проекта, т. е. к ближайшему каталогу, где CMakeLists.txt содержит команду PROJECT().
Команды Cmake
Это некоторые наиболее часто используемые команды CMake,
- cmake_minimum_required (): эта команда гарантирует, что для процесса сборки требуется минимальная версия CMake.
В случае сбоя команды возникает исключение.
Пример: cmake_minimum_required (ВЕРСИЯ 2.6) - project (): эта команда используется для присвоения имени проекту, над которым вы работаете.
Пример: проект (учебник) - add_executable(): здесь вы говорите CMake, чтобы начать процесс компиляции.
В приведенном ниже примере мы говорим о компиляции с помощью test.cpp.
Пример: add_executable (Учебник tutorial.cpp) - configure_file (): копирует файл ‹входной› в файл ‹выходной› и заменяет значения переменных, указанные в содержимом файла.
синтаксис: configure_file(‹input› ‹output›)
Пример: configure_file («${PROJECT_SOURCE_DIR}/TutorialConfig.h.in» «${PROJECT_BINARY_DIR}/TutorialConfig.h») - option (): предоставляет параметр, который пользователь может выбрать по желанию.
синтаксис: option(‹option_variable› «строка справки, описывающая параметр» [начальное значение])
В приведенном ниже например, мы говорим о компиляции с помощью test.cpp.
Ex: опция (USE_MYMATH «Использовать математическую реализацию, предоставленную учебником» ON) - include_directories(): загружает и запускает CMake с файлами, которые требуется включить.
Пример: include_directories ("${PROJECT_SOURCE_DIR}/MathFunctions"). - add_subdirectory(): добавляет запрошенный подкаталог в сборку.
Пример: add_subdirectory (MathFunctions). - set (): используется для установки заданного значения переменной CMake/cache/environment.
Пример: set (Tutorial_VERSION_MAJOR 1) - target_link_libraries (): связывает библиотеки с исполняемым файлом.
Пример: target_link_libraries (учебник ${EXTRA_LIBS}) - check_function_exists (): используется для проверки существования системной функции, если она присутствует, можно установить макрос.
Пример: check_function_exists (printf HAVE_PRINTF) - install (): указывает правила, которым необходимо следовать во время установки, может быть выполнено извне с помощью команды $ make install
Ex:
установить (TARGETS Tutorial DESTINATION bin)
установить (ФАЙЛЫ «${PROJECT_BINARY_DIR}/TutorialConfig.h» НАЗНАЧЕНИЕ включают)
В приведенном выше примере TARGETS используется для исполняемых файлов, а для библиотечных файлов используется FILES.
Параметры CMake:
Вот некоторые варианты, используемые наиболее часто,
- — построить ‹dir›: построить бинарное дерево проекта, сгенерированное CMake.
- -i: запуск в режиме мастера, режим мастера запускает CMake в интерактивном режиме без графического интерфейса.
- -D ‹var›:‹type›=‹value›: создать запись кэша cmake. При первом запуске cmake в пустом дереве сборки создается кэш CMake.
Он также используется для перезаписи значений переменных на этапе настройки. - -H: распечатать информацию об использовании и выйти.
- -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, следуйте инструкциям, приведенным в разделе «Практические примеры» на этой вики-странице.