如何让waf在recurse操作完成后再继续执行主wscript?
解决WAF中bld.recurse同步执行子wscript的问题
WAF的bld.recurse()方法默认就是同步执行的:它会优先处理指定子文件夹中的wscript文件,直到子wscript内所有bld()调用及关联构建任务定义全部完成后,才会回到主wscript继续执行后续代码。
如果你的场景中出现子wscript未执行完主wscript就继续的情况,大概率是以下问题导致,对应解决方法如下:
1. 子wscript包含异步/延迟执行逻辑
如果子wscript中使用了bld.add_manual_task这类异步任务接口,或者自定义了延迟执行的逻辑,需要在子wscript末尾显式添加bld.wait(),强制等待所有未完成的任务结束:
# 子文件夹wscript示例 def build(bld): # 定义异步任务 bld.add_manual_task('async_task', func=some_async_func) # 强制等待所有任务完成 bld.wait()
2. 递归路径或脚本命名错误
确认bld.recurse()的参数是正确的子文件夹相对路径,且子文件夹内的构建脚本确实命名为wscript——WAF默认只会识别这个文件名的构建脚本。
3. 主wscript未正确声明依赖
如果主wscript后续的bld调用依赖子wscript生成的文件,必须通过use或source参数明确声明依赖关系,让WAF的依赖分析机制确保执行顺序:
# 主wscript示例 def build(bld): # 同步执行子文件夹wscript bld.recurse('sub_module') # 明确依赖子模块生成的库,确保子任务完成后再执行当前任务 bld( features='cxx cprogram', source='main.cpp', target='main_app', use='sub_module_lib' )
关键注意事项
- 不要在子wscript中使用
sys.exit()或其他终止进程的操作,否则会直接中断主wscript的执行。 - 若涉及配置阶段的递归,需在
configure函数中使用conf.recurse(),保证配置流程也是同步完成的。
内容的提问来源于stack exchange,提问作者Thundercleez
相关产品推荐
相关产品推荐

