【问题标题】:Create waf size feature创建 waf 大小特征
【发布时间】:2018-12-12 21:38:43
【问题描述】:

我创建了一个 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')

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

【问题讨论】:

    标签: waf


    【解决方案1】:

    当您使用 Taskgen.after 装饰器时,您只需告诉 waf 在任务生成步骤中的 apply_link 方法之后运行 add_size 方法。由于你的任务生成器没有链接任何东西,你没有任何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 仅由处理任务生成器的source 属性的Taskgen.process_source 使用。它不适用于未在 wscript 中表达的中间对象。

    【讨论】:

    • 嗯,这在我的机器上不起作用Cycle detected in the method execution: - process_use after ['propagate_uselib_vars'] - process_source after ['process_use', 'apply_link'] - apply_link after ['process_use', 'update_sources'] - propagate_uselib_vars after [] - update_sources after ['process_source']
    • @waf3:是的,我的错。 apply_linkprocess_source 之后。我将编辑我的答案...
    • 静态库通常由bld.stlib 快捷方式生成。您可以使用link_task.outputs。对于 .elf 我不知道。可能是编译/链接的一些副作用?
    • 如果你在.o和.elf之间有一个清晰的映射,你可以使用change_ext来实现你想要的
    • 您可以使用Logs.debug("myfeature: any log message")。这些日志不会在终端上打印,除非您使用选项--zone myfeature。将Logs.info("any log") 用于您总是想打印的日志。
    猜你喜欢
    • 1970-01-01
    • 2022-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多