Как объявить WAF-зависимость тестового скрипта от встроенной программы? - PullRequest
2 голосов
/ 28 апреля 2020

Я изо всех сил пытаюсь найти правильный способ определить зависимость тестового скрипта от бинарной программы, которая встраивается в один и тот же процесс сборки. Вот минимальный пример wscript:

from waflib.Tools import waf_unit_test

def options(opt):
    opt.load("compiler_cxx python waf_unit_test")

def configure(cnf):
    cnf.load("compiler_cxx python waf_unit_test")


def build(bld):
    bld.add_post_fun(waf_unit_test.summary)
    bld.options.clear_failed_tests= True

    bld(features= "cxx cxxprogram",
        target= "foo",
        source= "foo.cpp")

    tg= bld(features= "test_scripts",
        test_scripts_source= "fooTest.py",
        test_scripts_template= "${PYTHON} ${SRC}")
    tg.post()
    tg.tasks[0].inputs.append(bld.path.find_or_declare("foo"))

Я хочу express, что waf должен собрать программу foo. Затем, если программа foo изменилась с момента последнего запуска сборки, сценарий fooTest.py должен проверить выполнение этой программы. wscript выше работает:

Waf: Entering directory `/home/x/tmp/exe_depend/build'
[1/3] Compiling foo.cpp
[2/3] Linking build/foo
[3/3] Processing utest: fooTest.py build/foo
Waf: Leaving directory `/home/x/tmp/exe_depend/build'
execution summary 
  tests that pass 1/1 
    /home/x/tmp/exe_depend/fooTest.py 
  tests that fail 0/1 
'build' finished successfully (0.054s)

В принципе, wscript выше отвечает моим потребностям, но выглядит уродливо, как взлом, и кажется неправильным возиться с генератором задач tg. Кто-нибудь из вас знает гладкое решение?

1 Ответ

0 голосов
/ 29 апреля 2020

Ну, в waf_unit_test.py не так много хуков. лучший способ - расширить его, создав собственный инструмент и поместив в него 2 строки кода. Примерно так:

# in file my_unit_test.py

def options(opt):
    opt.load("waf_unit_test") # we extend it, no need to recode

def configure(conf):
    conf.load("waf_unit_test") # we extend it, no need to recode

@feature('test_scripts')
@after_method('make_interpreted_test') # we execute after task creation
def process_test_scripts_dependencies(self):
    try:
        self.test_scripts_deps
    except AttributeError:
        return

    for task in self.tasks: # there can be many scripts
        task.set_inputs(self.to_nodes(self.test_scripts_deps))

Использование:

def options(opt):
    opt.load("compiler_cxx python my_unit_test")

def configure(cnf):
    cnf.load("compiler_cxx python my_unit_test")


def build(bld):
    bld.add_post_fun(waf_unit_test.summary)
    bld.options.clear_failed_tests= True

    myprogram = "foo"

    bld(
        features = "cxx cxxprogram",
        target = myprogram,
        source = "foo.cpp",
    )

    bld(
        features = "test_scripts",
        test_scripts_deps = myprogram,
        test_scripts_source = "fooTest.py",
        test_scripts_template = "${PYTHON} ${SRC}",
    )

Конечно, вы можете go продвинуться дальше и переписать то, что соответствует вашим потребностям:)

...