【问题标题】:Waf Task should use variant directoryWaf 任务应该使用变体目录
【发布时间】:2019-03-14 17:34:12
【问题描述】:

我在Task中创建文件,示例代码如下:

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 不起作用。


更新

我根据神经系统回答更新示例:

使用此代码的最小工作示例如下所示:

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。这正是variantBuildContext 中的行为。

【问题讨论】:

    标签: waf


    【解决方案1】:

    当任务执行时,您已经在一个变体构建目录中。要控制任务的输出,您必须使用 waflib.Node 类 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)
    
    # [...]
    

    如果你想插入一个“变体风格”的目录,你可以使用 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)
    
     # [...]
    

    【讨论】:

    • 感谢您的回答,但这并不完全是我试图实现的目标。为了更清楚,我编辑了我的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多