如何指定重要的元数据来驱动 shake 构建系统?

How to specify non-trivial metadata to drive a shake build system?

给定一个非同质结构的混合语言代码库,指定元数据以驱动 Shake 构建系统的推荐方法是什么?

特别是,元数据应描述源语言(C++、C#、Fortran)、源文件、结果类型(static/dynamic lib、可执行文件)、编译器开关(每个工件可能不同)等。

元数据最好结构简单,每个工件存储在一个单独的文件中。

是否有一种聪明的方法来概括 Defining your own build system with Shake 中建议的方法?

演示文稿中的方法适用范围很广 - 我已将其用于大型多语言项目。除了谈话之外,我还使用了三个调整:

添加文件扩展名

通常,文件扩展名会为您提供源语言和结果类型。例如:

mycsharp.dll = foo.cs bar.cs
myfortran.exe = main.f90 util.f90
docs.pdf = docs.tex references.bib

现在您可以使用完全不同的规则来解释 Fortran 可执行文件、C# 可执行文件(或 dll)和 PDF 文档。

添加一些 'leading' 个字符

通常您需要有关标志的数据或其他命令行相关数据。例如:

mycsharp.dll = foo.cs bar.cs -define:DEBUG -optimize +mono

我倾向于使用特殊的前导字符。在上面的示例中,我使用 - 表示标志(通常逐字传递),并使用 + 表示从包含有用的特殊情况的枚举中选择(例如使用 mono compiler).

请注意,不要使用太多奇怪的前导特殊字符,否则您最终会发明自己的语言 - 保持简单。

使用 C 预处理器 (CPP)

C预处理器为您提供#include#define#ifdef,所有这些都可以用于更复杂的结构化元数据。您可以通过首先在元数据文件上调用 cpphs 将其与 Shake 一起使用。

虽然之前的两个调整是推荐的,但 CPP 的使用最初是为了 #include。现在内置的 Shake 元数据有一个包含机制,我不确定我是否愿意使用 CPP,它使事情变得更简单。