Build 如何在构建的程序上声明测试脚本的WAF依赖关系?

Build 如何在构建的程序上声明测试脚本的WAF依赖关系?,build,dependencies,waf,Build,Dependencies,Waf,我正在努力找到定义测试脚本依赖关系的正确方法 在waf在同一构建过程中构建的二进制程序上。 下面是wscript的一个最小示例: 从waflib.Tools导入waf\u unit\u测试 def选项(opt): load(“编译器\uCXX python waf\uUnit\uTest”) def配置(cnf): 加载(“编译器\u cxx python waf\u单元\u测试”) def生成(bld): bld.add_post_fun(waf_单元测试摘要) bld.options.cle

我正在努力找到定义测试脚本依赖关系的正确方法 在waf在同一构建过程中构建的二进制程序上。 下面是
wscript
的一个最小示例:

从waflib.Tools导入waf\u unit\u测试
def选项(opt):
load(“编译器\uCXX python waf\uUnit\uTest”)
def配置(cnf):
加载(“编译器\u cxx python waf\u单元\u测试”)
def生成(bld):
bld.add_post_fun(waf_单元测试摘要)
bld.options.clear\u失败\u测试=真
bld(features=“cxx cxxprogram”,
target=“foo”,
source=“foo.cpp”)
tg=bld(features=“测试脚本”,
测试脚本\u source=“fooTest.py”,
测试脚本模板=“${PYTHON}${SRC}”)
tg.post()
tg.tasks[0].inputs.append(bld.path.find\u或\u declare(“foo”))
我想表示waf将构建程序
foo
。 然后,如果程序
foo
自上次构建运行以来发生了更改,则脚本
fooTest.py
将检查该程序的执行情况。上面的
wscript
可以工作:

Waf: Entering directory `/home/x/tmp/exe_depend/build'
[1/3] Compiling foo.cpp
[2/3] Linking build/foo
[3/3] Processing utest: fooTest.py build/foo
Waf: Leaving directory `/home/x/tmp/exe_depend/build'
execution summary 
  tests that pass 1/1 
    /home/x/tmp/exe_depend/fooTest.py 
  tests that fail 0/1 
'build' finished successfully (0.054s)

原则上,上面的
wscript
满足了我的需求,但它看起来像黑客一样丑陋,而且摆弄任务生成器
tg
似乎是错误的。你们有谁知道一个平滑的解决方案吗?

嗯,waf\u unit\u test.py中没有太多挂钩。最好的方法是通过制作自己的工具并在其中放入两行代码来扩展它。诸如此类:

#在文件my_unit_test.py中
def选项(opt):
opt.load(“waf_单元测试”)#我们扩展了它,不需要重新编码
def配置(配置):
conf.load(“waf_单元测试”)#我们扩展了它,不需要重新编码
@功能(“测试脚本”)
@在_方法(“make_expressed_test”)之后#我们在任务创建之后执行
def过程\测试\脚本\依赖项(自):
尝试:
自我测试\脚本\部门
除属性错误外:
返回
对于self.tasks中的任务:#可以有许多脚本
任务.设置_输入(self.to_节点(self.test_脚本_deps))
使用它:

def选项(opt):
load(“编译器\uCXX python我的\u单元\u测试”)
def配置(cnf):
load(“编译器\uCXX python我的\u单元\u测试”)
def生成(bld):
bld.add_post_fun(waf_单元测试摘要)
bld.options.clear\u失败\u测试=真
myprogram=“foo”
bld(
features=“cxx cxxprogram”,
target=myprogram,
source=“foo.cpp”,
)
bld(
features=“测试脚本”,
test\u scripts\u deps=myprogram,
测试脚本\u source=“fooTest.py”,
test_scripts_template=“${PYTHON}${SRC}”,
)
当然,您可以更进一步,重写一些适合您需要的内容:)