Изучаем EDE
Чтобы понять, выбросить, или простить.

Когда вы отправляетесь в крестовый поход. Вам просто необходим менеджер проектов. Да, с начала хватит одной команды, затем вы добавляете строчки в makefile. Потом находите чужой makefile и правите его и копируете из проекта в проект. Затем, возможно вы создаете свою систему из генераторов Makefile написанных на bash/python/perl и живете с ней один.

В это время обычные люди создают шаблонные проекты в IDE. Встраиваются в разработку проектов работая в цикле разработки который уже есть.

А у Вас Emacs и все пишут про гибкость, настраиваемость, а про EDE пишут что он сдох.

Вам повезло, есть ещё люди готовые угрохать кучу времени на что-то бесполезное, чтобы проверить насколько это бесполезно. См. цикл статей про openPLM и встраивание в его разработку.

Содержание

Начальное изучение вопросы думаю у всех начинается с этой статьи1

1 Структура

Рассмотрим содержание папки /usr/share/emacs/версия emacs/lisp/cedet/ede/

Разузнав про реализацию ООП в elisp, а именно EIEIO, узнаем про то как задаются классы и наследование через defclass. Смотрим описание файлов и что в них задано.

ede_prj_class_ctructure.png

ede_target_class_structure.png

Смотрим на наследование классов, а также описания в заголовках файлов. Из базовых классов 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

Делаем(проверьте что ваш тестовый проект итак компилируется).

  1. Открываем в emacs файл main.cpp
  2. Используем Development->Create Project либо M-x ede-new
  3. Выбираем тип проекта Makefile кстати так как у меня не подключены ede/linux ede/emacs то видимо их в проектах и нет.
  4. Выбираем создать новую цель M-x ede-new-target или C . t
  5. Выбираем имя запускаемого файл, тип цели программа program и имя годового бинарника
  6. Открываем файл room.h нам предложат добавить его в цель, либо если предложения не поступит Added File (С . a)
  7. Открываем файл 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

cedet_customize_variable.png

  • Запускаем нашу программу в консоли 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++ , но лучше если Вы сразу поделитесь своими впечатлениями.

Сноски:

Дата: 2019-02-23 Сб 23:40

Автор: valber

Created: 2019-08-26 Пн 00:06

Validate