我将 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 情况下去掉双引号?
谢谢,安迪