如何增加 scons 的 $*COMSTR

How to augment scons' $*COMSTR

我可以通过 defining $*COMSTR in my environment:

定义自定义构建命令输出
env['CXXCOMSTR'] = compile_source_message 

但是,这会覆盖为构建命令显示的消息。我想增加消息,例如通过在它前面加上目标。我的目标是发出这样的消息:

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

我尝试了以下方法:

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

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

我怎样才能augment/prefix默认$*COMSTR

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

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

不可能。这将需要更改 SCons 核心源,因此从长远来看这并非不可能 运行。 ;)

但是,在创建新的 Action 对象时,您还可以通过 strfunction 参数指定 callable 而不是简单的命令字符串。在这个函数中,您可以根据自己的喜好编译打印的字符串。在 MAN page for the keyword strfunction to get an impression, and then decide for yourself whether you want to take this route or not. Please also consider subscribing to our user mailing list scons-users@scons.org 中搜索此类问题。

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

如果 *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 替换并完全扩展每个目标的输出。