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

时间:2018-01-22 13:58:49

标签: bazel

我有一个简单的项目,使用SWIG为C#提供一个小的C ++库。 C ++部分是单个源和单个头文件 - 此外还有一个SWIG接口文件。 SWIG的输出由5个C#源文件和1个C ++源文件组成。

使用make执行此操作非常简单,但我在围绕bazel时遇到了一些问题。

如何告诉bazel使用相同的命令生成的这6个文件 all ?而且,当我在它的时候,我怎么做我告诉bazel实际上调用那个命令。

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

1 个答案:

答案 0 :(得分:3)

Bazel没有内置规则从C ++生成SWIG,但您可以使用通用规则(genrule)或者教Bazel如何通过{{构建SWIG库3}}

如果您使用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)",
)

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

(如果SWIG编译器不允许您指定放置输出的位置,则可以向cmd添加更多命令mv输出文件到最终位置,例如{{} 1}}。)

编写自己的规则更为先进,所以我不会在这里描述,你可以阅读它们writing your own rule

关于如何让Bazel构建库 - 如果SWIG编译规则是您的顶级目标的依赖(即无论你是什么" bazel build"),那么Bazel将构建它。请参阅示例in the docs