0

我将 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 选项及其文件名参数有双引号,这必须是 scons 在扩展 LEXFLAGS 变量时创建的。

当我将此定义用于 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 情况下去掉双引号?

谢谢,安迪

4

1 回答 1

0

SCons 1.1.0 is extremely old at this point. I'd recommend trying 2.3.0. But your analysis is correct; if an option (a single option, that is) has a space in it, SCons will quote it so it stays a single option. But you don't have a single option; you really have two, '-o' and '$TARGET'. Just break it up like that and it'll work.

于 2013-10-08T20:18:23.240 回答