告诉妻子在开始下一个任务之前等待任务完成
Tell waf to wait for task to finish before staring next task
我在 waf
中有两个任务,它们需要以正确的顺序执行,第二个任务必须等到第一个任务完成。
为了表明它的行为符合我的预期,我在任务中等待,在第一个任务 (t_1
) 4 秒和第二个任务 (t_2
) 1 秒。第二个任务先完成。这可以看出,因为我等待后创建的文件夹具有时间戳 t_2 < t_1
.
在一个问题中:
如何告诉 waf,t_2
在 t_1
成功完成后执行?
MWE: wscript
from waflib import Context, Options
from waflib import Task, TaskGen
from waflib.Tools.compiler_c import c_compiler
def options(opt):
opt.load('compiler_c')
def configure(cnf):
cnf.load('compiler_c')
def build(bld):
bld.program(features=['t_1', 't_2'], source='main.c', target='abc')
class t_1(Task.Task):
always_run = True
run_str = 'echo start t_1 && python -c "import time; time.sleep(4)" && echo end t_1 && mkdir t_1'
color = 'RED'
@TaskGen.feature('t_1')
@TaskGen.after('apply_link')
@TaskGen.before('t_2')
def add_t_1_task(self):
self.create_task('t_1')
class t_2(Task.Task):
always_run = True
run_str = 'echo start t_2 && python -c "import time; time.sleep(1)" && echo end t_2 && mkdir t_2'
color = 'RED'
@TaskGen.feature('t_2')
@TaskGen.after('apply_link', 't_1')
def add_t_2_task(self):
self.create_task('t_2')
您必须在任务的 after
属性中指定必须在 运行 之前 (在该示例中 t_1
)的任务这应该“等待”让另一个任务完成(在那个例子中(t_2
)。
它是这样指定的:after = ['t_1']
可在此处的 build order constraints in the waf book 部分找到相关文档。
当前waf书籍(waf 2.0)中解释generic task generator is §9.3的文档,特别是§9.3.4解释了任务生成器的执行顺序。
完整的 MWE 示例如下所示:
from waflib import Context, Options
from waflib import Task, TaskGen
from waflib.Tools.compiler_c import c_compiler
def options(opt):
opt.load('compiler_c')
def configure(cnf):
cnf.load('compiler_c')
def build(bld):
bld.program(features=['t_1', 't_2'], source='main.c', target='abc')
class t_1(Task.Task):
always_run = True
run_str = 'date && echo 1 && echo start t_1 && python -c "import time; time.sleep(4)" && echo end t_1 && mkdir t_1 && date && echo 1'
color = 'RED'
@TaskGen.feature('t_1')
@TaskGen.after('apply_link')
@TaskGen.before('t_2')
def add_t_1_task(self):
self.create_task('t_1')
class t_2(Task.Task):
always_run = True
after = ['t_1'] # <---------------------------- **The problems solution**
run_str = 'date && echo 1 && echo start t_2 && python -c "import time; time.sleep(1)" && echo end t_2 && mkdir t_2 && date && echo 2'
color = 'RED'
@TaskGen.feature('t_2')
@TaskGen.after('apply_link', 't_1')
def add_t_2_task(self):
self.create_task('t_2')
我在 waf
中有两个任务,它们需要以正确的顺序执行,第二个任务必须等到第一个任务完成。
为了表明它的行为符合我的预期,我在任务中等待,在第一个任务 (t_1
) 4 秒和第二个任务 (t_2
) 1 秒。第二个任务先完成。这可以看出,因为我等待后创建的文件夹具有时间戳 t_2 < t_1
.
在一个问题中:
如何告诉 waf,t_2
在 t_1
成功完成后执行?
MWE: wscript
from waflib import Context, Options from waflib import Task, TaskGen from waflib.Tools.compiler_c import c_compiler def options(opt): opt.load('compiler_c') def configure(cnf): cnf.load('compiler_c') def build(bld): bld.program(features=['t_1', 't_2'], source='main.c', target='abc') class t_1(Task.Task): always_run = True run_str = 'echo start t_1 && python -c "import time; time.sleep(4)" && echo end t_1 && mkdir t_1' color = 'RED' @TaskGen.feature('t_1') @TaskGen.after('apply_link') @TaskGen.before('t_2') def add_t_1_task(self): self.create_task('t_1') class t_2(Task.Task): always_run = True run_str = 'echo start t_2 && python -c "import time; time.sleep(1)" && echo end t_2 && mkdir t_2' color = 'RED' @TaskGen.feature('t_2') @TaskGen.after('apply_link', 't_1') def add_t_2_task(self): self.create_task('t_2')
您必须在任务的 after
属性中指定必须在 运行 之前 (在该示例中 t_1
)的任务这应该“等待”让另一个任务完成(在那个例子中(t_2
)。
它是这样指定的:after = ['t_1']
可在此处的 build order constraints in the waf book 部分找到相关文档。
当前waf书籍(waf 2.0)中解释generic task generator is §9.3的文档,特别是§9.3.4解释了任务生成器的执行顺序。
完整的 MWE 示例如下所示:
from waflib import Context, Options
from waflib import Task, TaskGen
from waflib.Tools.compiler_c import c_compiler
def options(opt):
opt.load('compiler_c')
def configure(cnf):
cnf.load('compiler_c')
def build(bld):
bld.program(features=['t_1', 't_2'], source='main.c', target='abc')
class t_1(Task.Task):
always_run = True
run_str = 'date && echo 1 && echo start t_1 && python -c "import time; time.sleep(4)" && echo end t_1 && mkdir t_1 && date && echo 1'
color = 'RED'
@TaskGen.feature('t_1')
@TaskGen.after('apply_link')
@TaskGen.before('t_2')
def add_t_1_task(self):
self.create_task('t_1')
class t_2(Task.Task):
always_run = True
after = ['t_1'] # <---------------------------- **The problems solution**
run_str = 'date && echo 1 && echo start t_2 && python -c "import time; time.sleep(1)" && echo end t_2 && mkdir t_2 && date && echo 2'
color = 'RED'
@TaskGen.feature('t_2')
@TaskGen.after('apply_link', 't_1')
def add_t_2_task(self):
self.create_task('t_2')