Работа с CMake-проектами в QNX Momentics IDEВ настоящее время во многих программных продуктах (приложениях, библиотеках) задача подготовки проекта к сборке бинарных компонентов решается с помощью инструментария
CMake. Для того, чтобы эффективно использовать возможности интегрированной среды разработки
QNX Momentics IDE при работе с такими проектами (например, в процессе адаптации какого-либо ПО под
ЗОСРВ "Нейтрино" или
QNX) необходимо предварительно выполнить интеграцию данного инструментария в IDE.
В данной теме будет рассмотрен механизм интеграции с помощью
промежуточного файла-сценария. Данный сценарий предназначен для преобразования действий, выполняемых при работе над проектом (в т.ч. команд
"Build project" и
"Clean project"), в вызовы инструментария CMake (при этом преобразование производится в фоновом режиме).
########################################################################
#
# CMake integration layer for Eclise-based IDEs (primarily for QNX Momentics IDE)
#
# (C) 2018 SWD Embedded Systems Ltd.
#
# Revision 0.94 (2018-11-08)
==== <cut>====
all: cmake_build_all
distclean: cmake_cleanup
help: cmake_execute
==== <cut>====
cmake_execute: $(ROOTCMAKELISTS) $(ROOTMAKEFILE) | $(BUILDDIR)
cmake_build_all: $(ROOTMAKEFILE)
cd "$(PROJECT_ROOT)" && $(CMAKE) --build "${BUILDDIR}"
cmake_cleanup: $(BUILDROOT)
cd "$(BUILDROOT)" && $(CMAKE) -E remove_directory "$(CONFIGNAME)"
$(ROOTMAKEFILE): $(ROOTCMAKELISTS) $(TOOLCHAINFILE) | $(BUILDDIR)
cd "$(BUILDDIR)" && $(CMAKE) $(CMAKEARGS)\
-G "Unix Makefiles" \
$(TOOLCHAIN_SETTINGS) \
-DCMAKE_BUILD_TYPE=$(BUILD_TYPE) \
-DCMAKE_COLOR_MAKEFILE=OFF \
"$(SOURCE_ROOT)"
==== <cut>====
Преимущества данного подхода:
- отсутствие необходимости в дополнительных компонентах среды разработки, возможность использования в Momentics 7.0 и 4.7
(Примечание: вариант для 4.7 находится в процессе адаптации) - возможность использования файла-сценария как в графическом, так и в консольном режиме
- расширяемость
Недостатки:
- необходимость явного указания некоторых параметров проекта и поддержания их в актуальном состоянии
- необходимость учитывать некоторые особенности используемой версии платформы Eclipse CDT
Последовательность настройки проекта "с нуля" (с комментариями)Файл-сценарий GNUmakefile, а также уже подготовленный .zip-архив с настроенным проектом для QNX Momentics 7.0, который можно использовать в качестве "шаблона" при работе с CMake-проектами, доступны для скачивания по ссылке в конце данной статьи.
Для импорта проекта в IDE используется следующая последовательность действий:
File -> Import ->General -> Existing Projects into Workspace -> кнопка Select archive file...
ВАЖНО: при импорте готовых проектов QNX Momentics IDE в разделе "General" используется именно режим "Existing Projects info Workspace". Режим "Archive file"... можно использовать в дальнейшем, чтобы добавить в этот проект "исходники" из какого-либо другого архива.
Создание проектаНеобходимо создать новый пустой проект:
File -> New -> C++ Project -> Executable (Empty Project) (
Примечание: для проектов на языке C выбирается этот же вариант)
Toolchain:
Linux GCC (
Примечание: выбор Toolchain не зависит от используемой инструментальной платформы, т.е. одинаков и для Linux, и для Windows)Настройка проектаДля корректной интерпретации содержимого CMake-проекта средой разработки (в т.ч. для навигации по заголовочным файлам, функциям и макроподстановкам при работе с исходным кодом), необходимо выполнить ряд предварительных действий по настройке проекта. В данном списке указаны пункты Свойств проекта (
Project Properties), в которые необходимо внести изменения:
- Resource -> Resource Filters (только для Momentics 7.0)
Действие: Создать новый фильтр (кнопка Add Filter). Параметры фильтра: "Exclude all", "Folders", "All children (recursive)", "Name Matches: CMakeFiles", Case sensitive
Дополнительная информация: фильтрация используется для того, чтобы исключить из поля зрения среды разработки временные и промежуточные исполняемые файлы, которые CMake создаёт в процессе работы. Как следствие, они не будут отображаться в псевдопапке "Binaries" после сборки проекта.
- C/C++ Build, закладка Builder Settings:
Действие: для всех конфигураций (Debug, Release) необходимо:
- снять отметку "Generate makefiles automatically"
- указать Build directory как ${workspace_loc:/<имя_проекта>} (можно использовать кнопку Workspace... и выбрать соответствующий проект)
Дополнительная информация:
- Снятая отметка "Generate makefiles automatically" сообщает IDE, что задачу формирования Makefile'ов для текущего проекта берёт на себя другой инструмент; в данном случае она решается средствами CMake (иначе среда разработки будет пытаться сформировать Makefile'ы для данного проекта самостоятельно).
- Каталог Build directory указывается для того, чтобы среда разработки учитывала находящиеся в нём результаты сборки проекта (исполняемые файлы, разделяемые библиотеки) при формировании содержимого псевдопапки "Binaries"
- C/C++ Build, закладка закладка Refresh Policy (только для Momentics 7.0)
Действие: добавить в перечень ресурсов ресурс с именем проекта (кнопка Add Resource...)
Дополнительная информация: настройки Refresh Policy указываются для корректного обновления содержимого дерева проекта после выполнения его сборки/очистки.
ВАЖНО: при переименовании проекта данный раздел автоматически не обновляется. Необходимо вручную удалить старую запись и добавить новую (кнопки Add Resource... / Delete...)
- C/C++ Build -> Settings -> Binary Parsers
Действие: Снять отметку "GNU Elf Parser", установить отметку "QNX Binary Parser"
Дополнительная информация: механизм Binary Parsers используется для корректного обнаружения исполняемых файлов и библиотек в результатах сборки проекта и последующего их отображения в псевдопапке "Binaries" (а также корректной интерпретации их содержимого при отображении, например, в режиме дизассемблера)
- C/C++ Build -> Discovery options (только для Momentics 4.7)
TODO
- C/C++ Build -> Environment
Действие: Выбрать вариант All Configurations, добавить переменные (пары <имя>:<значение>):
- CROSS_PREFIX:ntox86 (соответствует используемой целевой платформе: ntox86, ntoarmv7, ntoppc, ntomips)
- CONFIGNAME:${ConfigName}
- ROOTSUBDIR:пустое значение
Режим: Append variables to native environment
Дополнительная информация: данные переменные окружения используются файлом-сценарием. Переменная CROSS_PREFIX также используется в некоторых разделах свойств проекта (см. далее).
ВАЖНО: все последующие изменения данных переменных (например, смена целевой платформы) рекомендуется выполнять в этом же разделе (All Configurations), иначе возможно расхождение конфигураций (значения одних и тех же переменных в разных конфигурациях будут отличаться).
- C/C++ General-> Indexer
Действие: Пункт Configure Workspace Settings -> Build configuration for the indexer, выбрать вариант "Use active build configuration"
Дополнительная информация: настройки индекса привязываются к текущей (активной) конфигурации для того, чтобы использовать актуальную именно для данной конфигурации информацию о местоположении системных заголовочных файлов, макроопределений компилятора и т.д.
Не используется по причине
BUG#205299 в используемой версии платформы Eclise IDE (настройка индекса в свойствах проекта не сохраняется даже при установке флага "Store settings with project")
- Установить отметку Enable project specific settings
- В разделе Build Configuration for the indexer установить значение "Use active build configuration"
Вариант №2 (через глобальные настройки):
Window -> Preferences -> C/C++ -> Indexer -> Build configuration for the indexer: установить
"Use active build configuration" - C/C++ General-> Preprocessor Include Paths, Macros etc., закладка Providers
Создание целей (target'ов) (опционально)Для более комфортной работы с проектом рекомендуется использовать механизм предустановленных целей (
target'ов). Данный механизм позволяет оперативно осуществлять сборку проекта, удаление результатов предыдущих сборок, а также выполнять ряд других действий. На уровне файла-сценария
GNUmakefile поддерживаются следующие цели:
- cmake_execute: создание файлов построения проекта (Makefile-ов) с помощью CMake без последующего фактического построения приложения (выполняется запуск CMake с заданными параметрами)
- cmake_build_all: полное (или последующее инкрементальное) построения проекта (выполняется запуск CMake c параметром --build)
- cmake_cleanup: удаление каталога, в котором создаются файлы построения проекта и бинарные файлы для текущей активной конфигурации (см. свойства проекта, раздел C/C++ Build, пункт "Configurations")
- Все остальные цели (all, clean, help и т.д.): интерпретируются согласно файлам Makefile данного проекта, автоматически созданным на этапе выполнения cmake_execute или cmake_build_all.
Для создания и последующего быстрого запуска целей рекомендуется использовать следующие инструменты:
- В Momentics 7.0: Window -> Show View -> Build Targets
(в Momentics 7.0 цели также доступны в дереве самого проекта в разделе "Build Targets") - В Momentics 4.7: Window -> Show View -> Make Targets
Подготовка к работеДля начала работы в настроенный проект необходимо скопировать или импортировать:
- файл-сценарий GNUmakefile (в корневой каталог проекта).
- файлы исходного кода и файл CMakeLists.txt (описание проекта на языке CMake).
Если "исходники" и CMakeLists.txt находятся в каталоге, отличном от каталога верхнего уровня, то необходимо в свойствах проекта установить значение переменной
ROOTSUBDIR (см. выше), соответствующее имени этого каталога (напр.
ROOTSUBDIR=expat-2.2.6 для библиотеки libexpat 2.2.6, архив которой содержит все файлы (включая CMakeLists.txt) в каталоге
/expat-2.2.6).
Работа с проектомДалее работа с проектом осуществляется любым из доступных способов:
- Инструменты Build Targets/Make Target
- "Горячие клавиши" (напр. Ctrl-B для сборки проекта)
- Через свойства проекта (пункты Build Project и Clean Project)
- Иконка "Build" на Панели запуска.
СкачатьСсылка для скачивания архива с подготовленным проектом (предварительно необходимо нажать кнопку "Спасибо" или оставить комментарий в данной теме):
Вопросы, пожелания и замечанияВопросы, пожелания и замечания по данному проекту можно оставлять в этой теме.