Bazel 包:如何将构建工件导出到具有外部依赖性的另一个目录?

Bazel Package: How to export build artifacts to another directory with external dependency?

我是 Bazel 的新手。我有一个用 Bazel 构建的项目。它还使用了一些第三方库,这些库也是从 bazel(来自源代码)构建的。

我现在正在尝试将我的项目作为独立库导出给其他人。我可以将我的项目编译为so并将相关的hpp文件复制到一个目录中。

但是我不知道如何处理第三方库。有没有一种奇特的方法可以做到这一点?或者有什么例子可以参考吗?

我的目标是:

  1. 编译项目为so文件。复制到特定目录。 (完成)
  2. 复制所有具有树结构的头文件。 (完成)。
  3. 将所有外部库也复制到特定目录中(需要帮助)
  4. 将外部库的头文件复制到相同的头目录中(需要帮助)

输出:

如果你控制了第三方库的BUILD文件,你可以单独暴露头文件,然后使用pkg_tar规则收集主项目中的目标文件。

例如,假设文件夹结构如下:

.
|-- project
|   |-- BUILD
|   |-- mylib
|   |   |-- BUILD
|   |   |-- mylib.cpp
|   |   `-- mylib.h
|   `-- WORKSPACE
`-- thirdparty
    |-- lib1
    |   |-- BUILD
    |   |-- lib1.cpp
    |   `-- lib1.h
    |-- lib2
    |   |-- BUILD
    |   |-- lib2.cpp
    |   `-- lib2.h
    `-- WORKSPACE

您的第三方库 BUILD 文件可能公开 filegroupcc_library:

# thirdparty/lib1/BUILD

filegroup(
    name = "headers",
    srcs = ["lib1.h"],
    visibility = ["//visibility:public"],
)

cc_library(
    name = "lib1",
    hdrs = [":headers"],
    srcs=["lib1.cpp"],
    visibility = ["//visibility:public"],
)

相同的模式将适用于 thirdparty/lib2/BUILDproject/mylib/BUILD

现在在主项目中,您可以有一个主 BUILD 脚本,它将所有文件收集到一个 tar 存档中:

# project/BUILD

load("@bazel_tools//tools/build_defs/pkg:pkg.bzl", "pkg_tar")

pkg_tar(
    name = "release_headers",
    srcs = [
        "//mylib:headers",
        "@thirdparty//lib1:headers",
        "@thirdparty//lib2:headers",
    ],
    package_dir = "include",
)

pkg_tar(
    name = "release_libs",
    srcs = [
        "//mylib",
        "@thirdparty//lib1",
        "@thirdparty//lib2",
    ],
    package_dir = "lib",
)

pkg_tar(
    name = "release",
    deps = [
        ":release_headers",
        ":release_libs",
    ],
)

构建 :release 应该创建具有所需结构的 tar 文件:

$> bazel build :release
...
Target //:release up-to-date:
  bazel-bin/release.tar
...
$> tar -tf bazel-bin/release.tar
./
./include/
./include/mylib.h
./include/lib1.h
./include/lib2.h
./lib/
./lib/libmylib.a
./lib/libmylib.so
./lib/liblib1.a
./lib/liblib1.so
./lib/liblib2.a
./lib/liblib2.so

您还可以在第三方工作区中为第三方库设置 pkg_tar 规则,以实现更好的模块化。