繁体   English   中英

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

[英]How do I use bazel to produce multiple files from the same set of input files

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

使用make此操作非常简单,但是我在将头部缠绕在bazel上时遇到了一些问题。

我怎么能告诉巴泽勒,那些6个文件使用相同的命令产生的? 另外,在我处理过程中,我如何告诉bazel实际调用该命令。

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

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

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

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

(如果SWIG编译器不会让你指定把它的输出,你可以添加更多命令cmdmv的文件输出到它们的最终位置,例如cmd = "... && mv outputs/lib.cs $(location file1.cs)" 。)

编写自己的规则更为高级,因此在这里我将不进行描述,您可以在docs中了解它们。

关于如何使Bazel生成库的方法-如果SWIG编译规则是您的顶级目标的依赖项(即“ Bazel构建”的任何内容),则Bazel将对其进行构建。 例如请参阅入门指南,了解如何构建C ++项目

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM