Waf 任务应使用变体目录
Waf Task should use variant directory
我正在任务中创建文件,示例代码如下所示:
from waflib import Task, TaskGen
def build(bld):
bld(features='write_file')
class xyz(Task.Task):
def run(self):
self.generator.path.get_bld().make_node(self.outputs[0].relpath())
@TaskGen.feature('write_file')
def make_tasks(self):
for x in range(20):
src = bld.path.find_node('wscript')
tgt = src.change_ext('.'+str(x))
tsk = self.create_task('xyz', src=src, tgt=tgt)
现在所有文件都放在 build
目录中,但我希望将它们放在 build\abc
中。我怎么做?对于正常构建,我可以使用 BuildContext
并指定 variant
:
from waflib.Build import BuildContext
class abc(BuildContext):
variant = 'abc'
但我无法让 BuildContext
处理该示例,并且在 Task.Task
上设置 variant
不起作用。
更新
我根据 neuros answer 更新示例:
此代码的最小工作示例如下所示:
from waflib import Task, TaskGen, Configure
Configure.autoconfig = True
def configure(cnf):
cnf.path.get_src().make_node('a/wscript').write('')
def build(bld):
bld(features='write_file')
class xyz(Task.Task):
def run(self):
self.generator.path.get_bld().find_or_declare(self.outputs[0].abspath()).write('')
@TaskGen.feature('write_file')
def make_tasks(self):
srcs = bld.path.ant_glob('**/wscript', excl='build')
for src in srcs:
build_dir_of_src = src.get_bld().parent
my_sub_node = build_dir_of_src.make_node('xyz')
my_sub_node.mkdir()
tgt_basename = src.name
tgt = my_sub_node.make_node(tgt_basename)
tsk = self.create_task('xyz', src=src, tgt=tgt)
问题是这会产生以下内容:
build\xyz\wscript
build\a\xyz\wscript
但我想要这个:
build\xyz\wscript
build\xyz\a\wscript
所以我只是在 build
和 tgt 之间创建文件夹 xyz
。 variant
在 BuildContext
.
中的行为
当任务执行时,您已经在变体构建目录中。要控制任务的输出,您必须使用 waflib.Node
class API。在您的示例中,change_ext
获取等效的源构建目录并更改扩展名。插入子目录:
# [...]
build_dir_of_src = src.get_bld().parent
my_sub_node = build_dir_of_src.make_node("my_sub_dir")
my_sub_node.mkdir()
tgt_basename = src.change_ext('.' + str(x)).name
tgt = my_sub_node.make_node(tgt_basename)
# [...]
如果你想插入一个"variant style"目录,你可以使用bld.bldnode(未经测试但你明白了,使用bld.bldnode):
def get_my_bld(bld, src_node):
variant_like_dirname = "xyz"
my_bld_node = bld.bldnode.make_node(variant_like_dirname)
my_bld_node.mkdir()
rp = src_node.get_bld().relpath(bld.bldnode)
my_bld_target = my_bld_node.make_node(rp)
return my_bld_tgt
# [...]
tgt = get_my_bld(bld, src)
# [...]
我正在任务中创建文件,示例代码如下所示:
from waflib import Task, TaskGen
def build(bld):
bld(features='write_file')
class xyz(Task.Task):
def run(self):
self.generator.path.get_bld().make_node(self.outputs[0].relpath())
@TaskGen.feature('write_file')
def make_tasks(self):
for x in range(20):
src = bld.path.find_node('wscript')
tgt = src.change_ext('.'+str(x))
tsk = self.create_task('xyz', src=src, tgt=tgt)
现在所有文件都放在 build
目录中,但我希望将它们放在 build\abc
中。我怎么做?对于正常构建,我可以使用 BuildContext
并指定 variant
:
from waflib.Build import BuildContext
class abc(BuildContext):
variant = 'abc'
但我无法让 BuildContext
处理该示例,并且在 Task.Task
上设置 variant
不起作用。
更新
我根据 neuros answer 更新示例:
此代码的最小工作示例如下所示:
from waflib import Task, TaskGen, Configure
Configure.autoconfig = True
def configure(cnf):
cnf.path.get_src().make_node('a/wscript').write('')
def build(bld):
bld(features='write_file')
class xyz(Task.Task):
def run(self):
self.generator.path.get_bld().find_or_declare(self.outputs[0].abspath()).write('')
@TaskGen.feature('write_file')
def make_tasks(self):
srcs = bld.path.ant_glob('**/wscript', excl='build')
for src in srcs:
build_dir_of_src = src.get_bld().parent
my_sub_node = build_dir_of_src.make_node('xyz')
my_sub_node.mkdir()
tgt_basename = src.name
tgt = my_sub_node.make_node(tgt_basename)
tsk = self.create_task('xyz', src=src, tgt=tgt)
问题是这会产生以下内容:
build\xyz\wscript
build\a\xyz\wscript
但我想要这个:
build\xyz\wscript
build\xyz\a\wscript
所以我只是在 build
和 tgt 之间创建文件夹 xyz
。 variant
在 BuildContext
.
当任务执行时,您已经在变体构建目录中。要控制任务的输出,您必须使用 waflib.Node
class API。在您的示例中,change_ext
获取等效的源构建目录并更改扩展名。插入子目录:
# [...]
build_dir_of_src = src.get_bld().parent
my_sub_node = build_dir_of_src.make_node("my_sub_dir")
my_sub_node.mkdir()
tgt_basename = src.change_ext('.' + str(x)).name
tgt = my_sub_node.make_node(tgt_basename)
# [...]
如果你想插入一个"variant style"目录,你可以使用bld.bldnode(未经测试但你明白了,使用bld.bldnode):
def get_my_bld(bld, src_node):
variant_like_dirname = "xyz"
my_bld_node = bld.bldnode.make_node(variant_like_dirname)
my_bld_node.mkdir()
rp = src_node.get_bld().relpath(bld.bldnode)
my_bld_target = my_bld_node.make_node(rp)
return my_bld_tgt
# [...]
tgt = get_my_bld(bld, src)
# [...]