• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Универсальный Makefile для всех примеров

nikolz

Well-known member
CHERTS,
Добрый день,
давно не смотрел Ваш UDK.
У меня вопрос.
В мейк файлах примеров очень много повторяющегося кода.
Почему Вы не выносите общее в один файл?
По-моему мнению так и вносить изменения в старые примеры и делать новые проекты удобнее и проще.
Или есть какие-то принципиальные моменты так не делать?
Спасибо.
 

CHERTS

Moderator
Команда форума
CHERTS,
Добрый день,
давно не смотрел Ваш UDK.
У меня вопрос.
В мейк файлах примеров очень много повторяющегося кода.
Почему Вы не выносите общее в один файл?
По-моему мнению так и вносить изменения в старые примеры и делать новые проекты удобнее и проще.
Или есть какие-то принципиальные моменты так не делать?
Спасибо.
Добрый вечер, на то есть свои причина и самая основная - это простота для начинающего разработчика. Непосвященным людям вникнуть в тонкости написания Makefile довольно сложно, в текущем виде все что нужно лежит в 1 файле, да это не оптимально, но это просто, а простота - залог успеха. Тем более почти во всех примерах Makefile одинаковый, меняется лишь набор библиотек необходимых для сборки того или иного примера.
И то что есть в примерах не значит, что так нужно делать в рабочем проекте, это лишь примеры показывающие возможности ESP и дающие пищу для размышления и действий.

Вы можете написать свой пример, в котором будет красивый с Вашей точки зрения Makefile и сделать pull request на github, DevKit открытый проект, каждый может вносить доработки и исправлять мои ошибки и недоработки, я буду только рад этому, правда пока добровольцев нет.
 

nikolz

Well-known member
CHERTS,
добрый день,
Я полагал,
что для тех кто не умеет делать мейк файлы
будет еще проще работать в новых проектах c таким мейк файлом:
-----------------
ROOT =../..
MODULES = driver
include $(ROOT)/Makefile.common
-----------------
вместо существующего.
 

CHERTS

Moderator
Команда форума
CHERTS,
добрый день,
Я полагал,
что для тех кто не умеет делать мейк файлы
будет еще проще работать в новых проектах c таким мейк файлом:
-----------------
ROOT =../..
MODULES = driver
include $(ROOT)/Makefile.common
-----------------
вместо существующего.
В какой папке лежит Makefile.common? Наверняка в папке отличной от папки проекта, то есть мы получаем разрозненный проект, который чтобы перенести из C:\Espressif\examples\ скажем в F:\MyProject нужно еще будет лазить по другим папкам и искать хвосты и зависимости + потом еще и править основной Makefile проекта чтобы подцепить эти хвосты из другого места, разве это проще?
Возможно я ошибаюсь, пришлите тестовый проект на основе hello_world, если Ваш вариант действительно будет удобнее, то я не против использовать его.
 

nikolz

Well-known member
Это каким же должен быть отважным Буратино,
чтобы, не зная как делать мейк файлы,
начать вытаскивать из ESpressif примеры в отдельные каталоги?
-------------------------------------------------
Попробую перечислить несколько плюсов в предлагаемом варианте.
1) Не зависит от диска на котором Espressif. (сейчас лишь на C)
2) Менять параметры порта надо в одном файле Makefile.port :
# port
ESPPORT ?= COM4
# Baud rate for programmer
BAUD ?= 256000

--------------------
(сейчас во всех проектах)
3) Изменять настройки для записи во flash в файле Makefile.flash (сейчас во всех проектах)
4) Изменить параметры компилятора в файле Makefile.comp (сейчас во всех проектах)
5) Изменить параметры загрузчика в одном файле Makefile.boot (сейчас во всех проектах)
6) Изменить параметры flash в одном файле Makefile.spi (сейчас во всех проектах)
Все файлы настройки собраны в файле Makefile.common, в который легко добавить новые общие для всех настройки.
------------------------------------
Все файлы выкладываю здесь (каталог kamnik)
Makefile без расширения помещаем в примеры, а с раширениями (их 6) копируем в каталог Espressif
Прикладываю вариант для примера 1wire_ds18b20
для других примеров с датчиками будет тоже самое
=============================
Расскажу еще одно развитие.
Я его тоже сделал давно, для новой сборки еще не переделал.
Я вытащил все драйвера в каталог driver в ESpressif
В результате из примеров ушли драйвера и стали они одинаковые для всех примеров.
Сейчас же например драйвер uart.c в примере 1wire_ds18b20 имеет длину 7 kB
а в примере at_v0.20_on_SDKv0.9.4 11 kB.
А разве uart разный? нет
а драйверы чем отличаются? ...
и так во всех примерах .
Если исправить ошибку в одном месте, то надо шарить по всем примерам,
чтобы исправить в других вариантах драйвера датчика.
и так для всех устройств - куча разных глючных или нет вариантов.
-------------------------------------
Согласитесь, что хорошо когда драйвер для датчика один - самый лучший,
а не куча незнамо каких.
-------------------------------------------
 

Вложения

CHERTS

Moderator
Команда форума
Не пойму зачем разбивать Makefile на кучу Makefile.port Makefile.flash Makefile.comp и т.д.?
Захотел я поменять одни, вторые, третьи настройки и придется лазить по кучи файлов.
Уж тогда проще все сгрузить в один общий файл.
А захотел я для одного примера чтобы он шился через COM2, а параллельно второй через COM3 и что делать?
Или захотел я один пример собрать в SDK 1.3.0, а параллельно второй с SDK 1.4.0 и что опять делать?
Нет не убедили Вы меня, идея хорошая, но выносить настройки в разные файлы и тем более за пределы проекта - это утопизм.
 

nikolz

Well-known member
Не пойму зачем разбивать Makefile на кучу Makefile.port Makefile.flash Makefile.comp и т.д.?
Захотел я поменять одни, вторые, третьи настройки и придется лазить по кучи файлов.
Уж тогда проще все сгрузить в один общий файл.
А захотел я для одного примера чтобы он шился через COM2, а параллельно второй через COM3 и что делать?
Или захотел я один пример собрать в SDK 1.3.0, а параллельно второй с SDK 1.4.0 и что опять делать?
Нет не убедили Вы меня, идея хорошая, но выносить настройки в разные файлы и тем более за пределы проекта - это утопизм.
--------------------
Добрый день,
все Ваши доводы с позиции знатока (на форуме таких два - Вы да pvvx).
Другие, в том числе и я, не заморачиваются кучей плат для разных портов.
--------------------------------
Поэтому с позиции пользователя, который не в зуб ногой ни в мейках, ни в настройках все выглядит иначе:
1) У большинства есть лишь один порт, к которому подключен какой нибудь dev-kit или преобразователь UART-USB.
Зачем плодить кучу подключений начинающему?
2) Полагаю что большинство изменяет лишь настройки порта. И изменить их в файле где две строчки вообще ума не надо.
А вот менять что-то в других местах надо все реже и реже.
Мейк с компилятором зависит от обновлений Xtensa
Мейк с flash зависит от появления новых загрузчиков
Мейк spi зависит от модификации ESP
Таким образом, изменения вносятся, если надо в зависимости от того, что конкретно Вы изменили
При этом лишь в целевой мейк и при этом лишь один раз.
-------------------------------
В моем варианте не надо много знать чтобы что-то исправить с пониманием этого и всего в одном месте.
------------------------------------
Мне так нравится. Дело привычки, разумеется.
 

pvvx

Активный участник сообщества
Не пойму зачем разбивать Makefile на кучу Makefile.port Makefile.flash Makefile.comp и т.д.?
Захотел я поменять одни, вторые, третьи настройки и придется лазить по кучи файлов.
Уж тогда проще все сгрузить в один общий файл.
А захотел я для одного примера чтобы он шился через COM2, а параллельно второй через COM3 и что делать?
Или захотел я один пример собрать в SDK 1.3.0, а параллельно второй с SDK 1.4.0 и что опять делать?
Нет не убедили Вы меня, идея хорошая, но выносить настройки в разные файлы и тем более за пределы проекта - это утопизм.
Зачем вообще эти Makefile? Всё можно настроить в меню Eclipse, без Makefile-s. Там проблемки только с программированием-заливкой в модуль, но и то решаемые.
Другие, в том числе и я, не заморачиваются кучей плат для разных портов.
Пишите плагин к Eclipse. Он решит все ваши проблемы и у тех кто не хочет даже лазать в Makefile.
 

nikolz

Well-known member
Зачем вообще эти Makefile? Всё можно настроить в меню Eclipse, без Makefile-s. Там проблемки только с программированием-заливкой в модуль, но и то решаемые.
Пишите плагин к Eclipse. Он решит все ваши проблемы и у тех кто не хочет даже лазать в Makefile.
А в чем разница плагина от мейка?
По мне так дело привычки и опыта.
---------------------------------------------
Кому нравится пиво пить с раками,
а кому водка с пивом.
 

pvvx

Активный участник сообщества
А в чем разница плагина от мейка?
В том, что ничего вообще писать не требуется при создании нового проекта.
Никакой водки или пива - не требуется разбираться какая из них более ядовитая...
 

nikolz

Well-known member
В том, что ничего вообще писать не требуется при создании нового проекта.
Никакой водки или пива - не требуется разбираться какая из них более ядовитая...
это хорошо. Но знаете только Вы.
А с мейками тоже ничего писать не надо, так как они одинаковые для всех проектов, кроме nodemcu,RTOS .
Но у этиз свои мейки и Вы их тоже пользуете даже с плагинами.
Так что вкуривайте.
 

CHERTS

Moderator
Команда форума
nikolz я понял вашу идею, но на мой взгляд она более сложная чем один Makefile файл и запутанная.

Более правильно было бы вынести в Makefile проекта все переменные для настройки, их немного

Код:
SDK_BASE ?= c:/Espressif/ESP8266_SDK
SDK_TOOLS ?= c:/Espressif/utils
ESPTOOL ?= $(SDK_TOOLS)/esptool.exe
ESPPORT ?= COM3
BAUD ?= 256000
SPI_SPEED ?= 40
SPI_MODE ?= qio
SPI_SIZE_MAP ?= 0
MODULES = driver user
include $(SDK_BASE)/Makefile.common
а в Makefile.common записать всю логику, та что у вас раскидана по Makefile.boot Makefile.flash Makefile.port и т.п. и положить этот Makefile.common в папку $(SDK_BASE) чтобы он был уникальным для каждой версии SDK
 
Последнее редактирование:

pvvx

Активный участник сообщества
это хорошо. Но знаете только Вы.
А с мейками тоже ничего писать не надо, так как они одинаковые для всех проектов, кроме nodemcu,RTOS .
Но у этиз свои мейки и Вы их тоже пользуете даже с плагинами.
Так что вкуривайте.
У меня свои SDK и мне всё равно - у меня даже esptool.py свой и к каждому проекту... Стандартные SDK имеют слишком много ошибок и никуда не годятся.
Для мигания светодиодом телепузикам есть Дурина - там не надо лезть ни в какие SDK и маке.
 

nikolz

Well-known member
nikolz я понял вашу идею, но на мой взгляд она более сложная чем один Makefile файл и запутанная.

Более правильно было бы вынести в Makefile проекта все переменные для настройки, их немного

Код:
SDK_BASE ?= c:/Espressif/ESP8266_SDK
SDK_TOOLS ?= c:/Espressif/utils
ESPTOOL ?= $(SDK_TOOLS)/esptool.exe
ESPPORT ?= COM3
BAUD ?= 256000
SPI_SPEED ?= 40
SPI_MODE ?= qio
SPI_SIZE_MAP ?= 0
MODULES = driver user
include $(SDK_BASE)/Makefile.common
а в Makefile.common записать всю логику, та что у вас раскидана по Makefile.boot Makefile.flash Makefile.port и т.п. и положить этот Makefile.common в папку $(SDK_BASE) чтобы он был уникальным для каждой версии SDK
----------------------
Так я же не призываю делать так же как я.
Я лишь даю некоторые, на мой взгляд, полезные идеи для развития.
----------------------------------
Порою прогрессивный шаг вперед есть результат пинка под зад.
 

Tomahawk

New member
Если разбить 1 мэйкфайл на маленькие, то это не приведёт к большему пониманию того, что там происходит. Номер порта итак сверху находится, разницы где менять никакой. А если более глубоко с ними разбираться, то удобнее когда все make-переменные находятся в одном файле, так проще поиск делать, чтобы понять что с чем связано.
 

nikolz

Well-known member
CHERTS,
Просьба
Соберите UDK исключительно на библиотеках китайцев.
Иначе Вы вечно будете чего-то доделывать и вечно будет что-то не стыковаться.
-----------------------------------------------------
то царь-пушка не стреляет, то царь-колокол не звонит.
 

CHERTS

Moderator
Команда форума
Соберите UDK исключительно на библиотеках китайцев.
Иначе Вы вечно будете чего-то доделывать и вечно будет что-то не стыковаться
А там итак на текущий момент только SDK от китайцев и все равно при обновлении китайской SDK некоторые примеры перестают собираться. Тут либо мне самому приходиться исправлять код примеров, чтобы он собирался с новой SDK, либо ждать пока это сделает автор оригинальных исходников, как например esphttpd - он как раз и не собирается с новой SDK, а автор проекта судя по всему плюнул на него.
 

pvvx

Активный участник сообщества
Соберите UDK исключительно на библиотеках китайцев.
Иначе Вы вечно будете чего-то доделывать и вечно будет что-то не стыковаться.
Если собирать на библиотеках от SDK, то требуется flash от 1 Мегабайт, а у народу модули с 512 кило.
И либы SDK без патчей не работоспособны и для большинства проектов не годятся из-за лишнего никому не нужного глючного наполнения.
Как пример - ваша горячо любимая NodeMCU совсем никуда не лезет со стандартными либами и её любители уже дано визжат и похрюкивают на сайте ESP32. Но там пока для заманухи кинули только RTOS.
 

pvvx

Активный участник сообщества
Соберите UDK исключительно на библиотеках китайцев.
К SDK уже приложен makefile именно по вашей системе. Ранее я давал его переделку как Root Level Makefile. От туда и появилась эта надпись.
Т.е. всё это уже проходили, а итог стал такой, как удобнее CHRERTS для сборки разных проектов в его UDK.
Мне например не нужен каталог C:\Espressif\examples вообще.
 
Сверху Снизу