我已经创建了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')
侧面问题:将>
的输出重定向到输出文件时,是否有更好的方法来记录此任务的输出?
答案 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中未表达的中间对象。