scons包含带双引号的选项

时间:2013-09-30 18:15:31

标签: scons

我将scons(V1.1.0)用于包含涉及flex工具的构建步骤的项目。

scons默认规则中flex命令的定义是:

env["LEX"]      = env.Detect("flex") or "lex"
env["LEXFLAGS"] = SCons.Util.CLVar("")
env["LEXCOM"]   = "$LEX $LEXFLAGS -t $SOURCES > $TARGET"

我不想改变。

但是,由于-t导致在引用文件“< stdout>”的输出文件中创建#line指令,这会混淆后续的gcov处理。

作为一个解决方案,我发现-o可以用来覆盖flex产生的文件名到#line指令中(由于-t选项显然优先,它仍然在stdout上产生它的输出。)

为实现这一目标,我在项目的SConscript文件中添加了这个:

env.AppendUnique(LEXFLAGS = ['-o $TARGET','-c'],delete_existing=1)

我添加了-c选项(什么都不做)只是为了显示它与-o的处理方式之间的区别。

SConscript文件中的相应调试打印产生以下结果(如预期的那样):

repr(env["LEXFLAGS"]) = ['-o $TARGET', '-c']

根据scons日志,这会产生以下命令行:

flex "-o build/myfile.cpp" -c -t src/myfile.ll > build/myfile.cpp

因此-c选项会根据需要进入命令行,但-o选项及其filename参数在它周围有双引号,在扩展LEXFLAGS变量时必须由scons创建。

当我将此定义用于LEXFLAGS时:

env.AppendUnique(LEXFLAGS = ['--outfile=$TARGET','-c'],delete_existing=1)

生成的命令行按预期工作:

flex --outfile=build/myfile.cpp -c -t src/myfile.ll > build/myfile.cpp

因此可以推测-o情况下的空白导致使用双引号,可能是为了尝试将内容绑定到命令的一个逻辑参数中。

因此,虽然使用--outfile解决了我的直接问题,但我的问题仍然是可以在-o情况下删除双引号吗?

谢谢, 安迪

1 个答案:

答案 0 :(得分:0)

此时,SCons 1.1.0非常老旧。我建议尝试2.3.0。但是你的分析是正确的;如果一个选项(单个选项,即)中有一个空格,SCons将引用它,使其保持单一选项。但是你没有一个选择;你真的有两个,'-o''$TARGET'。就这样打破它,它会起作用。