将变量回送到SConscript中的文件

将变量回送到SConscript中的文件,scons,Scons,在一个SConscript文件中,我有一个env变量BUILDID\u STR 它包含我希望输出到文件的C字符串 bstr = env['BUILDID_STR'] print(bstr) 打印时,print(bstr)正确显示以下内容: //this file is automatically generated static char* build_str="0|0.1.0|2014-05-29_16:16:51"; 但是,我无法正确地展开/导出变量,只输出文本字符串,而不是上面的文本:

在一个SConscript文件中,我有一个env变量
BUILDID\u STR
它包含我希望输出到文件的C字符串

bstr = env['BUILDID_STR']
print(bstr)
打印时,
print(bstr)
正确显示以下内容:

//this file is automatically generated
static char* build_str="0|0.1.0|2014-05-29_16:16:51";
但是,我无法正确地展开/导出变量,只输出文本字符串,而不是上面的文本:

cat src/log/src/version.c
env[BUILDID_STR]
这是我的SConscript文件的相关部分

env.Command(target='#/src/log/src/version.c',
        source=libSrcfiles,
        action="echo env['BUILDID_STR'] > $TARGET")


env.SharedLibrary('log', [libSrcfiles, '#/src/log/src/version.c'])
我还尝试了函数中的代码,并将其传递给shell脚本,结果都是一样的。 我在SharedLibrary中使用…/version.c的原因是,我的目标是仅在构建
libSrcfiles
的on时生成.c文件,从而编译.c版本。

对于这种情况,“
textfile
”工具提供了两个构建器
textfile()
subtfile()
。您可能希望使用第一个:

env = Environment(tools=['textfile'])
env['BUILDID_STR'] = 'A test'
env.Textfile('test.txt', ['$BUILDID_STR'])

如您所见,该操作并没有扩展env变量。在操作中,您可以使用
$VAR
语法引用env变量(就像引用由SCON提供的
$SOURCE
$TARGET
变量一样):

此解决方案可能无法处理包含多行的
BUILDID\u STR


您可能希望研究从模板构建源文件的系统(而不是完全在字符串中构建文件内容)。中引用的可能是一个很好的起点——您可以在输入文件中提供要替换的(键、值)对的列表。子文件生成器内置于最新版本的SCON中

我终于让action=over开始工作了,但我不得不将其传递给shell脚本,而不是echo。字符串中的引号和管道弄乱了回声。谢谢你,戴夫。
env.Command(target='#/src/log/src/version.c',
    source=libSrcfiles,
    action="echo $BUILDID_STR > $TARGET")