Создать ваф размер - PullRequest
       7

Создать ваф размер

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

Я создал функцию waf для запуска size на всех файлах сборки, но я не хочу делать это так, как я хотел изначально (см. Пользовательская задача waf не запускается и не находит источники ).

Итак, я написал функцию, которая работает в целом, но снова не находит источники правильно.Я использую @after('apply_link'), поэтому двоичные файлы должны присутствовать ...

  • Первый запуск: все двоичные файлы генерируются, но size не имеет входных файлов.
  • Второй запуск:все двоичные файлы имеются, и функция size работает правильно.Почему это так?

Функция Waf:

from waflib.TaskGen import extension
from waflib.TaskGen import after

class size(Task.Task):
    color = 'BLUE'
    run_str = '${SIZE} ${SRC} > ${TGT}'

@extension('.o', '.a', '.elf')
@after('apply_link')
def add_size(self, node):
    name = 'size'
    out = node.change_ext('.log')
    task = self.create_task(name, node, out)
    try:
        self.size_tasks.append(task)
    except AttributeError:
        self.size_tasks = [task]
    return task

Использование функции:

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

Дополнительный вопрос: Есть ли лучший вариант для входавывод этой задачи как перенаправление вывода с > в выходной файл?

1 Ответ

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

Когда вы используете декоратор Taskgen.after, вы просто указываете waf запустить метод add_size после метода apply_link на этапе генерации задачи.Поскольку ваш генератор задач ничего не связывает, у вас нет метода apply_link, он вам не нужен.

Ваша проблема в том, что вы используете ant_glob в каталоге сборки.В первый раз в нем ничего нет, поэтому ant_glob ничего не возвращает, поэтому ваша задача не имеет ничего общего:)

Вы должны добавить функцию в генератор задач, которая создает объекты, размер которых вы хотите изменить,Например:

@feature("size") # or feature("*") for every taskgen
@after('apply_link')
def process_sizes(self):

    if getattr(self, "link_task", None) is None:
        return

    objets_to_size = []

    objects_to_size.extend(self.link_task.inputs) # object files
    objects_to_size.extend(self.link_task.outputs) # exe, libs ...

    for node in objects_to_size:
         out = node.change_ext('.log')
         self.create_task("size", node, out)

Для использования:

bld.program(source = "main.c", features = "size", target = "myexe")

Вы получите размер всех файлов процесса ссылки.

@Taskgen.extension используется толькоTaskgen.process_source, которые обрабатывают атрибут source генератора задач.Он плохо работает с промежуточными объектами, не указанными в wscript.

...