Пользовательская задача waf не запускается и не находит источники - PullRequest
0 голосов
/ 07 декабря 2018

В моем wscript я запускаю некоторую пользовательскую задачу (dummy) после метода apply_link, и это прекрасно работает.

После того, как эта dummy -задача закончена, я хочу собрать всеиз моих выходных файлов (пусть это будет *.dll, *.exe, *.o, *.a или *.elf) и запустить другую задачу для этих выходных файлов, но я получаю две ошибки:

  • Похоже, что задача вообще не создается.
  • Выходные файлы, найденные bld.path.get_bld().ant_glob(...), не передаются в задачу.

wscript выглядит следующим образом:

#!/usr/bin/env python
# -*- encoding: utf-8 -*-

top = '.'
out = 'build'

VERSION = '0.0.0'
APPNAME = 'app'

from waflib import Task, TaskGen

def options(opt):
    opt.load('compiler_c')

def configure(conf):
    conf.load('compiler_c')

def build(bld):
    bld.program(target='app', features='dummy', source='main.c')
    bld.path.get_bld().ant_glob('**/*.elf **/*.a **/*.o', quiet=True)
    bld(bld.path.get_bld().ant_glob('**/*.elf **/*.a **/*.o', quiet=True))


class tsk_1(Task.Task):
    run_str = 'echo Hello from dummy and ${SRC} > ${TGT}'
    color = 'GREEN'


@TaskGen.feature('dummy')
@TaskGen.after_method('apply_link')
def add_dummy_task(self):
    # create one more *.o file
    self.dummy_task = self.create_task(
        'tsk_1',
        src=self.link_task.outputs[0],
        tgt=self.link_task.outputs[0].change_ext('hello.o'))

@TaskGen.extension('.elf')
@TaskGen.extension('.a')
@TaskGen.extension('.o')
@TaskGen.after('add_dummy_task')
def process(self, node):
    self.sk = self.create_task('size', node)

class size(Task.Task):
    color = 'PINK'
    def run(self):
        print('Another hello from ${self.inputs[0]}')

Вывод оболочки:

$ python waf clean configure build -v
'clean' finished successfully (0.036s)
Setting top to                           : /cygdrive/c/Users/user/Documents/waf-tests/test1
Setting out to                           : /cygdrive/c/Users/user/Documents/waf-tests/test1/build
Checking for 'gcc' (C compiler)          : 09:11:43 runner ['/usr/bin/gcc', '-dM', '-E', '-']
/usr/bin/gcc
'configure' finished successfully (0.123s)
Waf: Entering directory `/cygdrive/c/Users/user/Documents/waf-tests/test1/build'
[1/3] Compiling main.c
09:11:43 runner ['/usr/bin/gcc', '../main.c', '-c', '-o/cygdrive/c/Users/user/Documents/waf-tests/test1/build/main.c.1.o']
[2/3] Linking build/app.exe
09:11:43 runner ['/usr/bin/gcc', '-Wl,--enable-auto-import', 'main.c.1.o', '-o/cygdrive/c/Users/user/Documents/waf-tests/test1/build/app.exe', '-Wl,-Bstatic', '-Wl,-Bdynamic']
[3/3] Compiling build/app.exe
09:11:43 runner ' echo Hello from dummy and app.exe > apphello.o '
Waf: Leaving directory `/cygdrive/c/Users/user/Documents/waf-tests/test1/build'
'build' finished successfully (0.356s)

Если я перезапущу команду build waf по крайней мере найдет выходные файлы (конечно, теперь они уже присутствуют;)), но даже не тогда он запускает мою другую пользовательскую задачу:

$ python waf build
Waf: Entering directory `/cygdrive/c/Users/user/Documents/waf-tests/test1/build'
[/cygdrive/c/Users/user/Documents/waf-tests/test1/build/apphello.o, /cygdrive/c/Users/user/Documents/waf-tests/test1/build/main.c.1.o]
Waf: Leaving directory `/cygdrive/c/Users/user/Documents/waf-tests/test1/build'
'build' finished successfully (0.040s)

Итак, мои вопросы сводятся к:

  • Почему waf не соблюдает ограничение поискадля выходных файлов после завершения @TaskGen.after('add_dummy_task')
  • Почему задача не запускается, даже если файлы присутствуют с тех пор, как доступна предыдущая сборка.

1 Ответ

0 голосов
/ 10 декабря 2018

Ограничение, добавляемое Taskgen.after, относится только к порядку методов генератора задач.Это не подразумевает ЛЮБОГО ограничения на задачи.Вы можете увидеть это, используя опцию --zone task_gen.

Единственный источник, который вы описали, это main.c, который не запускает ваш метод process.

Возможно, опечатка, но ваша втораяу генератора задач нет атрибута source, необходимого для атрибута Taskgen.extension, или атрибута features.Попробуйте:

bld(
    source = bld.path.get_bld().ant_glob('**/*.elf **/*.a **/*.o'),
    features = 'dummy',
    quiet = True
)
...