Создание файла "CMakeLists.txt" начинается с определения требований к версии CMake:
cmake_minimum_required(VERSION 3.22 FATAL_ERROR)
Указание корректной версии CMake может быть критичным, т.к. добавляется поддержка новых языков программирования и директив (так, например, в 3.26 появилась поддержка Microsoft ASM), появляются новые команды и переменные окружения. Чем сложнее скрипт сборки тем более чувствительным он является к версии CMake.
Указать имя проекта и используемый для его сборки язык программирования можно директивой project:
project(dsliportable LANGUAGES CXX)
Настройка ключей компиляции осуществляется директивами set:
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_EXTENSIONS OFF)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
Выбор стандарта C++ может быть важной задачей. Если выбрать C++ 11, то можно использовать специализированные компиляторы, надёжно работающие на устаревающих платформах. Однако, актуальные стандарты C++ предоставляют мощные инструментальные возможности, например, в C++ 17 появилась поддержка типов: std::string_view, std::optional, std::variant.
Указываем список файлов, участвующих в сборке проекта можно используя директиву add_executable:
add_executable(${PROJECT_NAME}
main.cpp
CommportBoost.h
CommportBoost.cpp)
В качестве альтернативы CMake рассматривается проект Google под названием Bazel. Для установки инструмента может потребоваться система установки под названием Bazelisk. Инструмент может быть использован в разных операционных системах и для разных языков программирования (из технологического стека Google): C++, Go, Java. Одна из главных feature Bazel - интеграция в другими системами сборки, включая CMake. Цель - для генерации скрипта сборки проекта использовать скрипты от CMake, если отсутствует готовый скрипт для Bazel.
Новичок среди систем сборки - Meson
Подключение библиотеки Boost не всегда является тривиальной задачей. CMake определяет местонахождение библиотек Boost в разных операционных системах, но это происходит только в том случае, если Boost размещён в "стандарных подкаталогах", т.е. был установлен через app-get, или собран из исходников проекта с указанием на необходимость инсталляции библиотек.
Однако, при выполнении "стандартной установки" библиотеки Boost в Microsoft Windows, командой b2 install
, CMake всё равно не может найти необходимые файлы Boost. Также существует проблема сборки приложений, использующих разные версии Boost на одной машине. В обоих случаях, в файле "CMakeLists.txt" требуется внести директивы, подсказывающие, где размещены файлы библиотеки.
Исходя из опыта, для сборки в Windows почти всегда нужно явным образом указывать размещение файлов Boost:
if (WIN32)
set( BOOST_ROOT c:/boost/ )
set( BOOST_INCLUDEDIR c:/boost/include/boost-1_76/ )
set( BOOST_LIBRARYDIR c:/boost/lib )
endif (WIN32)
Для Linux, почти никогда не нужно подсказывать местоположение Boost, хотя иногда это и бывает необходимым:
if (Unix)
set( BOOST_ROOT $ENV{HOME}/boost/current/ )
set( BOOST_INCLUDEDIR $ENV{HOME}/boost/current/include/ )
set( BOOST_LIBRARYDIR $ENV{HOME}/boost/current/lib_x86_64/ )
endif (WIN32)
Настройка параметров сборки приложения с использованием Boost осуществляется командной find_package():
find_package(Boost 1.74 REQUIRED COMPONENTS system)
После ключевого слова COMPONENTS перечисляются необходимые в проекте библиотеки, например:
find_package(Boost 1.74 REQUIRED COMPONENTS system locale filesystem thread)
Если библиотеки будут найдены, то CMake создаст переменную Boost_LIBRARIES
, которую можно будет использовать, например, в команде target_link_libraries, которая включает в генерируемый проект ссылки на линкуемые библиотеки:
target_link_libraries(${PROJECT_NAME} ${Boost_LIBRARIES})
Также следует включить в "CMakeLists.txt" инструкцию, включающую ссылку на папку с заголовочными файлами Boost в проект сборки:
target_include_directories( ${PROJECT_NAME} PUBLIC ${Boost_INCLUDE_DIRS})
Наиболее популярные plug-ins разработаны Microsoft (CMake Tools), twxs и Jose Torres и содержат инструменты IntelliSense для написания скриптов сборки CMakeLists.txt.
Одна из наиболее полезных функций - выбор Kit-а для сборки исходников. Сделать это можно средствами CMake Tools, через "Command Palette..." и команду "CMake: Select a Kit".