I have a configuration function in my wscript:
def configure(ctx):
ctx.env.V1 = 123
def build(ctx):
def myfun(task):
return task.exec_command('echo VAR=${V1}')
ctx.exec_command('echo VAR=${V1}')
ctx.add_post_fun(myfun)
But in build and in myfun (both) V1 is not available (it's substituted to an empty string). I can store and load my own ConfigSet. I know that V1 is available in rule, but it seems it is not available in exec_command().
What is the convenient way to do it? To access my config vars in exec_command() in build() body and in pre-/post- commands?
CodePudding user response:
The docs for waflib.Context.Context.exec_command() specify it as a thin wrapper around either waflib.Utils.run_prefork_process() or waflib.Utils.run_regular_process(), which is a thin wrapper over subprocess.Popen(**kwargs).communicate().
Both of these let you set env= as a keyword argument, though it needs to have only values which can actually be stored in the environment (which integers, like your 123, cannot).
Thus:
env_safe_dict = dict(os.environ) # start with parent environment
for k, v in ctx.env: # add things from context environment
env_safe_dict[k] = str(v) # ...after converting them to strings
ctx.exec_command('echo VAR=${V1}', env=env_safe_dict)
