我可以通过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
前缀?
答案 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替换并完全展开每个目标的输出。