我有一个简单的项目,它使用SWIG使一个小型 C++ 库可用于 C#。C++ 部分是单一源代码和单一头文件——此外还有一个 SWIG 接口文件。SWIG 的输出包含 5 个 C# 源文件和 1 个 C++ 源文件。
这样做make相当简单,但我在理解 bazel 时遇到了一些问题。
我如何告诉 bazel 这 6 个文件都是使用同一个命令生成的?另外,当我这样做时,我该如何告诉 bazel 实际调用该命令。
我最终感兴趣的最终产品是一个 .net dll 文件,它仅依赖于接口文件和原始 C++ 头文件。
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++ 项目。
| 归档时间: |
|
| 查看次数: |
5265 次 |
| 最近记录: |