我正在尝试使用SCons使用flex lexer构建复杂的应用程序。要构建调试/发布变体,我使用VariantDir()。
问题在于我无法强制lex构建器在变体构建目录中生成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
目录中生成的。
我做错了吗?有什么方法可以做到吗?
答案 0 :(得分:0)
考虑将对VariantDir()的调用与对SConscript()的调用相结合,这通常使构建脚本中的路径更直观。另外,我怀疑(不幸的是)对VariantDir()的调用使SCons flex builder变得混乱。
以下是一个例子:
SConscript('SConscript', variant_dir='build', duplicate=0)
SCons user's guide的第14章和第15章给出了SConscript()函数的一个很好的解释。