waf crea una tarea desde dentro de la tarea en ejecución
Pregunta
¿Cómo puedo iniciar una tarea desde otra tarea llamando a una clase de tarea diferente?
@feature('unites')
@after_method('apply_link')
def make_test_unites(self):
if getattr(self, 'link_task', None):
tsk = self.create_task('unites', self.link_task.outputs)
tsk.a = []
@feature('gtester')
@after_method('apply_link')
def make_test_gtester(self):
if getattr(self, 'link_task', None):
tsk = self.create_task('gtester', self.link_task.outputs)
class unites (Task.Task):
def runnable_status(self):
### print("Never reached!")
...
def run(self):
...
### print("Never reached!")
...
class gtester (Task.Task):
def runnable_status(self):
//works as expected
def run(self):
...
bld = self.generator.bld
...
#utask = unites(env=bld.env)
utask = self.generator.create_task ('unites')
assert (utask)
utask.set_inputs(self.generator.link_task.outputs)
utask.a = ["some foo extra stuff"]
#bld.add_to_group (utask)
### print ("this is definitily reached")
Entonces el código no falla pero cuando lo uso ./waf --zones=task_gen,tasks
Todo lo que tengo es una tarea para gtester
, pero ninguno para unites
.
Así es como se utiliza en la práctica:
test = bld.program(
features = ['c', 'glib2', 'gtester'],
...,
...
)
He tenido una mirada profunda a el libro waf y los documentos API, pero ninguno produjo nada útil.
Entonces, ¿cómo puedo programar una tarea (o cualquier cantidad de tareas) a partir de una tarea que ya se está ejecutando?
Solución
La solución es usar
tsk = self.generator.create_task('unites')
bld.producer.outstanding.insert(0, tsk)
bld.producer.total += 1
y ./waf --zones=tasks
muestra las tareas adicionales.
inspirado en el repo de WAF SVN bajo ./waf/playground/dynamic_headers/wscript
Una cosa a mencionar: el recuento de tareas [M/N]
delante de cada línea saltará repentinamente cuando se procesa gtester
, que se debe al hecho de que el recuento total se actualiza al final de un Task
, por lo que WAF no puede saber sobre elNúmero total hasta entonces.