如何增加scons'$ * COMSTR

时间:2016-02-11 02:03:59

标签: scons

我可以通过defining $*COMSTR in my environment定义自定义构建命令输出:

env['CXXCOMSTR'] = compile_source_message 

但是,这会覆盖为build命令显示的消息。我想改为增加消息,例如通过在目标前添加前缀。我的目标是得到这样的信息:

% scons
Compiling foo.o
cc -o foo.o -c foo.c

我尝试了以下内容:

env['CXXCOMSTR'] = compile_source_message + '\n' + env['CXXCOMSTR']

但是,这不起作用,因为CXXCOMSTR不在env,我得到KeyError: 'CXXCOMSTR'

如何扩充/添加默认$*COMSTR前缀?

2 个答案:

答案 0 :(得分:3)

据我所知,目前没有像“$ACTIONCMD”这样的环境变量包含正在运行的构建步骤的完整命令字符串。所以你要做的是:

env['CXXCOMSTR'] = "Compiling $TARGET:\n$ACTIONCMD"

是不可能的。它需要更改SCons核心源,因此从长远来看并非不可能。 ;)

但是,在创建新的Action对象时,您还可以通过callable参数指定strfunction而不是简单的命令字符串。在此函数中,您可以根据自己的喜好编译打印的字符串。在MAN page搜索关键字strfunction以获得展示,然后自行决定是否要使用此路线。另请考虑订阅我们的用户mailing list scons-users@scons.org以获取此类问题。

答案 1 :(得分:1)

您遇到的问题是由于以下行为:

如果* COMSTR被调整为空字符串,则对此动作未定的CommandAction对象将默认使用* COM字符串来生成输出。

try:
    print env.Dump('CXXCOMSTR')
except KeyError as e:
    print env.Dump('CXXCOM')

输出您正在寻找的值。并根据您的具体用途:

try:
    env['CXXCOMSTR'] = compile_source_message + '\n' + env['CXXCOMSTR']
except: KeyError as e:
    env['CXXCOMSTR'] = compile_source_message + '\n' + env['CXXCOM']

当然,如果您的构建中的某些逻辑稍后改变了CXXCOM的值,那么该更改不会影响您的新设置。

如果您想确保对CXXCOM的更改会传播到您的新值CXXCOMSTR,那么以下内容应该有效:

if env.get('CXXCOMSTR',False):
    env['CXXCOMSTR'] = compile_source_message + '\n' + env['CXXCOMSTR']
else:
    env['CXXCOMSTR'] = "%s \n $CXXCOM"%compile_source_message

请注意,在新的CXXCOMSTR中使用$ CXXCOM(*)允许SCons替换并完全展开每个目标的输出。