Cmake полезные команды и переменные для начинающих

Автор: | 8 февраля, 2026

Часто используемые команды

message() — аналог printf для отладки.

message(STATUS "Это информационное сообщение.")
message(WARNING "Это предупреждение!")
message(FATAL_ERROR "Это ошибка, которая остановит конфигурацию.")

set() — задать переменную

set(MY_VARIABLE "Hello") # Создать/задать переменную
set(SOURCES src/main.cpp src/file1.cpp) # Создать список
message(${MY_VARIABLE}) # Вывести значение переменной

list() — работать со списками

list(APPEND SOURCES src/file2.cpp) # Добавить элемент в список

if() / else() / endif() — условные операторы

if(WIN32)
    message(STATUS "Это Windows.")
elseif(APPLE)
    message(STATUS "Это macOS.")
elseif(UNIX)
    message(STATUS "Это Linux или другой Unix.")
endif()

Полезные встроенные переменные

CMAKE_BUILD_TYPE — тип сборки (Debug, Release, RelWithDebInfo, MinSizeRel). По умолчанию не задан.

cmake .. -DCMAKE_BUILD_TYPE=Debug

CMAKE_CXX_STANDARD — стандарт C++ (11, 14, 17, 20)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON) # Запретить использовать старый стандарт
  • PROJECT_NAME — имя текущего проекта.
  • PROJECT_SOURCE_DIR — путь к корню исходного кода проекта (где лежит верхний CMakeLists.txt).
  • PROJECT_BINARY_DIR или CMAKE_BINARY_DIR — путь к папке сборки (build/).

Советы по организации

  • Одна папка — один CMakeLists.txt. В больших проектах CMakeLists.txt есть в каждой подпапке. В корневом файле используйте add_subdirectory(subfolder).
  • Используйте современный CMake (target-based подход). Вместо глобальных команд include_directories() и link_libraries(), предпочитайте:
target_include_directories(my_target PUBLIC include)
target_compile_features(my_target PRIVATE cxx_std_17)
target_link_libraries(my_target PRIVATE external_lib)
  • Всегда создавайте отдельную папку build.

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