我想在使用 waf 构建 C++ 项目时生成一个简单的 DOT 文件。理想情况下,我只想使用 bld
命令的 use
和 target
属性来生成文件。这很容易注入(inject)系统吗?
例如这个 wscript 文件(仅提及我想使用的部分)
def build(bld):
bld( use = [ 'lib1',
'lib2', ] ,
target = 'lib3' )
将产生输出
lib3 -> lib1
lib3 -> lib2
注入(inject)此行为的最佳位置在哪里?
谢谢!
最佳答案
您可以通过构建步骤中的 add_post_fun
轻松添加这样的工具,如下所示:
from waflib.Errors import WafError
from waflib import Utils
def filter_uses(ctx, uses):
filtered = []
for use in uses:
try:
ctx.get_tgen_by_name(use)
filtered.append(use)
except WafError:
pass
return filtered
@Utils.run_once # print only once, even if used in multiple script
def make_dot_file(ctx):
for group in ctx.groups:
for taskgen in group:
uses = Utils.to_list(getattr(taskgen, 'use', []))
uses = filter_uses(ctx, uses) # Optional, only print TaskGens
try:
name = taskgen.name # Sometimes this fails, don't know why
print "{} -> {}".format(name, ", ".join(uses))
except AttributeError:
pass
def build(bld):
# Build stuff ...
bld.add_post_fun(make_dot_file)
注意:要获得真正好的输出,一些更多的过滤可能会有用
关于c++ - 如何使用 waf 制作库依赖图?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19959595/