[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