创建 waf 尺寸特征

Create waf size feature

我已经在所有构建文件上为 运行 size 创建了一个 waf 功能,但我不想像我最初想要的那样(参见 )。

所以我现在写了一个功能,它可以正常工作,但又不能正确找到源。我使用 @after('apply_link'),因此二进制文件应该存在...

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')

附带问题:是否有更好的选项将此任务的输出记录为将 > 的输出重定向到输出文件?

当您使用 Taskgen.after 装饰器时,您只需告诉 waf 在任务生成步骤中 运行 apply_link 方法之后的 add_size 方法。因为你的任务生成器没有 link 任何东西,你没有任何 apply_link 方法,你不需要它。

您的问题是您在构建目录上使用了 ant_glob。第一次,里面什么都没有,所以ant_glob returns什么都没有,所以你的任务也没有做:)

您必须向任务生成器添加一个功能来创建您想要调整大小的对象。例如:

@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")

您将获得 link 进程的所有文件的大小。

@Taskgen.extension 仅供 Taskgen.process_source 使用,它处理任务生成器的 source 属性。它不适用于未在 wscript 中表达的中间对象。