LINUX.ORG.RU

avr-gcc makefile, несколько целей для avrdude

 , ,


0

1

добрый день
имеем

- makefile for avr-gcc
- avrdude
- несколько целей для прошивки (разные программаторы; разные параметры, разные по кол-ву и  настройкам)

задача: настроить так, что бы при вызове цели flash - отрабатывала дефолтная цель для дудки (flash_usbasp,flash_ispmkii,flash_109), которая настраивается в начале makefile

ну, и, соотв., отрабатывали все остальные «конкретные» цели (flash_usbasp,flash_ispmkii,flash_109)

выкрутился рекурсивными вызовом этого-же makefile

FLASH_NAME    ?= usbasp  ###!!! дефолтный программатор
FLASH_DEV     ?= usb

flash_usbasp  : FLASH_NAME    ?= usbasp
flash_usbasp  : FLASH_BRATE    = 115200
flash_usbasp  : FLASH_BCLOCK   = 4
flash_usbasp  : AVRDUDE_FLAG  += -b $(FLASH_BRATE) -B $(FLASH_BCLOCK)
flash_usbasp  : flash_cmd

flash_ispmkii : FLASH_NAME    = avrispmkII
flash_ispmkii : FLASH_BRATE   = 115200
flash_ispmkii : FLASH_BCLOCK  = 4
flash_ispmkii : AVRDUDE_FLAG += -b $(FLASH_BRATE) -B $(FLASH_BCLOCK)
flash_ispmkii : flash_cmd

flash_109     : FLASH_NAME    = avr109
flash_109     : FLASH_BRATE   = 9600
flash_109     : AVRDUDE_FLAG  += -b $(FLASH_BRATE)
flash_109     : flash_cmd

###!!!
# рекурсивынй вызов, в зов-ти от цели
###!!!
flash :
ifeq ($(FLASH_NAME),usbasp)
	$(MAKE)     flash_usbasp
endif
ifeq ($(FLASH_NAME),ispmkii)
	$(MAKE)     flash_ispmkii
endif
ifeq ($(FLASH_NAME),avr109)
	$(MAKE)     flash_avr109
endif

flash_cmd: $(TARGET).hex
	$(AVRDUDE) -c $(FLASH_NAME) -P $(FLASH_DEV) -F $(AVRDUDE_FLAG) -U flash:w:$(OUTDIR)/$<

вопрос: можно-ли красиво обойтись без рекурсии?

!!! UPDATE !!! решение найдено

FLASH_NAME   ?= name1
FLASH_NAME   ?= name2
FLASH_NAME   ?= name3

...

flash_name1  : FLASH_NAME =
flash_name1  : ARG = ...
flash_name1  : flash

flash_name2  : FLASH_NAME =
flash_name2  : ARG = ...
flash_name2  : flash

flash_name3  : FLASH_NAME =
flash_name3  : ARG = ...
flash_name3  : flash

flash : flash_$(FLASH_NAME)
    $(FLASH_CMD)

...

make all         - сборка проекта
make flash       - прошивка дефолтным свистком (настраивается)
make flash_$NAME - прошивка кастомным свистком

★★★★

Последнее исправление: sunjob (всего исправлений: 4)

я в мейкфайлах почти ничего не понимаю, но не проще ли будет сделать что-то типа такого:

FLASH_DEV ?= usb

flash: usbasp

usbasp: AVRDUDE_FLAG += -b 115200 -B 4
usbasp: FLASH_NAME = usbasp
usbasp: flash_cmd

ispmkii: AVRDUDE_FLAG += -b 115200 -B 4
ispmkii: FLASH_NAME = avrispmkII
ispmkii: flash_cmd

avr109: AVRDUDE_FLAG += -b 9600
avr109: FLASH_NAME = avr109
avr109: flash_cmd

flash_cmd:
	$(AVRDUDE) -c $(FLASH_NAME) -P $(FLASH_DEV) -F $(AVRDUDE_FLAG) -U flash:w:$(OUTDIR)/$<

anonymous
()

А можешь уточнить, что по твоему разумению есть дефолтный вызов. Не пойму. Для какого конкретного камня или что? Что касается дудки, то она итак по умолчанию, если не указан программатор, то пытается найти первый из списка в конфиге, что по сути и есть дефолт. Или ты про что?

Oberstserj ★★
()
Ответ на: комментарий от anonymous

по идее да, должно сработать, но есть маленькая заковырка.
хотелось бы иметь возможность «удобной» настройки проекта, втч и дефолта для программатора:

все необходимые настройки, втч и «свистка» - находятся в самом начале файла, в одном (ну почти в одно) месте

если использовать настройку цели, то эта часть находится далеко внизу makefile, файл является «общим, универсальным шаблон», поэтому очень большой :о) ну и, понятное дело, цель нельзя перенести наверх (или я ошибаюсь?! всякое может быть :о), максимум в самое начало целей

спасибо

sunjob ★★★★
() автор топика
Ответ на: комментарий от Oberstserj

аватарка очень хороша!

дефолтный вызов

flash         - дефолтная цель (переопределяемая)
flash_usbasp  - конкретные цели
flash_ispmkii - ...
flash_109     - ...

Что касается дудки, то она итак по умолчанию, если не указан программатор, то пытается найти первый из списка в конфиге

а нам-то ее дефолт нафига, дудковский?!!! :о) у нас тут свои тараканы...

sunjob ★★★★
() автор топика
Ответ на: комментарий от sunjob

А в чем проблема в самом начале main.c выделить блок в описанием свистка, фьюзов и прочей требухи и обрабатывать регуляркой при компиляции и прошивке? И не париться вообще с рекурсивками и оформлением мейкфайла?

Ну что-то из серии(как пример):


PART=$(grep -m 1 "mmcu=" %f | grep -o "\(atmega\|attiny\)[0-9].*\+") && echo target device: $PART && avr-gcc -mmcu=$PART -Os -o %e.o %f && avr-objcopy -O ihex %e.o %e.hex

TYPE=$(grep -m 1 "type=" %f | grep -o "\(t\|m\|s\|g\)[0-9].*\+") && echo type device: $TYPE && /usr/bin/avrdude -C /etc/avrdude.conf -p $PART -P /dev/ttyUSB0 -c usbasp-clone  -U flash:w:%e.hex:a

TYPE=$(grep -m 1 "type=" %f | grep -o "\(t\|m\|s\|g\)[0-9].*\+") && HFUSE=$(grep -m 1 "hfuse=" %f | grep -o "\0x.*\+") && LFUSE=$(grep -m 1 "lfuse=" %f | grep -o "\0x.*\+") && /usr/bin/avrdude -C /etc/avrdude.conf -p $TYPE -P /dev/ttyUSB0 -c usbasp-clone  -u -U hfuse:w:$HFUSE:m -U lfuse:w:$LFUSE:m

Oberstserj ★★
()
Ответ на: комментарий от Oberstserj

в самом начале main.c выделить блок в описанием свистка, фьюзов и прочей требухи

че? это что сейчас было?!!! у меня чуть голова не лопнула! это не наш футбол :о)

в случае, если бы нужно было заморочиться (эта часть уже давно сделана), то просто напросто оформить все в однострочники

make.conf
make.sh
make_all.sh
make_clean.sh
make_flash.sh
make_flash_eep.sh
make_flash_ispmk2.sh
make_flash_ice2.sh
make_flash_ice3.sh
make_flash_ice_x.sh
make_flash_usbasp.sh
make_flash_109.sh
make_fuse.sh
make_fuse_def.sh
make_fuse_get.sh
make_fuse_nano.sh
проще, понятнее, нагляднее итп... но, увы, запуск из ком-строки, удобна при «быстрой» отладке, а надо по «культурному» (по очевидным причинам)

спасибо

sunjob ★★★★
() автор топика
Последнее исправление: sunjob (всего исправлений: 2)
Ответ на: комментарий от sunjob

проще, понятнее, нагяднее итп.

Проще, понятнее и нагляднее - это в файле в блоке комментариев указать камень, частоту, фьюзы и свисток. А регулярка сама все сделает, чем писать 100500 мейкфайлов. Вот от этого точно голова лопнет.

а надо по «культурному»

По красивой кнопочке? Ну так забиндить на удобную тебе кнопку команду и жить в шоколаде, попивая вермут…

Oberstserj ★★
()
Последнее исправление: Oberstserj (всего исправлений: 1)
Ответ на: комментарий от sunjob

я ничего не понял. цели можно переносить куда хочешь, но дефолтной будет самая первая, насколько я знаю.

anonymous
()
Ответ на: комментарий от anonymous

но дефолтной будет самая первая, насколько я знаю

Цитирую автора:

это не наш футбол, у нас тут свои тараканы… :о)

Oberstserj ★★
()
Ответ на: комментарий от xaizek

цель по умолчанию all, т.е. сборка проекта

в контексте данного топика, дефолт- имеется в виду - дефолт для дудки

sunjob ★★★★
() автор топика
Ответ на: комментарий от sunjob

в контексте данного топика, дефолт- имеется в виду - дефолт для дудки

Нуууу? Проблема в чем? Ты чет как-то вокруг да около, но толком объяснить не можешь. Что так руками телодвижения делать, что сяк. Что конфиг один раз поправить не придумывая рекурсивных вызовов, что вообще не делать ничего и получить те же яйца в профиль. Дефолт-то для тебя тогда что?)

Oberstserj ★★
()
Ответ на: комментарий от sunjob

Если надо сначала all, а потом специфичную, то дополнительная зависимость должна зафиксировать порядок:

flash_$(FLASH_NAME) : all
flash : flash_$(FLASH_NAME) all
xaizek ★★★★★
()
Ответ на: комментарий от xaizek

стоп стоп... вот уж дудки :о) (хф в бой идут одни старики)

никаких all для дудки... у нее свои задачи, у сборки свои

sunjob ★★★★
() автор топика
Ответ на: комментарий от sunjob

цель по умолчанию all, т.е. сборка проекта в контексте данного топика, дефолт- имеется в виду - дефолт для дудки

никаких all для дудки… у нее свои задачи, у сборки свои

АААААААААААААААААА!!!!!!!

Oberstserj ★★
()
Ответ на: великолепная аватарка от sunjob

ну и?

Пойду себе жаренной картошечки сварю лучше :)

что не сраслось

Дудка, которая не дудка, но у них обеих all. Но при этом 100500 мейкфайлов там, где можно вообще ничего не делать, потому что дефолт - тараканы.

Oberstserj ★★
()
Ответ на: комментарий от Oberstserj

хороший мальчик

ТЫЦЬ

ответь для себя, что делает makefile, для чего он используется?! там может еще и валериЯнки накапать придется :о)

sunjob ★★★★
() автор топика
Ответ на: хороший мальчик от sunjob

Я в курсе. А еще я в курсе, что можно и не через макефиле. Причем проще и универсальнее. Но картошечка вкуснее, поэтому от валерьянки откажусь :)

Oberstserj ★★
()
Ответ на: комментарий от xaizek

Если надо сначала all, а потом специфичную,

надо, как обычно

all - это сборка проекта

flash_xxx - это прошивка контроллера, какое она (цель) имеет отношение к all? вот именно, одно не подразумевает другого, т.е. это разные цели

для проекта дефолтная цель all - сборка проекта

для прошивки нужно сделать так, что-бы flash вызывала одну из «дефолтных» настроет «дудки», а настройку надо поместить в начало makefile (так-то идея с секцией вполне)

все это, естественно, в одном makefile

надеюсь, так понятнее? :о)

sunjob ★★★★
() автор топика
Ответ на: комментарий от sunjob

так понятнее?

Понятно. Но это чесать правой рукой левое ухо. Причем предварительно обмотав рукой шею в пару оборотов.

Oberstserj ★★
()
Ответ на: комментарий от Oberstserj

ну во первых, это я не вам писал :о)))

а во вторых ... бяда! прям бяда! это что у вас там за сорт кортофана? поделитесь?

если по делу все, на этом и закончим

спасибо

p.s. немного дополнил описание, да, действительно, не совсем понятно обьяснил, надеюсь, теперь все нормально?!

sunjob ★★★★
() автор топика
Последнее исправление: sunjob (всего исправлений: 1)
Ответ на: комментарий от sunjob

flash_xxx - это прошивка контроллера, какое она (цель) имеет отношение к all?

Прошиваются же результаты сборки.

так понятнее?

Не сильно. Я не понимаю, как рекурсивный вызов этого достигает. И что вообще надо сделать, пройтись по файлу сначала но с новыми настройками? Может нужно сделать макрос/функцию (define bla + $(call bla)) и раскрыть его после установки переменных? Пример с echo bla вместо реальных манипуляций мог бы прояснить ситуацию.

xaizek ★★★★★
()
Ответ на: комментарий от xaizek

Прошиваются же результаты сборки.

ну и чЁ? народ на работу ходит кажный день, а калбасу покупает раз в полгода :о)
надеюсь так понятнее... ну или зайдем с дуругой стороны - девочки в магазине много чего меряют, но не кажную шмотьку покупают... :о)

далее...

как рекурсивный вызов этого достигает.

оченьно просто, make получает уже не общую команду flash - а уже утонченную flash_usbasp

ну... или придется поверить, что это работает :о)

...

как еще по дуругому обьяснить? не хотел вдаваться в подробности (кому нахрен нужен чужой геморой?!)

в кратце, есть проект, он таскается/передается между «несколькими рабочими точками»,льдьми, в коллективе и... соотв. рабочие места везде разные, и разные раб.среды, свистки-пуканы итд

на одном месте asp, на другом isp, на третьем мерседентр ...

понятно, сделаны соотв. принудительные цели/скрипты для прошивки

make_xxx

а так, все отлично... принесли проект на туда, где «один» свисток, надо всего-то выбрать свисток по умолчанию, одна строка в майкфайле и ... работай на здроровье... перенесли проект на другое раб. место, так-же одна строка и работаем дальше...

все... :о)

п.с. понятное дело, коммунистические советы, типа "... до основанЯ и затем..." не катят, тем более, что изначально уже есть рабочий вариант, хотелось бы избаваться от рекурсии... и всего-та :о)

спасибо за помочь

sunjob ★★★★
() автор топика
Последнее исправление: sunjob (всего исправлений: 2)
Ответ на: комментарий от sunjob

Так а чем тогда flash : flash_$(FLASH_NAME) не замена рекурсии? Это можно сказать перенаправление на нужную цель в зависимости от всё той же одной строки.

xaizek ★★★★★
()
Ответ на: комментарий от xaizek

Сработала!!!

да там в глаз залетела ваша

$(.DEFAULT_GOAL)
с толку сбила глобальная дефолтная цель ... :о) доберусь до железки, гляну

спасибо

p.s. спасибо тебе, дружище!!! сработала :о)

sunjob ★★★★
() автор топика
Последнее исправление: sunjob (всего исправлений: 1)
Ответ на: комментарий от xaizek

!!! UPDATE !!! решение найдено

FLASH_NAME   ?= name1
FLASH_NAME   ?= name2
FLASH_NAME   ?= name3

...

flash_name1  : FLASH_NAME =
flash_name1  : ARG = ...

flash_name2  : FLASH_NAME =
flash_name2  : ARG = ...

flash_name3  : FLASH_NAME =
flash_name3  : ARG = ...

flash : flash_$(FLASH_NAME)
    $(FLASH_CMD)

sunjob ★★★★
() автор топика
Ответ на: комментарий от Oberstserj

определенно автопортет!!!

сработало то, что тебе предлагали

естественно, сработало, потому как по делу подсказали... :о)

sunjob ★★★★
() автор топика
Ответ на: комментарий от xaizek

упс, пацаны, косячЁк вышел, хреново протестировал :о)

не получилось выкрутиться «переопределением цели», потому как у меня используется «хитрое использование цели»

-U flash:w:$(OUTDIR)/$<
преобразуется в хреньку
-U flash:w:out/main.hex 
-->
-U flash:w:out/flash_usbasp
бум пилить дальше :о) вообщем-то можно, конечно, выкрутиться :о)
пришлось красивую реализацию цели $< заменить явной елью $(TARGET).hex
-U flash:w:$(OUTDIR)/$<
-U flash:w:$(OUTDIR)/$(TARGET).hex

sunjob ★★★★
() автор топика
Последнее исправление: sunjob (всего исправлений: 2)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.