gpt4 book ai didi

waf - 自定义waf任务既不运行也不找源

转载 作者:行者123 更新时间:2023-12-01 13:17:14 27 4
gpt4 key购买 nike

在我的 wscript 中,我在 apply_link 方法之后运行了一些自定义任务(dummy),这工作正常。

在这个dummy任务完成后,我想收集我所有的输出文件(让它成为*.dll*.exe*.o*.a*.elf) 并在这些输出文件上运行另一个任务,但出现两个错误:

  • 任务似乎根本没有生成。
  • bld.path.get_bld().ant_glob(...) 找到的输出文件不会传递给任务。

wscript 看起来像这样:

#!/usr/bin/env python
# -*- encoding: utf-8 -*-

top = '.'
out = 'build'

VERSION = '0.0.0'
APPNAME = 'app'

from waflib import Task, TaskGen

def options(opt):
opt.load('compiler_c')

def configure(conf):
conf.load('compiler_c')

def build(bld):
bld.program(target='app', features='dummy', source='main.c')
bld.path.get_bld().ant_glob('**/*.elf **/*.a **/*.o', quiet=True)
bld(bld.path.get_bld().ant_glob('**/*.elf **/*.a **/*.o', quiet=True))


class tsk_1(Task.Task):
run_str = 'echo Hello from dummy and ${SRC} > ${TGT}'
color = 'GREEN'


@TaskGen.feature('dummy')
@TaskGen.after_method('apply_link')
def add_dummy_task(self):
# create one more *.o file
self.dummy_task = self.create_task(
'tsk_1',
src=self.link_task.outputs[0],
tgt=self.link_task.outputs[0].change_ext('hello.o'))

@TaskGen.extension('.elf')
@TaskGen.extension('.a')
@TaskGen.extension('.o')
@TaskGen.after('add_dummy_task')
def process(self, node):
self.sk = self.create_task('size', node)

class size(Task.Task):
color = 'PINK'
def run(self):
print('Another hello from ${self.inputs[0]}')

外壳输出:

$ python waf clean configure build -v
'clean' finished successfully (0.036s)
Setting top to : /cygdrive/c/Users/user/Documents/waf-tests/test1
Setting out to : /cygdrive/c/Users/user/Documents/waf-tests/test1/build
Checking for 'gcc' (C compiler) : 09:11:43 runner ['/usr/bin/gcc', '-dM', '-E', '-']
/usr/bin/gcc
'configure' finished successfully (0.123s)
Waf: Entering directory `/cygdrive/c/Users/user/Documents/waf-tests/test1/build'
[1/3] Compiling main.c
09:11:43 runner ['/usr/bin/gcc', '../main.c', '-c', '-o/cygdrive/c/Users/user/Documents/waf-tests/test1/build/main.c.1.o']
[2/3] Linking build/app.exe
09:11:43 runner ['/usr/bin/gcc', '-Wl,--enable-auto-import', 'main.c.1.o', '-o/cygdrive/c/Users/user/Documents/waf-tests/test1/build/app.exe', '-Wl,-Bstatic', '-Wl,-Bdynamic']
[3/3] Compiling build/app.exe
09:11:43 runner ' echo Hello from dummy and app.exe > apphello.o '
Waf: Leaving directory `/cygdrive/c/Users/user/Documents/waf-tests/test1/build'
'build' finished successfully (0.356s)

如果我重新运行 build 命令 waf 至少可以找到输出文件(当然,现在它们已经存在了 ;)),但即便如此它运行我的其他自定义任务:

$ python waf build
Waf: Entering directory `/cygdrive/c/Users/user/Documents/waf-tests/test1/build'
[/cygdrive/c/Users/user/Documents/waf-tests/test1/build/apphello.o, /cygdrive/c/Users/user/Documents/waf-tests/test1/build/main.c.1.o]
Waf: Leaving directory `/cygdrive/c/Users/user/Documents/waf-tests/test1/build'
'build' finished successfully (0.040s)

所以我的问题总结为:

  • 为什么 waf@TaskGen.after('add_dummy_task') 完成后不遵守搜索输出文件的约束
  • 为什么任务不运行,即使文件存在,因为以前的构建可用。

最佳答案

Taskgen.after 添加的约束只是任务生成器方法的顺序。它并不意味着对任务有任何限制。您可以使用 --zone task_gen 选项看到这一点。

您描述的唯一来源是 main.c,它不会触发您的 process 方法。

可能是打字错误,但是您的第二个任务生成器没有 Taskgen.extension 所需的 source 属性,也没有 features 属性。尝试:

bld(
source = bld.path.get_bld().ant_glob('**/*.elf **/*.a **/*.o'),
features = 'dummy',
quiet = True
)

关于waf - 自定义waf任务既不运行也不找源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53665743/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com