Выполнение команд avrdude в качестве целей SCons - PullRequest
2 голосов
/ 04 ноября 2010

Я хочу иметь возможность вызывать avrdude из SCons в качестве цели. Например, для запуска scons erase-device должна быть выполнена команда avrdude.

Я пытаюсь сделать это, создав объекты Builder, которые вызывают avrdude, и добавив их в среду.

# a string forming a base avrdude command that we can just add on to in the targets
avrdude_base = 'avrdude -p ' + env['MCU'] + ' -c ' + icspdevice

# target to erase everything--flash, EEPROM, and lock bits (but not fuse bits)
erase_dev = Builder(action = avrdude_base + ' -e')
env.Append(BUILDERS = {'EraseDevice' : erase_dev})
ed = env.EraseDevice()
eda = env.Alias('erase-device', ed)
env.AlwaysBuild(eda)

# target to write the AVR fuses and lock bits
write_fuse = Builder(action = avrdude_base + ' -U lfuse:w:' + lfuse + ':m -U hfuse:w:' + hfuse + 
                    ':m -U efuse:w:' + efuse + ':m -U lock:w:' + lockbits + ':m')
env.Append(BUILDERS = {'WriteFuses' : write_fuse})
wf = env.WriteFuses()
wfa = env.Alias('write-fuses', wf)
env.AlwaysBuild(wfa)

С этим кодом scons всегда выходит, говоря, что делать нечего. Я думаю, что это потому, что, как показано на рисунке, я не даю исходные файлы этим строителям (env.EraseDevice() и env.WriteFuses()); поэтому SCons предполагает, что их не нужно вызывать.

Так вот что я попробовал дальше. Я просто передал существующее имя файла этим двум строителям, чтобы сделать счастливых булочек, хотя это и не нужно. Теперь проблема в том, что независимо от того, хочу ли я запустить scons write-fuses, scons erase-flash или другие цели, использующие avrdude, scons действует так, как будто я пытаюсь написать предохранители. Если, например, имя файла, которое я передал, было foo.hex , тогда scons теперь думает, что он должен запускать цель write-fuses каждый раз, потому что scons думает, что avrdude должен был сгенерировать выходной файл называется foo , но этот файл никогда не создается.

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

Как я могу создавать цели в SCons, которые не требуют каких-либо источников для ввода и которые не генерируют никакого вывода?

Спасибо!

1 Ответ

1 голос
/ 04 ноября 2010

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

Один простой обходной путь - дать фиктивные цели для команд erase-device и write-fuse.Эти целевые файлы никогда не будут сгенерированы, поэтому, если scons определит, что эта цель должна быть построена (потому что она была указана в командной строке или зависит от чего-то в командной строке), scons всегда будет запускать соответствующую команду avrdude ...,

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

ed = env.Command('erase.dummy', [], avrdude_base + ' -e')
ed = env.EraseDevice()
env.AlwaysBuild(ed)
env.Alias('erase-device', ed)
...

В качестве примечания, scons --tree=all - хороший способ увидеть вычисленное дерево зависимостей scons.Если вы озадачены тем, что делают scons, просмотр дерева зависимостей может помочь в отладке, когда ваша модель отличается от scons.

...