如何使用 bazel 从同一组输入文件生成多个文件

Cle*_*rer 4 bazel

我有一个简单的项目,它使用SWIG使一个小型 C++ 库可用于 C#。C++ 部分是单一源代码和单一头文件——此外还有一个 SWIG 接口文件。SWIG 的输出包含 5 个 C# 源文件和 1 个 C++ 源文件。

这样做make相当简单,但我在理解 bazel 时遇到了一些问题。

我如何告诉 bazel 这 6 个文件都是使用同一个命令生成的?另外,当我这样做时,我该如何告诉 bazel 实际调用该命令。

我最终感兴趣的最终产品是一个 .net dll 文件,它仅依赖于接口文件和原始 C++ 头文件。

Lás*_*zló 6

Bazel 没有从 C++ 生成 SWIG 的内置规则,但您可以使用通用规则 ( ) 或通过编写自己的规则genrule来教 Bazel 如何构建 SWIG 库。

如果您使用 a genrule,则可以在属性中指定所有预期输出outs。你的规则看起来像这样:

genrule(
    name = "cc_swig",
    srcs = [
        "lib.cc",
        "lib.h",
    ],
    outs = [
        "file1.cs",
        ...
        "fileN.cc",
    ],
    tools = [
        "//path/to/swig/compiler:bin",
    ],
    cmd = "$(location //path/to/swig/compiler:bin) --src=$(location lib.cc) --header=$(location lib.h) --out1=$(location file1.cs) ... --outN=$(location fileN.cc)",
)
Run Code Online (Sandbox Code Playgroud)

$(location)中的构造是cmd必需的占位符,Bazel 将其替换为引用文件的运行时路径。

(如果 SWIG 编译器不允许您指定将其输出放在何处,您可以向输出文件添加更多命令到其最终位置,例如cmd。)mvcmd = "... && mv outputs/lib.cs $(location file1.cs)"

编写自己的规则更为高级,因此我不会在这里进行描述,您可以在文档中阅读它们。

关于如何让 Bazel 构建库——如果 SWIG 编译规则是您的顶级目标的依赖项(即您“bazel 构建”的任何内容),那么 Bazel 将构建它。例如,请参阅入门指南,了解如何构建 C++ 项目