Изучаем EDE
Чтобы понять, выбросить, или простить.
Когда вы отправляетесь в крестовый поход. Вам просто необходим менеджер проектов. Да, с начала хватит одной команды, затем вы добавляете строчки в makefile. Потом находите чужой makefile и правите его и копируете из проекта в проект. Затем, возможно вы создаете свою систему из генераторов Makefile написанных на bash/python/perl и живете с ней один.
В это время обычные люди создают шаблонные проекты в IDE. Встраиваются в разработку проектов работая в цикле разработки который уже есть.
А у Вас Emacs и все пишут про гибкость, настраиваемость, а про EDE пишут что он сдох.
Вам повезло, есть ещё люди готовые угрохать кучу времени на что-то бесполезное, чтобы проверить насколько это бесполезно. См. цикл статей про openPLM и встраивание в его разработку.
Содержание
Начальное изучение вопросы думаю у всех начинается с этой статьи1
1 Структура
Рассмотрим содержание папки /usr/share/emacs/версия emacs/lisp/cedet/ede/
Разузнав про реализацию ООП в elisp, а именно EIEIO, узнаем про то как задаются классы и наследование через defclass. Смотрим описание файлов и что в них задано.
Смотрим на наследование классов, а также описания в заголовках файлов. Из базовых классов ede-project ede-target вырисовываются следующие крупные группы.
- ede-proj-project - это проекты хранящиеся в Project.ede рассчитано в основном на Makefile
- project-am-makefile - рассчитано на работу с Automake
- ede-simple-project - устарел(хах) смотри дальше.
- ede-generic-project - упрощенный способ создавать "проекты" или встраиваться в проект с уже написанным конфигом.
- ede-cpp-root-project - хак поверх ede , из плюсов прописка путей к библиотекам, для точного автодополнения через semantic.
- ede-emacs-project и ede-linux-project специально написанные костыльные файлы для работы с крупными проектами.
Теперь по файлам с кодом в папке с ede:
- ../ede.el здесь описание мода и как его грузить и подключать в emacs
- base.el Содержит базовые файлы для работы с ede
- config.el и generic.el для работы с generic проектами а также поиск и детектирование проекта, по файлу конфига а не по проектному файлу как .ede
- auto.el подгрузка списка типов проектов.
- proj.el базовые классы ede-proj-project
- pconf.el Генератор конфига для automake
- pmake.el Генератор конфига make
- proj-obj.el Класс для целей программных объектов программы или библиотеки
- proj-prog.el Работа с целями Программами
- proj-shared.el Работа с целями - Динамическая библиотека
- proj-archive.el Цель создания архивов с кодом
- proj-aux.el Работа со второстепенными объектами вроде документации
- proj-comp.el Компиляторы, линкеры
- proj-elisp.el Работа с elisp файлами
- proj-info.el Работа с генерацией документации вида info
- proj-misc.el Подключение собственных makefile пользователя.
- proj-scheme.el Работа с Scheme(Guile) файлами
- project-am.el ; project-am создание структур и работа с Automake проектами
- makefile-edit.el
- autoconf-edit.el
- cpp-root.el Быстрая работа с C++ проектами.
- emacs.el Специальный проект для специальной программы
- linux.el Ещё один спец проект для ядра линукс
- loaddefs.el - чего-то специальное для пакета, похоже на import в python
- locate.el ищем тэги в проекте и прочее для автодополнения
- dired.el настраиваем dired для ede
- files.el сканирование папок и файлов проекта
- custom.el Настройка проекта через customization интерфейс
- detect.el Обнаружение файлов для автозагрузки
- speedbar.el Представление проекта в Speedbar
- srecode.el Доп функции для работы с подстановкой в шаблоны через srecode
- system.el Работа с системой ,там CSV и FTP, SSH
- shell.el Запуск команд в оболочке связанное с проектом.
- util.el Несмотря на громкий заголовок, тут только функция обновляющая версию софта в заголовках файлов.
- make.el Выбор make программ, если есть выбор
- simple.el Для simple-project
- source.el Объекты файлов с исходными кодами и определение свойств, вроде языка используемого в файле.
Кстати вот для proj проектов этапы генерации Makefile
;;; Commentary: ;; ;; Code generator for Makefiles. ;; ;; Here is how it should work: ;; 1) Collect information about the project and targets ;; 2) Insert header into the Makefile ;; 3) Insert basic variables (target/source) ;; 4) Conditional ;; a) Makefile ;; 1) Insert support variables (compiler variables, etc) ;; 2) Insert VERSION and DISTDIR ;; 3) Specify top build dir if necessary ;; 4) Specify compile/link commands (c, etc) ;; 5) Specify dependency files ;; 6) Specify all: target ;; 7) Include dependency files ;; 8) Insert commonized target specify rules ;; 9) Insert clean: and dist: rules ;; b) Automake file ;; 1) Insert distribution source variables for targets ;; 2) Insert user requested rules
2 Собираем простой проект и смотрим что происходит
Теперь посмотрим что реально происходит. Итак cedet сейчас идет в основной поставке emacs(удивительно при этом хоть программа и заброшена в основной поставке чуток протухший вариант.).
Следующий строчки есть в моём конфиге.
;; Load Project.ede (require 'cedet) (require 'eieio) (require 'eieio-speedbar) (require 'eieio-opt) (require 'eieio-base) (require 'ede/source) (require 'ede/base) (require 'ede/auto) (require 'ede/proj) (require 'ede/proj-archive) (require 'ede/proj-aux) (require 'ede/proj-comp) (require 'ede/proj-elisp) (require 'ede/proj-info) (require 'ede/proj-misc) (require 'ede/proj-obj) (require 'ede/proj-prog) (require 'ede/proj-scheme) (require 'ede/proj-shared) (semantic-mode 1) (global-ede-mode t)
Итак у нас проект. Файл main.cpp с подключенным локальным room.h и класс Room описанный в room.h ,реализованный в room.cpp, используемый в main.cpp
Делаем(проверьте что ваш тестовый проект итак компилируется).
- Открываем в emacs файл main.cpp
- Используем Development->Create Project либо M-x ede-new
- Выбираем тип проекта Makefile кстати так как у меня не подключены ede/linux ede/emacs то видимо их в проектах и нет.
- Выбираем создать новую цель M-x ede-new-target или C . t
- Выбираем имя запускаемого файл, тип цели программа program и имя годового бинарника
- Открываем файл room.h нам предложат добавить его в цель, либо если предложения не поступит Added File (С . a)
- Открываем файл room.cpp нам предложат добавить его в цель, либо если предложения не поступит Added File (С . a)
Смотрим как выглядит сгенерированный файл.
;; Object ede-proj-project-15f5a24 ;; EDE Project Files are auto generated: Do Not Edit (ede-proj-project "ede-proj-project-15f5a24" :file "Project.ede" :name "killzone" :targets (list (ede-proj-target-makefile-program "ede-proj-target-makefile-program-16c017c" :name "automa" :path "" :source '("main.cpp" "room.cpp") :auxsource '("room.h"))))
- Теперь компелируем M-x ede-compile-target (С . c)
Пример проекта лежит в здесь.
2.0.1 Прописываем свою переменную в Makefile
- Для этого M-x customize-project
- В вкладке Settings и подпункте Variables задаем переменную CPPFLAGS
- Запускаем нашу программу в консоли M-x ede-run-target (C . R)
3 Описание класса проекта и его возможности
Так как проект CEDET использует ООП, то надо посмотреть что за объектами он оперирует и что эти объекты могут.
3.1 ede-project-placeholder
Самый первый и базовый класс:
- name - имя проекта нужно для дистрибуции
- version - версия программы при дистрибуции
- directory - папка ассоциированная с проектом
- dirnode - inode папки с проектов(это на случай если мы её переименуем или переместим)
- file - файл уникальный для этого проекта. Иногда файл отмечает тип проекта.
- rootproject - указатель на на корневой проект.
Поля custom, так понимаю нужны для представления объекта в интерфейсе Customize
Т.е. вот допустим есть FreeCAD ? частью которого является OCE,который сам не маленький. Вот пример проекта и подпроекта. Вообще про разбиение нужно было им написать побольше да и по лучше.
3.2 ede-project
- subproj - список подпроектов данного проекта. В Automake проектах каждая директория это подпроект.
- targets - список объектов ede-target
- locate-obj - непонятное для внутреннего употребления.
- tool-cache - список утилит для управления конфигурацией проекта(нигде не задан)
Вот например список полей которые я мягко говоря назвал бы необязательными для проектов. И вынес бы. Так как они больше относятся к /деплою/(загрузке на сервер, распространению) проекта.
- mailinglist
- web-site-directory
- web-site-file
- ftp-site
- ftp-upload-site
- configuration - список доступных типов конфигурации проекта, по умолчанию debug,release
- configuration-default - значение по умолчанию из списка выше.
- local-variables - локальные переменные, elisp переменные, не совсем понятно что можно переопределить и как оно сработает.
- keybinding - Биндинг проектов начинается на C-c . остальные сочетания доступны здесь, так по умолчанию две привязки D-debug R-run
- menu - формирование строки меню (смотри подпункты Develpment пункта меню)
[ "Update Version" ede-update-version ede-object ] [ "Version Control Status" ede-vc-project-directory ede-object ] [ "Edit Project Homepage" ede-edit-web-page (and ede-object (oref (ede-toplevel) web-site-file)) ] [ "Browse Project URL" ede-web-browse-home (and ede-object (not (string= "" (oref (ede-toplevel) web-site-url)))) ] "--" [ "Rescan Project Files" ede-rescan-toplevel t ] [ "Edit Projectfile" ede-edit-file-target (ede-buffer-belongs-to-project-p) ]
3.3 ede-proj-project
Наследует свойства от ede-project и от eieio-persistent - класс записываемых на диск объектов(файлов)
- extention расширение файла .ede
- file-header-line ну там строка по умолчанию
- makefile-type - не совсем понятно что за тип объектов, но пока здесь выбор из двух Makefile.am(Automake) и Makefile.
- variables - Переменные заданные в Makefile(не в проекте, как local-variables)
- configuration-variables - Переменные связанные с вариантом конфигурации(debug,release и.т.д)
- inference-rules - правила добавления строк в makefile объект типа ede-makefile-rule
- include-file дополнительные файлы просто подключают готовые Makefile в ваш Makefile
- automatic-dependencies ??вот это непонятно ,что такое автоматические зависимости в Makefile
- menu - пункты меню Regenerate Makefiles , Upload Distribution
- metasubproject -непонятная фича нужная только чтобы запихивать дистрибуцию большого проекта, разбитого на подпроекты.
3.4 cpp-root-project
Проекты такого вида добавляются сразу в .emacs конфиг, поэтому не забудьте его перечитать при изменении параметров конфигурации. Либо вы можете записать все те же строчки в Project.el и загружать его.
Собственно класс (наследует также eieio-instance-tracker)
- tracking-symbol
- include-path - локальные папки с библиотеками по умолчанию /include и ../include
- system-include-path - помогает семантику понять что можно автодополнять и откуда. Но вроде как не переопределят переменную так как при заднии avr библиотеками мне все равно подсовывали общие функции.
- spp-files Уникальные макросы
- header-match-regexp (непонятно почему это не внешняя переменная)
- locate-fcn своя собственная функция возвращающая полное имя файла
- compile-command вручную заданная команда для компиляции
В общем ничего сверхсложного берем указываем, папку, где лежат библиотеки и команду для компиляции и вуаля.
Из плюсов тут мы говорим semantic откуда искать и автодополнять библиотеки, так как по умолчанию он знает только о стандартных системных. На создание шаблонов проектов тоже не тянет.
3.5 ede-generic-project
Вроде как это идея упрощенной работы с сторонними системами сборки или makefil-ах. Теоретически если проект содержит файл ассоциирующийся с системой сборки то будет создан generic проект с забитыми по умолчанию командами сборки и дебага.
Проблема только в том что непонятно как это все грузить и как действовать, документацию мало того что скудная так и примерами особо не обладает. Т.е. надо что-то ещё сделать по мимо ede-enable-generic-projects
3.5.1 Заметки
Исследование почему работает или не работает код навело меня на функцию ede-show-supported-project
LINUX ROOT EMACS ROOT Make Automake automake Arduino sketch
4 Описание класса целей
4.1 ede-target
- name
- path путь к папке с целью
- source - список файлов цели
- versionfile - список файлов с исходным кодом в которых есть строка с версией программы.
- sourcetype - параллельный списку source объектов список объектов ede-sourcecode
- keybinding - доп. гор.клавиши заданные для цели
- menu - настройка и внешний вид выпадающего меню Development->Target Options
4.2 ede-proj-target
- auxsource вспомогательные файлы не используются при распространении (странно у меня .h записан в auxsource, и потом при Make distribution он не запихнул в архив с программой .h файлы )
- dirty - boolean - флаг установлен в true когда сгенерированные системой файлы нуждаются в обновлении.
- availablecompilers список объектов ede-compiler
- compiler выбранный из списка выше компилятор
- availablelinkers список объектов ede-linker
- linker выбранный из списка выше линкер
- phony -boolean цель которая не связана с изменением файла и всегда должна выполняться
4.3 Объекты compiler, linker и source
Итак существуют классы вспомогательных объектов, вроде компилятора, линкера и файлов исходного кода.
Первая мысль была в том что тут можно указывать конкретные версии компилятора, как например в qtcreator показываются доступные на системе наборы инструментов. Но нет.
Итак мы видим объект ede-proj-target который содержит объекты ede-compiler который в свою очередь содержит список объектов ede-makefile-rule , о каких разных системах сборки может идти речь.
Пока не видно обратного примера, по умолчанию у нас один cpp компилятор, один линкер для cpp файлов итд итп.
(defvar ede-gcc-compiler (ede-object-compiler :name "gcc" :dependencyvar '("C_DEPENDENCIES" . "-Wp,-MD,.deps/$(*F).P") :variables '(("CC" . "gcc") ("C_COMPILE" . "$(CC) $(DEFS) $(INCLUDES) $(CPPFLAGS) $(CFLAGS)")) :rules (list (ede-makefile-rule :target "%.o" :dependencies "%.c" :rules '("@echo '$(C_COMPILE) -c $<'; \\" "$(C_COMPILE) $(C_DEPENDENCIES) -o $@ -c $<" ) )) :autoconf '("AC_PROG_CC" "AC_PROG_GCC_TRADITIONAL") :sourcetype '(ede-source-c) :objectextention ".o" :makedepends t :uselinker t) "Compiler for C sourcecode.") (defvar ede-cc-linker (ede-linker :name "cc" :sourcetype '(ede-source-c) :variables '(("C_LINK" . "$(CC) $(CFLAGS) $(LDFLAGS) -L.")) :commands '("$(C_LINK) -o $@ $^ $(LDDEPS)") :objectextention "") "Linker for C sourcecode.") (defvar ede-source-c++ (ede-sourcecode :name "C++" :sourcepattern "\\.\\(c\\(pp?\\|c\\|xx\\|++\\)\\|C\\(PP\\)?\\)$" :auxsourcepattern "\\.\\(hpp?\\|hh?\\|hxx\\|H\\)$" :garbagepattern '("*.o" "*.obj" ".deps/*.P" ".lo")) "C++ source code definition.")
5 Собираем проект для микроконтроллера
Возьмем пример, отсылающий букву 'A' по UART и попытаемся его собрать.
В проекте лежит файл AVR_true.mk с Makefile
PROGRAM = uart_clear_c_tx MCU = atmega32u4 CC = avr-gcc OBJCOPY = avr-objcopy CFLAGS += -Wall -g -Os -mmcu=$(MCU) LDFLAGS += OBJS = $(PROGRAM).o # Be silent per default, but 'make V=1' will show all compiler calls. V = 1 ifneq ($(V),1) Q := @ endif all: $(PROGRAM).hex $(PROGRAM).elf: $(PROGRAM).o @printf " LD $(subst $(shell pwd)/,,$(@))\n" $(Q)$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^ $(PROGRAM).hex: $(PROGRAM).elf @printf " OBJCOPY $(subst $(shell pwd)/,,$(@))\n" $(Q)$(OBJCOPY) -O ihex $< $@ %.o: %.c @printf " CC $(subst $(shell pwd)/,,$(@))\n" $(Q)$(CC) $(CFLAGS) -o $@ -c $< flash: $(PROGRAM).hex @printf " FLASH $(PROGRAM).hex\n" $(Q)avrdude -c avrispv2 -P usb -p t13 -U flash:w:$(PROGRAM).hex
Вроде ничего сложного, цель для программы, для создания hex файла и цель для прошивки. Используя возможности ede-proj-project максимум на что удалось приблизится это
;; Object ede-proj-project-1564b16c95dc ;; EDE Project Files are auto generated: Do Not Edit (ede-proj-project "ede-proj-project-1564b16c95dc" :file "Project.ede" :name "AVR example" :targets (list (ede-proj-target-makefile-program "ede-proj-target-makefile-program-1564b20547a8" :name "main.elf" :path "" :source '("uart_clear_c_tx.c") :configuration-variables nil :rules (list (ede-makefile-rule "ede-makefile-rule-1564b1fc1f38" :target "flash" :dependencies "main.hex" :rules '("avrdude -c avrispv2 -P usb -p t13 -U flash:w:main.hex") :phony t) (ede-makefile-rule "ede-makefile-rule-1564b1fe3338" :target "main.hex" :dependencies "main.elf" :rules '("$(OBJCOPY) -O ihex $< $@")))) (ede-proj-target-makefile-miscelaneous "ede-proj-target-makefile-miscelaneous-1564b2081754" :name "main.h" :path "" :source '("uart_clear_c_tx.c"))) :variables '(("CC" . "avr-gcc") ("MCU" . "atmega32u4") ("CFLAGS" . "-Wall -g -Os -mmcu=$(MCU)") ("OBJCOPY" . "avr-objcopy")) :configuration-variables nil :inference-rules (list (ede-makefile-rule "ede-makefile-rule-1564b1eb48d4" :target "%.hex" :dependencies "%.elf" :rules '("$(OBJCOPY) -O ihex $< $@"))))
И то запускается это все через пень колоду, т.к. не могу написать что после компиляции мне ещё нужна и конвертация из elf в hex. Такого понятия нет в настройках, как и переопределения шаблона применяемого для цели. Т.е. вот эта куча кода, а выигрыша нет. Что уж говорить о генерации вывода дизассемлера, запуск simulavr и прошивка туда программы.
На всякий случай, что мы здесь задали: новые цели и правила, внутренние переменные, ещё можно подключить готовый Makefile, но тут вопрос как нам к нему цели их вывод подвязать например называть все цели в проектах - main и подвязывать команды к таким именам как main_SOURCE main_OBJ и как-то переопределить цель all.
Вы самостоятельно можете сравнить исходный AVR_true.mk и тот что генерируется из проект Project.ede (Makefile)
Возможно, можно использовать ede-cpp-root-project и указать там напрямую compile-command оставив наш шаблонный Makefile, но это не выход.
5.1 TODO Деплой и отладка!
По хорошему нам и команду запуска надо переопределить в local variables.
6 Собираем Arduino проект
Итак нам понадобиться
- elisp пакет arduino-mode
- arduino-ide по умолчанию проект выше привязан к системному пути, мы же рассмотрим выкачанное и распакованное свежее IDE.
- Arduino-Makefile тоже надо выкачать.
Чем хорошо Arduino-mode это пример того как человек решился сделать полноценную поддержку диалекта языка, даже разобрался с добавлением проектов в EDE, подсветкой синтаксиса, это очень круто.
Смотрим как реализована поддержка EDE в .emacs.d/elpa/arduino-mode-*/ede-arduino.el
Там есть свой класс ede-arduino-project от погдружается через autoload , не требует проектного файла размещенного в корне каталога или записи в emacs конфигах, так как привязка идет по файлу с характерным расширение .ino или .pse, схожим образом вроде как должны действовать generic проекты.
6.1 Настройка arduino-mode
У меня свежая IDE выкачана а не поставлена из пакета. И вот так настроено, через модный сейчас use-package(выкачивает нужный пакет в случае отсутствия).
(use-package arduino-mode :ensure t :custom (ede-arduino-appdir "~/source/arduino-1.8.8") (ede-arduino-arduino-command "~/source/arduino-1.8.8/") (ede-arduino-preferences-file "~/.arduino15/preferences.txt") (arduino-executable "~/source/arduino-1.8.8/arduino"))
6.2 Не создается проект
Описанная проблема существует в коде arduino-mode на момент 19.02.2018, патчи сделаны и отправлены.
После того как переменные настроены. Открываем наш .ino проект. И пытаемся создать проект M-x ede-new тип Arduino Sketch
Первой ошибкой при выполнении ede-new или ede-load-project в файле ino было вылет и указание на то что переменная должна быть строкой, а не nil
По идее arduino-project не требует файла проекта, вызывая при ede-new объект :proj-file 'ede-arduino-file который в свою очередь вызывается без передачи dir параметра и все ломает.
Смотрим файл ede-arduino.el
(defun ede-arduino-root (&optional dir basefile) "Get the root project directory for DIR. The only arduino sketches allowed are those configured by the arduino IDE in their sketch directory. If BASEFILE is non-nil, then convert root to the project basename also. Consider expanding this at some later date." (let* ((prefs (ede-arduino-sync)) ;; without expansion the comparison in the next step fails ;; for relative files (dir (cond (dir ;переопределяем инициализацию (expand-file-name dir)) ; переменной (t default-directory)) ) (sketchroot (and prefs (oref prefs sketchbook))) )
Тут мы задаем dir как папку в которой находится файл из которого мы вызывали ede-new
6.3 Компиляция
Arduino из консоли собирается с помощью Arduino.mk(скачайте его), который подключен к сгенерированному ede Makefile.
Идем в папку с исходниками Arduino IDE и делаем там символьную ссылку
ln -s ~/source/Arduino-Makefile/Arduino.mk Arduino.mk
Пытаемся скомпилировать и терпим фейл.
А все почему а потому что у нас в сгенерированном Makefile который генерируется при запуске C c . c
Не прописывается наша плата
Проблема в куске кода, ниже, тут генерится через srecode простейший Makefile используя шаблон ede-make.srt Шаблон ede-empty , надо запомнить что файлы с шаблонами имеют расширение srt.
(ede-srecode-insert "arduino:ede-empty" "TARGET" (oref proj name) "ARDUINO_LIBS" (mapconcat 'identity (ede-arduino-guess-libs) " ") "MCU" (oref board mcu) "F_CPU" (oref board f_cpu) "PORT" (oref prefs port) "BOARD" (oref prefs board) ;Добавляем эту строчку "AVRDUDE_ARD_BAUDRATE" (or ede-arduino-avrdude-baudrate (oref board speed)) "AVRDUDE_ARD_PROGRAMMER" (oref board protocol) "ARDUINO_MK" (ede-arduino-Arduino.mk) "ARDUINO_HOME" (ede-arduino-find-install) ))
Файл ede-arduino.el
7 Итоги и как со всем этим работать
Не будем смотреть на грустную сторону, а именно работу с CMake или кем-то написанным проектом с ручным autoconf, makefile итд. Также не будем про интеллектуальное детектирование типов проектов.
Что мы можем, ставить менять значения переменных в Makefile
Мы можем подгружать сторонние куски Makefile как пример Arduino.mk полностью сторонний.
local-variables – переопределяет непонятно что, т.е. для generic проекта есть переменные вроде compile-command но вот в proj есть поля.
Ещё мы можем подключаться к чужим проектам через generic-projects и запускать сборку или отладку, но есть подозрения что projectile делает это лучше и проще. Вообще надо будет ещё раз пересмотреть видео Дмитрия Бушенко о EDE и заставить работать generic проекты.
И да у нас нет шаблонных проектов ,от слова совсем. То как выглядят и реализованы linux-project emacs-project и cpp-project да тот же ардуино в рамках данной системы этого не то что чудовищно, это ужас, столько кода, а результат пшик.
Сами проекты не разделены, на сборку, загрузку, типы сборочных инструментов прибиты к Make и Automake и даже то что есть этого недостаточно, например когда вам нужно по мимо, компиляции сделать hex, сделать листинг дизассемлера итд итп. В EDE используется работа с шаблонами через srecode, не знаю на сколько он современен и лучше/хуже YasSnippet в этих задачах.
Документации мало, тестовых проектов тоже в папке не валяется. И самое главное за столько лет ничего и не появилось, есть cmake-ide и все и тишина, тишина. Для простых проектов когда лень писать makefile он вполне сойдет, сложные будут использовать его по минимуму как просмотр папок и быстрая привязка к горячей клавише компиляции/запуска.
Если у меня будет время(скорее всего нет) то надо:
- Разобраться с другими элементами CEDET с которыми взаимодействует EDE
- Посмотреть projectile (это видимо придется сделать)
- Вырезать весь лишний функционал вроде web сайта и прочего распространения.
- Оставить работу через шаблоны, подгрузку через autoload и детектирование
- Пользовательские конфигурации.
Вот ещё из интересных ссылок подгрузка cpp проекта где EDE использует данные полученные от projectile и привязывается к файлу проектов projectile.
В ближайшее тысячелетие, постараюсь посмотреть возможна ли нормальная работа rtags или lsp-client(eglot) для работы с C++ , но лучше если Вы сразу поделитесь своими впечатлениями.