【问题标题】:How to use SCons lex builder with variant directories如何使用带有变体目录的 SCons lex builder
【发布时间】: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.h SCons 由于缺少build/build/scanner.h 而不断重建词法分析器。
  • 嗯,奇怪。第一次运行后的scanner.h文件在哪里?
  • 随着--header-file=scanner.hscanner.h出现在项目根目录中。

标签: lex flex-lexer scons


【解决方案1】:

考虑将对 VariantDir() 的调用与对 SConscript() 的调用结合起来,这通常会使构建脚本中的路径更加直观。另外,我怀疑(不幸的是)对 VariantDir() 的调用让 SCons flex builder 感到困惑。

这是一个例子:

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

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

【讨论】:

  • 你的食谱不起作用。它给出了Ignoring missing SConscript 'build/SConscript' 错误。如果我将其更改为 SConscript('SConscript', variant_dir='build', duplicate=0) SCons 行为与我在问题中描述的相同。
  • @SergejZagursky SConscript 构建脚本在哪里?在与 SConstruct 相同的目录中?如果没有,能否展示一下相关的项目目录结构。
  • 所有源文件和构建脚本都在同一个目录中。
  • @SergejZagursky 我相应地更新了答案。另外,我最初忽略了 variant_dir='build'。现在应该会更好。
  • 老实说,我也怀疑 lex 工具错误地处理带有 VariantDir() 的构建。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-14
  • 2011-05-17
  • 2011-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多