在waf中使用configure and/or build attributes in Task.Task

Use configure and/or build attributes in Task.Task in waf

我在 envwscriptconfigurebuild 步骤中设置了一些额外的属性。我实现了 Task.Task 的功能,我需要检索存储在 env 中的一些信息,但这不起作用。

MWE 和产生的错误:

from waflib import Context, Options
from waflib import Task, TaskGen
from waflib.Tools.compiler_c import c_compiler

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

def configure(cnf):
    cnf.load('compiler_c')
    cnf.env.abc = 'abc'

def build(bld):
    print('BUILD: bld.env.abc: {}'.format(bld.env.abc))  # works
    bld.program(features=['t_1'], source='main.c')

class t_1(Task.Task):
    print('T_1: bld.env.abc: {}'.format(bld.env.abc))  # does not work
    run_str = 'echo hello'
    color = 'RED'


@TaskGen.feature('t_1')
@TaskGen.after('apply_link')
def add_t_1_task(self):
    try:
        link_task = self.link_task
    except AttributeError as err:
        print err
        return
    self.create_task('t_1')

运行 脚本,产生以下错误:

$ python waf-2.0.2 configure build
Waf: The wscript in '/cygdrive/c/test' is unreadable
Traceback (most recent call last):
  File "/cygdrive/c/test/.waf-2.0.2-b8fa647d13364cbe0c1c8ec06042b54d/waflib/Scripting.py", line 101, in waf_entry_point
    set_main_module(os.path.normpath(os.path.join(Context.run_dir,Context.WSCRIPT_FILE)))
  File "/cygdrive/c/test/.waf-2.0.2-b8fa647d13364cbe0c1c8ec06042b54d/waflib/Scripting.py", line 141, in set_main_module
    Context.g_module=Context.load_module(file_path)
  File "/cygdrive/c/test/.waf-2.0.2-b8fa647d13364cbe0c1c8ec06042b54d/waflib/Context.py", line 360, in load_module
    exec(compile(code,path,'exec'),module.__dict__)
  File "/cygdrive/c/test/wscript", line 16, in <module>
    class t_1(Task.Task):
  File "/cygdrive/c/test/wscript", line 17, in t_1
    print('T_1: bld.env.abc: {}'.format(bld.env.abc))  # does not work
NameError: name 'bld' is not defined

当我无法使用 bld.env 时,如何在派生自 Task.Task 的任务中使用 conf.envbld.env 的属性?

Task.Task 的文档中说我必须提供一个 env - 但我该怎么做呢?

您使用字符串插值。例如,参见 asmprogram 任务的来源:

class asmprogram(link_task):
    "Links object files into a c program"
    run_str = '${ASLINK} ${ASLINKFLAGS} ${ASLNK_TGT_F}${TGT} ${ASLNK_SRC_F}${SRC}'
    ext_out = ['.bin']
    inst_to = '${BINDIR}'

这里ASLINKASLINKFLAGSASLNK_TGT_FASLNK_SRC_FBINDIR来自环境。您还可以直接在任务的方法中访问变量:

class Name(Task.Task):
    # ...
    def run(self):
        # ...
        print self.env.VAR_NAME