给定非同质结构的混合语言代码库,指定元数据以驱动 Shake 构建系统的推荐方法是什么?
特别是,元数据应该描述源语言(C++、C#、Fortran)、源文件、结果类型(静态/动态库、可执行文件)、编译器开关(每个工件可能不同)等。
优选地,元数据应该被简单地结构化并存储在每个工件的一个单独的文件中。
有没有一种聪明的方法来概括使用 Shake 定义自己的构建系统中建议的方法?
给定非同质结构的混合语言代码库,指定元数据以驱动 Shake 构建系统的推荐方法是什么?
特别是,元数据应该描述源语言(C++、C#、Fortran)、源文件、结果类型(静态/动态库、可执行文件)、编译器开关(每个工件可能不同)等。
优选地,元数据应该被简单地结构化并存储在每个工件的一个单独的文件中。
有没有一种聪明的方法来概括使用 Shake 定义自己的构建系统中建议的方法?
演示文稿中的方法规模相当大——我已经将它用于大型多语言项目。除了演讲之外,我还使用了三个调整:
通常,文件扩展名会为您提供源语言和结果类型。例如:
mycsharp.dll = foo.cs bar.cs
myfortran.exe = main.f90 util.f90
docs.pdf = docs.tex references.bib
现在,您可以使用完全不同的规则来解释 Fortran 可执行文件、C# 可执行文件(或 dll)和 PDF 文档。
通常,您需要有关标志的数据或其他命令行相关数据。例如:
mycsharp.dll = foo.cs bar.cs -define:DEBUG -optimize +mono
我倾向于使用特殊的前导字符。在上面的例子中,我用来-
表示标志(通常逐字传递),并+
表示从包含有用特殊情况的枚举中进行的选择(例如,使用单声道编译器)。
提醒一句,不要使用太多奇怪的前导特殊字符,否则您最终会发明自己的语言 - 保持简单。
C 预处理器为您提供#include
,#define
和#ifdef
, 所有这些都可以用于更复杂的结构化元数据。您可以通过cpphs
首先调用元数据文件将其与 Shake 一起使用。
虽然建议使用前两个调整,但 CPP 的使用最初是用于#include
. 现在内置的 Shake 元数据有一个包含机制,我不确定我是否会打扰 CPP,这让事情变得更简单。