Часто используемые команды
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-скрипты для своих учебных и небольших проектов. Для углубленного изучения смотрите официальную документацию и примеры крупных проектов.
