动态任务生成器

  • 本文关键字:任务 动态 build waf
  • 更新时间 :
  • 英文 :


我正在评估一个现有项目的waf构建,该项目的任务与类似

1. preprocessing phase: datafile => TransformationTask => library name list
2. for each library name: 
2.1 import files from repository
2.2 build library

库列表取决于预处理任务,自然不会提前知道。

如何用waf实现这一点?

您必须用第一个任务生成一个带有库列表的文件。另一个任务将第一个任务的输出作为输入,并在需要时处理相应的文件以生成所需的内容。

不知何故,这是waf书§11.4.2中给出的例子。您必须将编译器输出解析替换为库描述文件解析。您需要复制示例并更改mytool.py中的run方法,如:

class src2c(Task.Task):
color = 'PINK'
quiet = True
before = ['cstlib']
def run(self):
libnode = self.inputs[0]
libinfo = libnode.read_json()
name = libinfo['name']
files = [f"repo/{file}" for file in libinfo['files']]
taskgen = self.generator

# library name
taskgen.link_task.outputs = []
taskgen.link_task.add_target(name)
# library sources files
nodes = [taskgen.path.make_node(f) for f in files]
# update discovered dependancies
taskgen.bld.raw_deps[self.uid()] = [self.signature()] + nodes
with g_lock:
self.add_c_tasks(nodes)
# cf waf book § 11.4.2
def add_c_tasks(self, lst):
...

# cf waf book § 11.4.2
def runnable_status(self):
...

在wscript中,我用一个副本模拟数据文件转换

def options(opt):
opt.load("compiler_c")
def configure(cnf):
cnf.load("compiler_c")
cnf.load("mytool", tooldir=".")
def build(bld):
bld(source = "libs.json", target = "libs.src", features = "subst")
bld(source = "libs.src", features = ["c", "cstlib"])

使用简单的my_lib.json:

{
"name": "mylib2",
"files": ["f1.c", "f2.c"]
}

文件repo/f1.c和repo/f2.c,如void f1(){}void f2(){}