3

SCons から avrdude をターゲットに呼び出せるようにしたいです。たとえば、runningscons erase-deviceはそのために avrdude コマンドを実行する必要があります。

avrdude を呼び出す Builder オブジェクトを作成し、それらを環境に追加することで、これを実行しようとしています。

# 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 は呼び出す必要がないと見なします。

ということで次にやってみました。私は既存のファイル名を 2 つの Builder に渡して、scons を満足させましたが、それは必要ありませんでした。ここでの問題は、avrdude を使用するscons write-fuses、 、またはその他のターゲットを実行するかどうかに関係なく、scons がヒューズを書き込もうとしているかのように動作することです。scons erase-flashたとえば、私が渡したファイル名がfoo.hexの場合、scons は「avrdude」がfoowrite-fusesという出力ファイルを生成するはずだったと考えているため、毎回ターゲットを実行する必要があると考えていますが、そのファイルは生成されることはありません。

また、これを行うということは、デバイスを消去したりヒューズ ビットをプログラムしたりする前に、16 進ファイルをビルドする必要があることを意味しますが、これは通常は必要ありません。

入力用のソースを必要とせず、出力を生成しないターゲットを SCons で作成するにはどうすればよいですか?

ありがとう!

4

1 に答える 1

1

出力に変換するソースがないため、scons は何も実行していないと言うのは正しい軌道に乗っていますが、重要なのは、scons がターゲットを生成したいと考えており、ビルドするものがないと考えていたことです。 .

簡単な回避策の 1 つは、コマンドerase-devicewrite-fuseコマンドにダミー ターゲットを指定することです。これらのターゲット ファイルは生成されないため、このターゲットをビルドする必要があると scons が判断した場合 (コマンド ラインで指定されたか、コマンド ラインの何かに依存しているために)、scons は常に適切なavrdude ...コマンドを実行します。

ビルダーを使用すると、必要のない複雑さが増していると思います。ビルダーは、新しいソースからターゲットへのマッピングを作成するのに適していますが、実際にはファイルを含める必要はありません。

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

補足として、scons --tree=allscons の計算された依存関係ツリーを表示するのは良い方法です。scons が何をしているのかわからない場合は、依存関係ツリーを表示すると、モデルが scons から分岐している場所をデバッグするのに役立ちます。

于 2010-11-04T06:42:05.800 に答える