创建waf尺寸功能

时间:2018-12-10 14:43:14

标签: waf

我已经创建了waf功能来在所有构建文件上运行size,但是我不想像我最初想要的那样去做(请参阅Custom waf task does neither run nor find sources)。

因此,我现在编写了一个功能,该功能通常可以正常运行,但是再次找不到正确的源。我使用@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 :(得分:1)

在使用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中未表达的中间对象。