尊敬的WAF构建系统专家:
假设您使用WAF构建系统来构建库fooLib
和程序fooProg
。然后,您希望通过检查fooProg
输出的Python脚本fooProgTest
检查程序fooProg
下面是fooLib
和fooProg
的一个最小示例:
$ cat fooLib/fooLib.cpp
int foo()
{
return 42;
}
$ cat fooProg/fooProg.cpp
#include <iostream>
extern int foo();
int main()
{
std::cout << foo() << std::endl;
return 0;
}
在本例中,我的目标是让Python脚本检查fooProg
是否输出42。
下面是我的不太干净的解决方案:
import os
from waflib.Tools import waf_unit_test
def options(opt):
opt.load("compiler_cxx waf_unit_test python")
def configure(cnf):
cnf.load("compiler_cxx waf_unit_test python")
def build(bld):
bld.add_post_fun(waf_unit_test.summary)
bld.options.clear_failed_tests= True
bld(features= "cxx cxxshlib",
target= "fooLib",
source= "fooLib/fooLib.cpp")
bld(features= "cxx cxxprogram",
target= "fooProg/fooProg",
source= "fooProg/fooProg.cpp",
use= "fooLib")
testEnv= os.environ.copy()
testEnv["FOO_EXE"]= bld.path.find_or_declare("fooProg/fooProg").abspath()
bld(features= "test_scripts",
test_scripts_source= "fooProgTest/fooProgTest.py",
test_scripts_template= "${PYTHON} ${SRC[0].abspath()}",
test_scripts_paths= {
"LD_LIBRARY_PATH": bld.bldnode.abspath()
},
test_scripts_env= testEnv
)
cat fooProgTest/fooProgTest.py
#!/usr/bin/env python
import os
import subprocess
assert subprocess.check_output("{}".format(
os.environ["FOO_EXE"])).startswith("42")
我的问题如下:
fooProg
的路径李>多谢各位
可以为可执行文件指定运行时搜索路径。假设文件
fooLib.so
与fooProg
位于同一目录中,对wscript进行以下更改就足够了:这使得LD在搜索共享对象时也要考虑存储可执行文件的目录
使用
subprocess.check_output
可以传递多个参数。即在测试脚本中,必须使用
sys.argv
或argparse
读取参数额外的:
启动解释器来启动您的应用程序似乎有点老套。相反,定义一个自定义任务(实现
waflib.Task.Task
),然后运行subprocess.check_output
11AFAIK waf为您提供了启动流程的便捷方法,尽管我记不起它的名称
相关问题 更多 >
编程相关推荐