Waf Task должен использовать вариант каталога - PullRequest
1 голос
/ 11 марта 2019

Я создаю файлы в Задаче, пример кода выглядит следующим образом:

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 работать на этом примере, и настройка variant на Task.Task не работает.


Обновление

Я обновляю пример, основываясь на ответе неврологов:

Минимальный рабочий пример с этим кодом выглядит так:

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

Так что я просто создаю папку xyz между build и чем бы то ни было tgt. Так точно поведение variant в BuildContext.

1 Ответ

1 голос
/ 13 марта 2019

Когда задачи выполняются, вы уже находитесь в варианте сборки dir.Для управления выходными данными задачи вы должны использовать API класса waflib.Node.В вашем примере 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)

 # [...]
...