我正在尝试使用SCons使用flex lexer构建一个复杂的应用程序。为了构建调试/发布版本,我使用了VariantDir()。
问题是我不能强制lex builder在variant构建目录中生成lexer头文件。这本身不是一个大问题,但它迫使SCons认为lexer总是过时的。
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.因此,第二次运行会重新构建lexer,因为scanner.h是在根目录而不是build目录中生成的。
我做错了什么吗?有没有办法做到这一点?
发布于 2014-04-11 19:28:11
考虑将对VariantDir()的调用与对SConscript()的调用结合起来,这通常会使构建脚本中的路径更直观。此外,我怀疑(不幸的是)对VariantDir()的调用会混淆SCons flex构建器。
下面是一个示例:
SConscript('SConscript', variant_dir='build', duplicate=0)SCons user's guide的第14章和第15章很好地解释了SConscript()函数。
https://stackoverflow.com/questions/23007461
复制相似问题