【发布时间】:2014-04-11 08:33:41
【问题描述】:
我正在尝试使用 SCons 使用 flex lexer 构建一个复杂的应用程序。为了构建调试/发布变体,我使用 VariantDir()。
问题是我无法强制 lex builder 在变体构建目录中生成 lexer 标头。这本身并不是一个大问题,但它迫使 SCons 认为词法分析器总是过时的。
SConstruct内容:
VariantDir('build', '.', duplicate=0)
SConscript('build/SConscript')
SConscript 内容:
env = Environment(LEXFLAGS='--header-file=scanner.h')
env.Program(target='scanner', source='scanner.l')
代表这个问题的完整来源在这里:https://gist.github.com/g7r/4257f273715cadcf0d36
第一次运行 scons.py --debug=explain 给了我们这个:
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
scons: building associated VariantDir targets: build
scons: building `build/scanner.c' because it doesn't exist
flex --header-file=scanner.h -t scanner.l > build/scanner.c
scons: building `build/scanner.o' because it doesn't exist
gcc -o build/scanner.o -c build/scanner.c
scons: building `build/scanner' because it doesn't exist
gcc -o build/scanner build/scanner.o
scons: done building targets.
第二次运行给出了这个:
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
scons: building associated VariantDir targets: build
scons: building `build/scanner.h' because it doesn't exist
flex --header-file=scanner.h -t scanner.l > build/scanner.c
scons: done building targets.
所以第二次运行重建了词法分析器,因为scanner.h 是在根目录而不是build 目录中生成的。
我做错了吗?有什么方法可以做到吗?
【问题讨论】:
-
第一次运行后第二次运行前的scanner.h文件在哪里?如果你第三次运行它,你会得到与第二次相同的结果吗?我会这样想。我认为解决方案可能是这样做: env = Environment(LEXFLAGS='--header-file=build/scanner.h')
-
如果我刚才的评论解决了问题,我可以通过将 variant_dir 添加到对 SConscript() 的调用并删除对 VariantDir() 的调用来向您展示如何做到这一点,这将使构建脚本和路径更直观。
-
@Brady,您的解决方案没有帮助。如果我指定
--header-file=build/scanner.hSCons 由于缺少build/build/scanner.h而不断重建词法分析器。 -
嗯,奇怪。第一次运行后的scanner.h文件在哪里?
-
随着
--header-file=scanner.hscanner.h出现在项目根目录中。
标签: lex flex-lexer scons