3
# WARNING! Do not edit! http://waf.googlecode.com/svn/docs/wafbook/single.html#_obtaining_the_waf_file
6
from waflib import TaskGen,Node,Task,Utils,Build,Errors
7
from waflib.TaskGen import feature,after_method,before_method
8
from waflib.Logs import debug
9
def copy_attrs(orig,dest,names,only_if_set=False):
10
for a in Utils.to_list(names):
12
if u or not only_if_set:
16
infile=tsk.inputs[0].abspath()
17
outfile=tsk.outputs[0].abspath()
19
shutil.copy2(infile,outfile)
20
except(OSError,IOError):
23
if tsk.chmod:os.chmod(outfile,tsk.chmod)
25
def action_process_file_func(tsk):
26
if not tsk.fun:raise Errors.WafError('task must have a function attached to it for copy_func to work!')
29
if not self.fun:raise Errors.WafError('cmdobj needs a function!')
33
self.tasks.append(tsk)
34
tsk.install_path=self.install_path
36
Utils.def_attrs(self,fun=copy_func)
37
self.default_install_path=0
38
lst=self.to_list(self.source)
39
self.meths.remove('process_source')
41
node=self.path.find_resource(filename)
42
if not node:raise Errors.WafError('cannot find input file %s for processing'%filename)
44
if not target or len(lst)>1:target=node.name
45
newnode=self.path.find_or_declare(target)
46
tsk=self.create_task('copy',node,newnode)
48
tsk.chmod=getattr(self,'chmod',Utils.O644)
51
raise Errors.WafError('task without an environment')
53
m4_re=re.compile('@(\w+)@',re.M)
54
code=tsk.inputs[0].read()
55
code=code.replace('%','%%')
56
s=m4_re.sub(r'%(\1)s',code)
58
di=getattr(tsk,'dict',{})or getattr(tsk.generator,'dict',{})
60
names=m4_re.findall(code)
62
di[i]=env.get_flat(i)or env.get_flat(i.upper())
63
tsk.outputs[0].write(s%di)
64
def apply_subst(self):
65
Utils.def_attrs(self,fun=subst_func)
66
lst=self.to_list(self.source)
67
self.meths.remove('process_source')
68
self.dict=getattr(self,'dict',{})
70
node=self.path.find_resource(filename)
71
if not node:raise Errors.WafError('cannot find input file %s for processing'%filename)
73
newnode=self.path.find_or_declare(self.target)
75
newnode=node.change_ext('')
77
self.dict=self.dict.get_merged_dict()
78
except AttributeError:
80
if self.dict and not self.env['DICT_HASH']:
81
self.env=self.env.derive()
82
keys=list(self.dict.keys())
84
lst=[self.dict[x]for x in keys]
85
self.env['DICT_HASH']=str(Utils.h_list(lst))
86
tsk=self.create_task('copy',node,newnode)
89
tsk.dep_vars=['DICT_HASH']
90
tsk.chmod=getattr(self,'chmod',Utils.O644)
93
raise Errors.WafError('task without an environment')
94
class cmd_arg(object):
95
def __init__(self,name,template='%s'):
97
self.template=template
99
class input_file(cmd_arg):
100
def find_node(self,base_path):
101
assert isinstance(base_path,Node.Node)
102
self.node=base_path.find_resource(self.name)
103
if self.node is None:
104
raise Errors.WafError("Input file %s not found in "%(self.name,base_path))
105
def get_path(self,env,absolute):
107
return self.template%self.node.abspath()
109
return self.template%self.node.srcpath()
110
class output_file(cmd_arg):
111
def find_node(self,base_path):
112
assert isinstance(base_path,Node.Node)
113
self.node=base_path.find_or_declare(self.name)
114
if self.node is None:
115
raise Errors.WafError("Output file %s not found in "%(self.name,base_path))
116
def get_path(self,env,absolute):
118
return self.template%self.node.abspath()
120
return self.template%self.node.bldpath()
121
class cmd_dir_arg(cmd_arg):
122
def find_node(self,base_path):
123
assert isinstance(base_path,Node.Node)
124
self.node=base_path.find_dir(self.name)
125
if self.node is None:
126
raise Errors.WafError("Directory %s not found in "%(self.name,base_path))
127
class input_dir(cmd_dir_arg):
128
def get_path(self,dummy_env,dummy_absolute):
129
return self.template%self.node.abspath()
130
class output_dir(cmd_dir_arg):
131
def get_path(self,env,dummy_absolute):
132
return self.template%self.node.abspath()
133
class command_output(Task.Task):
135
def __init__(self,env,command,command_node,command_args,stdin,stdout,cwd,os_env,stderr):
136
Task.Task.__init__(self,env=env)
137
assert isinstance(command,(str,Node.Node))
139
self.command_args=command_args
145
if command_node is not None:self.dep_nodes=[command_node]
149
def input_path(node,template):
151
return template%node.bldpath()
153
return template%node.abspath()
154
def output_path(node,template):
156
if task.cwd is None:fun=node.bldpath
157
return template%fun()
158
if isinstance(task.command,Node.Node):
159
argv=[input_path(task.command,'%s')]
162
for arg in task.command_args:
163
if isinstance(arg,str):
166
assert isinstance(arg,cmd_arg)
167
argv.append(arg.get_path(task.env,(task.cwd is not None)))
169
stdin=open(input_path(task.stdin,'%s'))
173
stdout=open(output_path(task.stdout,'%s'),"w")
177
stderr=open(output_path(task.stderr,'%s'),"w")
181
cwd=('None (actually %r)'%os.getcwd())
184
debug("command-output: cwd=%s, stdin=%r, stdout=%r, argv=%r"%(cwd,stdin,stdout,argv))
185
if task.os_env is None:
189
command=Utils.subprocess.Popen(argv,stdin=stdin,stdout=stdout,stderr=stderr,cwd=task.cwd,env=os_env)
190
return command.wait()
191
def init_cmd_output(self):
192
Utils.def_attrs(self,stdin=None,stdout=None,stderr=None,command=None,command_is_external=False,argv=[],dependencies=[],dep_vars=[],hidden_inputs=[],hidden_outputs=[],cwd=None,os_env=None)
193
def apply_cmd_output(self):
194
if self.command is None:
195
raise Errors.WafError("command-output missing command")
196
if self.command_is_external:
200
cmd_node=self.path.find_resource(self.command)
201
assert cmd_node is not None,('''Could not find command '%s' in source tree.
202
Hint: if this is an external command,
203
use command_is_external=True''')%(self.command,)
208
assert isinstance(cwd,CmdDirArg)
209
self.cwd.find_node(self.path)
213
for arg in self.argv:
214
if isinstance(arg,cmd_arg):
215
arg.find_node(self.path)
216
if isinstance(arg,input_file):
217
inputs.append(arg.node)
218
if isinstance(arg,output_file):
219
outputs.append(arg.node)
220
if self.stdout is None:
223
assert isinstance(self.stdout,str)
224
stdout=self.path.find_or_declare(self.stdout)
226
raise Errors.WafError("File %s not found"%(self.stdout,))
227
outputs.append(stdout)
228
if self.stderr is None:
231
assert isinstance(self.stderr,str)
232
stderr=self.path.find_or_declare(self.stderr)
234
raise Errors.WafError("File %s not found"%(self.stderr,))
235
outputs.append(stderr)
236
if self.stdin is None:
239
assert isinstance(self.stdin,str)
240
stdin=self.path.find_resource(self.stdin)
242
raise Errors.WafError("File %s not found"%(self.stdin,))
244
for hidden_input in self.to_list(self.hidden_inputs):
245
node=self.path.find_resource(hidden_input)
247
raise Errors.WafError("File %s not found in dir %s"%(hidden_input,self.path))
249
for hidden_output in self.to_list(self.hidden_outputs):
250
node=self.path.find_or_declare(hidden_output)
252
raise Errors.WafError("File %s not found in dir %s"%(hidden_output,self.path))
254
if not(inputs or getattr(self,'no_inputs',None)):
255
raise Errors.WafError('command-output objects must have at least one input file or give self.no_inputs')
256
if not(outputs or getattr(self,'no_outputs',None)):
257
raise Errors.WafError('command-output objects must have at least one output file or give self.no_outputs')
258
cwd=self.bld.variant_dir
259
task=command_output(self.env,cmd,cmd_node,self.argv,stdin,stdout,cwd,self.os_env,stderr)
261
copy_attrs(self,task,'before after ext_in ext_out',only_if_set=True)
262
self.tasks.append(task)
265
task.dep_vars=self.to_list(self.dep_vars)
266
for dep in self.dependencies:
267
assert dep is not self
269
for dep_task in dep.tasks:
270
task.set_run_after(dep_task)
272
task.runnable_status=type(Task.TaskBase.run)(runnable_status,task,task.__class__)
273
task.post_run=type(Task.TaskBase.run)(post_run,task,task.__class__)
275
for x in self.outputs:
276
x.sig=Utils.h_file(x.abspath())
277
def runnable_status(self):
279
Task.task_factory('copy',vars=[],func=action_process_file_func)
281
feature('cmd')(apply_cmd)
282
feature('copy')(apply_copy)
283
before_method('process_source')(apply_copy)
284
feature('subst')(apply_subst)
285
before_method('process_source')(apply_subst)
286
feature('command-output')(init_cmd_output)
287
feature('command-output')(apply_cmd_output)
288
after_method('init_cmd_output')(apply_cmd_output)
b'\\ No newline at end of file'