以下は、問題を説明する簡単なコード スニペットです。
def external_dependencies(url, destination):
# this never gets called
print 'whatever!'
# if isinstance(url, basestring):
# urllib.urlretrieve(url, destination)
# else:
# for a, b in map(None, url, destination):
# urllib.urlretrieve(a, b)
return None
env = Environment()
env.Command(['http://archive.apache.org/dist/xmlgraphics/batik/batik-1.6.zip',
'http://archive.apache.org/dist/commons/collections/binaries/commons-collections-3.0.tar.gz',
'http://archive.apache.org/dist/commons/logging/binaries/commons-logging-1.0.4.tar.gz'],
['./thirdparty/batik/batik-1.6.zip',
'./thirdparty/commons-collections-3.0.tar.gz',
'./thirdparty/commons-logging-1.0.4.tar.gz'],
external_dependencies)
これを実行しようとすると、次のエラーが発生します。
scons: *** [http:/archive.apache.org/dist/commons/collections/binaries/commons-
collections-3.0.tar.gz] Source `thirdparty/batik/batik-1.6.zip' not found,
needed by target `http:/archive.apache.org/dist/xmlgraphics/batik/batik-1.6.zip'.
(読みやすくするために改行が追加されています)
宛先はまだダウンロードされていないため、明らかに見つかりません。この操作の目的は、それをダウンロードすることです。
この動作をオーバーライドするには? ここで引数を検証することは、まったく逆効果です。
編集:
小さな更新: この方法で動作させることはできましたが、間違っている/ハックのように感じます:
def external_dependencies(dummy, url, destination):
if isinstance(url, basestring):
urllib.urlretrieve(url, destination)
else:
for a, b in map(None, url, destination):
urllib.urlretrieve(a, b)
return None
env = Environment()
env.AddMethod(external_dependencies, 'ExternalDependencies')
env.ExternalDependencies(
['http://archive.apache.org/dist/xmlgraphics/batik/batik-1.6.zip',
'http://archive.apache.org/dist/commons/collections/binaries/commons-collections-3.0.tar.gz',
'http://archive.apache.org/dist/commons/logging/binaries/commons-logging-1.0.4.tar.gz'],
['./thirdparty/batik/batik-1.6.zip',
'./thirdparty/commons-collections-3.0.tar.gz',
'./thirdparty/commons-logging-1.0.4.tar.gz'])
dummy
- の引数に注意してください。external_dependencies
何らかの理由で、SCons はこの関数を呼び出し、引数の数を最初の引数として渡します。ということで、使用目的が違ったようです。