代码之家  ›  专栏  ›  技术社区  ›  Benoît photo_tom

在C++项目中使用特定于域的语言文件

  •  1
  • Benoît photo_tom  · 技术社区  · 15 年前

    我正在用自己的图形编辑器开发DSL。这样的文件有自己的扩展名。我还有一个将.own文件编译成.h文件的小工具。

    x.own-->x.h和x/*.h

    我编写了一个简单的.rules文件来启动生成。

    我的问题是 : 我的大多数源文件都包含x.h,但是x.own中的更改并不意味着生成的x.h(或任何其他生成的文件)将不同。这是由生成器通过使用临时文件和文件比较来处理的。但Visual Studio似乎不知道如何处理所有这些问题。如果我将“output file(s)”属性设置为正确的文件,它总是假定它们将被更改。如果我不这样做,它会生成它的构建过程,假设它们不会!

    我怎样才能把事情做好?

    1)启动自定义生成工具

    2)基于依赖关系计算构建过程

    2 回复  |  直到 15 年前
        1
  •  1
  •   jheriko    15 年前

    不要使用自定义生成工具选项,而是将其设置为解决方案的预生成事件(这可能需要一个常规命令行,就像自定义生成工具一样)。这样,MSV就不会检查生成的文件。只要它们包含在解决方案资源管理器中或列在解决方案资源管理器中,它们就应该编译得很好,因为.h文件的生成将先于任何其他编译。

    我发现定制的构建工具并不像一般的构建前和构建后事件那样有用,因为它期望生成或修改文件的方式。您可能会发现此工具对将来的其他事情很有用(例如,在生成后压缩.exe、正确生成其他依赖项、确保文件到位等)。

    有一个很好的图表显示了在解决方案属性中找到这些选项的位置 here

        2
  •  0
  •   Benoît photo_tom    15 年前

    jheriko的答案很有趣,因为它提供了一种启动自定义工具,然后生成构建依赖项的方法。但是它不是很有用,因为这样您就失去了使用“定制构建工具”工具箱的所有可能性,在该工具箱中您可以

    • 选择始终编译具有精确扩展名的文件
    • 手动跳过特定项目配置中特定文件的自定义生成(并可视化此决定)

    没有办法(至少我找不到)去“拥有一切”。我找到的唯一方法是让自定义生成工具在更新文件时返回一个非零的数字,并向用户发送一条消息,说明它是 一个错误,邀请他重新启动生成。下一次,自定义构建工具再次启动(不是最佳的,但我使用的工具非常快),但没有修改新文件,构建过程继续,使用有效的依赖项。

    注意:上面描述的方法不适用于incredibuild,它似乎忽略了项目构建顺序。