cmake FAQ |
![]() |
Добавил(а) microsin |
Описание решения различных вопросов, возникающих в проектах, где используется CMake. В CMake с переменными окружения можно работать напрямую в CMakeLists.txt — читать, устанавливать и проверять их наличие. Вот основные способы и важные нюансы. [Чтение и проверка переменных окружения] Для чтения переменных окружения в CMake используется синтаксис `$ENV{VAR_NAME}`. # Вывести значение переменной HOME Чтобы проверить, определена ли переменная, используйте команду `if(DEFINED ENV{...})`: # Проверка существования переменной Альтернативный способ — проверить, не является ли значение переменной пустой строкой: if(NOT "$ENV{MY_VARIABLE}" STREQUAL "") message(STATUS "MY_VARIABLE has a value: $ENV{MY_VARIABLE}") [Установка и удаление переменных] Установить переменную окружения на время выполнения CMake можно с помощью `set(ENV{...})`: # Установить переменную Удалить переменную можно с помощью `unset()`: # Удалить переменную Важно: установленные таким способом переменные действуют только в процессе CMake и не влияют на систему или вызывающую оболочку. [Практическое применение: условная логика и значения по умолчанию] Переменные окружения удобно использовать для условной логики в сборке. Например, можно установить значение по умолчанию, если переменная не определена: # Установить значение по умолчанию, если переменная окружения не задана Или управлять флагами компиляции: # Включить отладочный режим на основе переменной окружения [Важные ограничения и предупреждения] 1. Область видимости: переменные, установленные через `set(ENV{...})`, видны только в текущем процессе CMake (на этапе конфигурации) и не передаются в целевые программы (исполняемые файлы) при их запуске. 2. Этап сборки (Build Time): переменные, установленные во время конфигурации (вызова `cmake`), **не передаются автоматически** командам сборки (например, внутри `add_custom_command()`). Для этого нужно использовать аргументы команды или другие методы. 3. Отсутствие отслеживания изменений: CMake не отслеживает изменения переменных окружения. Если вы измените переменную в оболочке и повторно запустите сборку (`cmake --build`), CMake не переконфигурируется автоматически. Чтобы изменения вступили в силу, необходимо повторно запустить конфигурацию (`cmake`). В CMake есть несколько способов вывести значения переменных. Вот основные методы: [Основной способ - команда message()] # Вывод обычного сообщения [Вывод значений переменных] # Установим тестовые переменные [Вывод списков] # Создаем список [Практические примеры для отладки] Отладка компиляторов: message(STATUS "=== CMake Configuration ===") Отладка путей: message(STATUS "=== Paths ===") Отладка найденных пакетов: find_package(Python3 COMPONENTS Interpreter) [Форматированный вывод] # Вывод с разделителями [Важные моменты] 1. Типы сообщений: - `STATUS` - для информации (видно при `cmake -S . -B build`) 2. Время вывода - сообщения выводятся во время конфигурации CMake, а не во время сборки. 3. Для отладки условий: if(SOME_CONDITION) Эти методы помогут вам эффективно отлаживать CMake скрипты и понимать, какие значения принимают переменные в процессе конфигурации. Эта строка в CMakeLists.txt ищет и проверяет наличие системы контроля версий Git в системе. Синтаксис: find_package(Git) Что это делает: 1. Поиск исполняемого файла Git - ищет программу `git` в системных путях (PATH). 2. Устанавливает переменные - после выполнения создаются несколько CMake переменных: - `Git_FOUND` - булева переменная, указывающая найден ли Git 3. Проверяет доступность - позволяет скрипту узнать, доступна ли команда git. Типичное использование: # Ищем Git Зачем это нужно в CMake проектах: 1. Автоматическое управление версиями: if(Git_FOUND) 2. Включение информации о версии в приложение: if(Git_FOUND) 3. Проверка наличия зависимостей: find_package(Git REQUIRED) # Остановить сборку если Git не найден Варианты использования: - `find_package(Git)` - просто проверить наличие Эта команда особенно полезна для проектов, которые хотят автоматически включать информацию о версии из Git или выполнять Git-операции во время сборки. Переменная CMAKE_TOOLCHAIN_FILE в CMake служит для указания файла инструментария (toolchain), который определяет настройки для кросс-компиляции или специфичной платформы. Основное назначение: CMAKE_TOOLCHAIN_FILE позволяет настроить CMake для сборки под целевую платформу, отличную от хостовой системы, где выполняется компиляция. Как используется: # При вызове cmake
$ cmake -S . -B build -DCMAKE_TOOLCHAIN_FILE=/path/to/toolchain.cmake
Или в коде: set(CMAKE_TOOLCHAIN_FILE "/path/to/toolchain.cmake") [Что обычно содержится в toolchain файле] Базовые настройки компилятора: # Компиляторы Флаги компиляции: # Флаги компилятора [Практические примеры использования] 1. Встраиваемые системы (Embedded) # Для STM32 (ARM Cortex-M) 2. Кросс-компиляция для другой ОС # Компиляция для Windows из Linux 3. Для LuckFox Pico # toolchain-luckfox.cmake [Ключевые переменные в toolchain файле] - `CMAKE_SYSTEM_NAME` - целевая ОС (Linux, Windows, Generic) [Преимущества использования] 1. Изоляция настроек - все специфичные настройки в одном файле [Пример полного toolchain файла] # toolchain-arm-linux.cmake Таким образом, CMAKE_TOOLCHAIN_FILE - это фундаментальный механизм CMake для работы с кросс-компиляцией и специфичными платформами, что особенно актуально для встраиваемых систем типа LuckFox Pico. Переменная @D в файлах *.mk пакетов Buildroot нужна для ссылки на каталог сборки пакета. Например, для LuckFox Buildroot это каталог buildroot-2023.02.6/output/build/имя_пакета. @D обычно используется в хуках файла *.mk пакета для ручной модификации файлов перед их компиляцией. Например, следующий хук файла v4l2rtspserver.mk удалит использование библиотеки libv4l2cpp в пакете v4l2rtspserver: define V4L2RTSPSERVER_REMOVE_LIBV4L2CPP После добавления этого хука в файл v4l2rtspserver.mk необходимо выполнить заново конфигурирование пакета командами: $ make v4l2rtspserver-dirclean
$ make v4l2rtspserver
[Ссылки] 1. Step 1: A Basic Starting Point site:cmake.org. |