[Scons-users] first builder / download

Gary Oberbrunner garyo at oberbrunner.com
Tue Aug 14 17:41:05 EDT 2012


On Tue, Aug 14, 2012 at 5:32 PM, Philipp Kraus
<philipp.kraus at flashpixx.de> wrote:

> On 2012-08-14 00:16:04 +0200, Kraus Philipp said:

>

>> Hi,

>>

>> I try to create my first own builder for downloading a file. I read the

>> documentation, but I don't find any good explain to do this.

>>

>> This is my code

>>

>> def url_downloadfile(target, source, env) :

>> target = open( target, "wb" )

>> f = urllib2.urlopen(source)

>> target.write(f.read())

>> target.close()

>> f.close()

>> return target, source

>>

>>

>> def url_emitter(target, source, env) :

>> if (target[0] == source[0]) :

>> target[0] = str(source[0]).split("/")[-1]

>> return target, source

>>

>>

>>

>> dw = Builder(action = url_downloadfile, emitter = url_emitter,

>> single_source = True )

>> env = Environment(BUILDERS = {"Downloader" : dw})

>>

>> env.Downloader( "http://myurl/myfile.tar.gz" )

>>

>>

>>

>> I know that I can modify the source / target list with the emitter, so I

>> think it is correct

>> because the source list (here only on element) is the url, but the target

>> list is here the url

>> also, so I must modify the list, so that the last part of my url should be

>> the target (or a target

>> is setup manually, so I use this)

>>

>> But now I get scons: *** [myfile.tar.gz] Source <url> not found, needed by

>> target `myfile.tar.gz'.

>>

>> This is imho correct, because the url is not a file, so Scons does not

>> know anything about the url.

>> How can I change this? I think, my input of the command is only a string

>> object and not a FS Entry

>> object

>

>

> I have modified my source to this:

>

> def url_downloadfile(target, source, env) :

> target = open( str(target), "wb" )

> f = urllib2.urlopen( str(source) )

> target.write(f.read())

> target.close()

> f.close()

> return None

>

>

> def url_emitter(target, source, env) :

> if not(isinstance(source[0], SCons.Node.Python.Value)) :

> raise SCons.Errors.UserError("URL must be a value type, not '%s'" %

> source[0].__class__)

>

> if target[0] == source[0] :

> target[0] = File( str(source[0]).split("/")[-1] )

>

> return target, source

>

> env = Environment( BUILDERS = { "Download" : Builder(action =

> url_downloadfile, emitter = url_emitter, prefix = "http", single_source =

> True, target_factory=File, source_factory=Value ) } )

>

> If I run it, I get the message: scons: *** Do not know how to create a

> target from source `http:/url/file.tar.gz'

> Why I get this message? The emitter extracts the file of the url and change

> the target


Using Value nodes is definitely the way to go. You don't say how
you're calling it: are you saying something like this:
tgt = Download(Value('http://url/file.tar.gz'))

?
--
Gary


More information about the Scons-users mailing list