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



我是巴泽尔的新手。我有一个项目是和巴泽尔一起建造的。它还使用了一些第三方库,这些库也是从bazel(从源代码(构建的。

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

但我不知道如何与第三方图书馆打交道。有什么奇特的方法吗?或者有什么我可以参考的例子吗?

我的目标是:

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

输出:

  • include/

    • my_library_name/
    • 第三方名称1/
    • 第三方名称2/
  • 库/

    • libmy_library.so
    • libthird_party_name1.so
    • libthird_party_name2.so

如果您可以控制第三方库的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规则,以实现更好的模块化。

最新更新