如何将SCons lex构建器与变量目录一起使用

时间:2014-04-11 08:33:41

标签: lex flex-lexer scons

我正在尝试使用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目录中生成的。

我做错了吗?有什么方法可以做到吗?

1 个答案:

答案 0 :(得分:0)

考虑将对VariantDir()的调用与对SConscript()的调用相结合,这通常使构建脚本中的路径更直观。另外,我怀疑(不幸的是)对VariantDir()的调用使SCons flex builder变得混乱。

以下是一个例子:

SConscript('SConscript', variant_dir='build', duplicate=0)

SCons user's guide的第14章和第15章给出了SConscript()函数的一个很好的解释。