【问题标题】:Scons Build Dependency Optimziation?Scons 构建依赖优化?
【发布时间】:2014-08-14 19:23:34
【问题描述】:

我有 2 个项目的构建设置,一个项目从目录中获取 .xml 文件并将它们处理成头文件。然后,第二个项目将使用这些文件。有什么方法可以检查他的项目是否需要重新运行(.xml 文件被修改或添加了新文件)?

【问题讨论】:

  • 如果我弄错了,请纠正我:在 project1 中您执行 .xml->.h,在 project2 中您使用在 project1 中创建的标头。 project2 究竟是如何使用标题的?它是一个标准的 C/CPP 项目,它会自动扫描隐式依赖项吗?
  • 头文件被放入项目的include/文件夹中,生成的头文件内容大多只是结构。问题是创建头文件,我不想在每次构建时都创建它们,因为有些非常大并且需要一些时间来创建。但是当我对 .xml 文件进行更改时,我希望它运行,因此检查头文件以查看它是否需要构建,如果这是你的想法,我认为不会工作。

标签: scons


【解决方案1】:

只需将这两个项目合并到一个公共源代码树和一个单一 SConstruct 中(在子文件夹中包含任意数量的 SConscripts,这些 SConscript(file) 包含)。

然后确保始终尝试构建 include/ 文件夹中的头文件,例如通过使用 env.Default() 将它们添加为默认目标。

SCons 只会在对应的源 XML 文件改变了其内容时调用每个转换.xml->.h。

【讨论】:

  • 它不是一个一个地做,而是一个批次地做。该程序确保继承,因此无法一一处理。我基本上是从 scons 调用genheaders <input_dir> <output_dir>,它怎么知道只有那个 xml 文件?
  • 您将为这个特定的构建步骤编写一个发射器,然后在内部将 扩展为目标和源的完整列表(请参阅scons.org/wiki/ToolsForFools)。然后 SCons 知道您的构建步骤创建了哪些文件,并可以将它们正确链接到构建的下一个阶段 (= project2)。
  • 我不确定发射器是否会工作,因为它依赖于输入并且该输入会生成预期文件的列表。如果我这样做 source = "mydir/" 我没有办法生成它应该除了的目标,因为输出取决于这些文件的内容,这些文件只有在执行命令后才知道,但 Scon 的发射器需要在文件之前知道执行。
  • 好吧,您说创建的文件列表是“预期的”,因此似乎有一些基本规则描述了在执行构建步骤后应该存在哪些输出文件。如果这不知道,那么您就没有任何关于您的依赖项的信息......所以没有机会改进它们的检测方式。您能否发布当前用于 .xml->.h 转换的构建步骤(构建器?)的样子?
  • 是的,你必须解析。例如,这就是 SCons 中的 Java 构建器所做的。它解析源文件,以查找会生成额外 *.class 文件的匿名类和内部类。您必须以某种方式将此信息输入您的构建系统,否则您将无法正确使用它......并且像“clean”或“variant dirs”(或两者结合)之类的特殊操作稍后可能会失败。如果你想在 make 中管理你的构建,你必须做同样的事情……通过编写一个程序来解析你的输入文件,然后为 make 输出 *.dep 文件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多