LINUX.ORG.RU

makefile и озвучка, в зов-ти от результата

 , ,


1

2

добрый день!

нужно озвучить работу makefile, в зов-ти от успеха/ошибки
makefile - в общем-то стандартный (не без надстроек :о)
рассмотрим, самый простой случай

make all
makefile
all:   build
build: elf hex epp lss sym

elf: 		$(TARGET).elf
hex: 		$(TARGET).hex
eep: 		$(TARGET).eep
lss: 		$(TARGET).lss
sym: 		$(TARGET).sym
нужно, что-бы при успехе/ошибке, !!! внутри makefile !!! вызывались команды, соответственно:
${BEEP_OK}  # OK
${BEEP_ERR} # ERR  
+
slackware 12.2/14.2 x32/64
avr-gcc/xc8
bash

спасибо

p.s. все с набегу пока мысля не влетела в голову...

уточняю - надо все упаковать в makefile

★★

EXIT STATUS GNU make exits with a status of zero if all makefiles were successfully parsed and no targets that were built failed. A status of one will be returned if the -q flag was used and make determines that a target needs to be rebuilt. A status of two will be returned if any errors were encountered.

man make

anonymous ()
#!/bin/sh

SUCCESS='. . - | . . . | . - - . | . | . . . .'
FAILURE='- - - | - - - - | . . | - . . . | - . - | . -'
BEEP_PATH='/usr/share/sounds/freedesktop/stereo' 
BEEP_SUCCESS="$BEEP_PATH/bell.oga" 
BEEP_FAILURE="$BEEP_PATH/bell.oga" 

if [ "$?" -eq 0 ]; then 
  MESSAGE=$SUCCESS
else
  MESSAGE=$FAILURE
fi

for BEEP in $MESSAGE; do
  case $BEEP in '.') paplay "$BEEP_SUCCESS";;
                '-') paplay "$BEEP_FAILURE";;
                '|') sleep 0.1
  esac
done

Звуки лучше поменяй на более подходящие, из этих тяжело Морзе слушать.

А можешь просто

make ... && paplay '/usr/share/sounds/freedesktop/stereo/complete.oga' || paplay '/usr/share/sounds/freedesktop/stereo/dialog-error.oga'

но это, конечно, слишком скучно.

Siborgium ★★★ ()

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

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

примерно так и думал :о) ... но «непересекающихся» целей дофига, каждую переопределять... хотелось бы как в шелл-скрипте, сделать в одном месте :о)

с другой стороны, если никак по другому... то, значит, надо так надо...

и... это рекурсия?

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

В конце интересующей цепочки вставь в сакцесс

целей-то дофига

elf: 		$(TARGET).elf
hex: 		$(TARGET).hex
eep: 		$(TARGET).eep
lss: 		$(TARGET).lss
sym: 		$(TARGET).sym
и они могут вызываться как по отдельности так и целью all, в итоге будет еще та свистопляска... :о) или, возможно, я ошибаюсь... надо попробовать, пока в таком подходе мне не нравиться, что все цели надо дорабатывать...

хотелось-бы в одном месте это сделать :о)

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

Извращенец. Реализовать алгоритм, обрабатывающий результат работы самого алгоритма. Разве что написать еще один алгоритм.

svetomuzyka:
	make $(TARGET) && aplay $den_pobedy || aplay $pohoronnyj_marsh
$ make TARGET=all svetomuzyka # хачу фсьо

$ make TARGET=elf svetomuzyka # хачу только эльфу
anonymous ()
Ответ на: комментарий от anonymous

меня смущает цель светомузыка, или теперь менять еще и команды сборки?!

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

make && ${BEEP_OK} || ${BEEP_ERR}

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

Я не совсем понял задачу: есть несколько целей, вызываться они могут по отдельности, и в любом случае, после отработки мейка надо сдалать бип-удачный или бип-неудачный? верно?

В таком случае, если необходимо все сделать именно в этом мейкфайле, то без доработки каждой цели не обойтись

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

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

а бикать надо только один раз в конце или можно после каждой подцели?

если один раз, то как ты определишь последняя ли это цель?

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

или можно после каждой подцели?

да я с ума сойду... :о)

как ты определишь последняя ли это цель?

а то бы не было вопросов :о)

p.s. да, задачка еще та... :о)

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

да, задачка еще та…

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

если не секрет, а почему необходимо оставаться именно в рамках мейкфайла?

я вижу только так: переобозывать все настоящие цели, например elf -> elf_, а в настоящих обработчик писать явным видом, вызывая переименованную и анализируя результат в конце не забыв бикнуть. Таким образом ты явно отработаешь все возможные варианты

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

коротко это можно описать так (все просто)

1. запускается любая цель
2. в зов-ти от результата - озвучка (не важно какая)
3. доработка мейкфайла желательна т.о., что-бы запуск озвучки был в одном месте и цели не пришлось бы особо рихтовать (иначе теряется смысл... т.к. такой мейк становится трудно-сопровождаемым :о)

ну вот... в 3х словах

p.s. ну что-ж, бывает и так, что задача не выполнима (в разумных пределах) ... не беда :о)

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

почему необходимо оставаться именно в рамках мейкфайла?

мультизадачность/универсальность/переносимость/ итд

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

во вторых - желательно сделать что-бы в разных IDE работа была идентична, без доп. пендилей и настроек (по возможности)

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

ну а непроканает данная идея, есть старый добрый рабочий вариант (не оч. удобный, но рабочий)

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

а у миня луче:

$ cat озвучить
#!/usr/bin/bash
"$@" \
    && (play -qn synth 3 pluck C4 pluck E4 pluck G4 pluck C5 &) \
    || (play -qn synth 3 pluck C7 pluck C4 pluck 'C#4' pluck F4 &)

$ ./озвучить false
$ ./озвучить true

:) заодно можно и другие проги озвучивать

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

да что же ты не угомонишься?!

дак и здорово, что у ВАС лучше!!! ура!!!

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

заодно можно и другие проги озвучивать

пацаны-то и не в курсах...

sunjob ★★ ()
Последнее исправление: sunjob (всего исправлений: 2)
Ответ на: да что же ты не угомонишься?! от sunjob

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

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

СПАСИБО СПАСИБО СПАСИБО

только вот ... гм... где я просил дуделку-то, а?! :о)

специально указал

${BEEP_OK}  # OK
${BEEP_ERR} # ERR  
тем самым намекнув, что команды озвучки нас не интересуют... уже же написал, что давно «озвучка работает», надо только механизм вкорячить в мейкфайл :о)

и сам... не перегибай в инстументариях... а то из полезного инструмента выйдет ... ну сам понял :о)

и вам удачи

p.s. смайлики видишь?! а они есть!!!

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