如何指定重要的元数据来驱动 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,它使事情变得更简单。
给定一个非同质结构的混合语言代码库,指定元数据以驱动 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,它使事情变得更简单。