waf从执行任务中创建任务

时间:2014-04-13 13:11:32

标签: task schedule waf

如何从另一个调用不同任务类的任务中启动任务。

@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")

所以代码不会崩溃,但是当我使用./waf --zones=task_gen,tasks时,我得到的只是gtester的一项任务,但unites没有。

这就是它在实践中的使用方式:

test = bld.program(
    features = ['c', 'glib2', 'gtester'],
            ...,
            ...
            )

深入研究了the waf book和API文档,但两者都没有产生任何有用的信息。

那么如何从已经运行的任务中安排任务(或任意数量的任务)?

1 个答案:

答案 0 :(得分:2)

解决方案是使用

 tsk = self.generator.create_task('unites')
 bld.producer.outstanding.insert(0, tsk)
 bld.producer.total += 1

./waf --zones=tasks显示其他任务。


./waf/playground/dynamic_headers/wscript

下waf svn repo的启发

值得一提的是:处理[M/N]时,每行前面的gtester任务计数会突然跳升,这是因为总计数在结束时更新了Task所以waf在那之前无法知道总数。