创建 waf 尺寸特征
Create waf size feature
我已经在所有构建文件上为 运行 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')
附带问题:是否有更好的选项将此任务的输出记录为将 >
的输出重定向到输出文件?
当您使用 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 中表达的中间对象。
我已经在所有构建文件上为 运行 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')
附带问题:是否有更好的选项将此任务的输出记录为将 >
的输出重定向到输出文件?
当您使用 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 中表达的中间对象。