CMake – кроссплатформенная автоматизированная система сборки проектов. Непосредственно сборкой она не занимается, а только генерирует Makefile, который потом будет выполнен утилитой make.
Использует текстовый файл CMakeLists.txt для описания зависимостей и настроек для сборки проекта.
Минимальный CMakeLists.txt для создания исполняемого файла
# Создает исполняемый файл с именем main из исходника main.c
add_executable(test_project main.c)
"cmake.exe" --build ...\cmake-build-release --target DebuggingExample -j 25
[1/2] Building C object CMakeFiles/DebuggingExample.dir/main.c.obj
[2/2] Linking C executable DebuggingExample.exe
Build finished
Также можно указать минимальную необходимую версию утилиты:
cmake_minimum_required(VERSION 3.10)
Проекты в CMake задаются конструкцией project. Также можно добавить версию проекта.
project(cmake_test_project)
project(cmake_test_project VERSION 1.0)
Версия стандарта указывается через конструкцию set:
# C standart
set(CMAKE_C_STANDARD 17)
set(CMAKE_C_STANDARD_REQUIRED True)
# C++ standart
set(CMAKE_CXX_STANDARD 23)
set(CMAKE_CXX_STANDARD_REQUIRED True)
Можно создавать текстовые переменные. Затем созданные переменные можно использовать в дальнейших конструкциях
Целью сборки может быть не только исполняемый файл, но и библиотека:
add_library(libjpegtools STATIC JpegTools.h JpegTools.c) # статическая библиотека
add_library(libjpegtools SHARED JpegTools.h JpegTools.c) # динамическая библиотека
Указание include directories:
include_directories("headers/" "include/") # задание для всех целей проекта
# target_include_directories(myTarget PUBLIC ./include) # для определённой цели
Указание libraries directories:
link_directories(${OpenCL_LIBRARY}) # задание для всех целей проекта
# target_link_directories(myTarget PUBLIC opencv_world3416.lib) # для определённой цели
Вы можете выбирать область видимости настройки: PUBLIC делает настройку видимой для текущей цели и для всех зависящих от неё целей, PRIVATE делает настройку видимой только для текущей цели и INTERFACE делает настройку видимой только для всех зависящих от неё целей.
find_package() - принимает имя библиотеки как аргумент и обращается к CMake, чтобы найти скрипт для настройки переменных данной библиотеки. За поиск библиотек отвечают модули, называющиеся FindNAME.cmake, где NAME – имя библиотеки. При успешном нахождении компонента будут добавлены переменные, хранящие пути поиска заголовков, имена библиотек для линкера и пр. В примере ниже при нахождении OpenMP добавляются переменные ${OpenMP_C_FLAGS} и ${OpenMP_CXX_FLAGS}.
Пример с Boost (весь, без указания конкретных компонентов):
find_package(Boost REQUIRED)
# После этого становятся доступны:
# Boost_INCLUDE_DIRS: пути к заголовочным файлам
# Boost_LIBRARY_DIRS: пути к библиотекам
# Boost_LIBRARIES: список файлов библиотек