Что такое CMake?

«Что такое CMake?» — вопрос из категории DevOps, который задают на 25% собеседований C/C++ Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

CMake — это кроссплатформенная система автоматизации сборки (build system generator). Она не собирает проект напрямую, а генерирует файлы для нативных систем сборки (Makefile для GNU Make, .sln для MSVC, проекты для Xcode и т.д.) на основе скриптов CMakeLists.txt. Это стандартный инструмент для управления сборкой C++ проектов.

Основные преимущества для C++ разработки:

  • Кроссплатформенность: Один CMakeLists.txt может генерировать проекты для Windows, Linux, macOS.
  • Управление зависимостями: Поиск системных библиотек (find_package) и подключение подпроектов.
  • Контроль флагов компиляции: Централизованная настройка стандартов языка, оптимизаций, предупреждений.

Пример минимального CMakeLists.txt для C++ проекта:

cmake_minimum_required(VERSION 3.16)
project(MyCppApp VERSION 1.0 LANGUAGES CXX)

# Устанавливаем стандарт C++
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# Создаём исполняемый файл из исходных кодов
add_executable(my_app main.cpp src/utils.cpp)

# Подключаем заголовочные директории
target_include_directories(my_app PUBLIC include)

# Связываем с внешней библиотекой (например, Threads)
find_package(Threads REQUIRED)
target_link_libraries(my_app PRIVATE Threads::Threads)

Типичный рабочий процесс:

# 1. Создать отдельную директорию для сборки (out-of-source build)
mkdir build && cd build
# 2. Сгенерировать файлы сборки (например, для Make)
cmake .. -DCMAKE_BUILD_TYPE=Release
# 3. Запустить сборку
cmake --build . -j4

Современный подход (Modern CMake) рекомендует использовать target-ориентированные команды (target_include_directories, target_link_libraries), а не глобальные переменные, что улучшает изоляцию и переносимость целей сборки.