Bazel 包:如何将构建工件导出到具有外部依赖性的另一个目录?
Bazel Package: How to export build artifacts to another directory with external dependency?
我是 Bazel 的新手。我有一个用 Bazel 构建的项目。它还使用了一些第三方库,这些库也是从 bazel(来自源代码)构建的。
我现在正在尝试将我的项目作为独立库导出给其他人。我可以将我的项目编译为so并将相关的hpp文件复制到一个目录中。
但是我不知道如何处理第三方库。有没有一种奇特的方法可以做到这一点?或者有什么例子可以参考吗?
我的目标是:
- 编译项目为so文件。复制到特定目录。 (完成)
- 复制所有具有树结构的头文件。 (完成)。
- 将所有外部库也复制到特定目录中(需要帮助)
- 将外部库的头文件复制到相同的头目录中(需要帮助)
输出:
包括/
- my_library_name/
- third_party_name1/
- third_party_name2/
图书馆/
- 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 文件可能公开 filegroup
和 cc_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/BUILD
和 project/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
规则,以实现更好的模块化。
我是 Bazel 的新手。我有一个用 Bazel 构建的项目。它还使用了一些第三方库,这些库也是从 bazel(来自源代码)构建的。
我现在正在尝试将我的项目作为独立库导出给其他人。我可以将我的项目编译为so并将相关的hpp文件复制到一个目录中。
但是我不知道如何处理第三方库。有没有一种奇特的方法可以做到这一点?或者有什么例子可以参考吗?
我的目标是:
- 编译项目为so文件。复制到特定目录。 (完成)
- 复制所有具有树结构的头文件。 (完成)。
- 将所有外部库也复制到特定目录中(需要帮助)
- 将外部库的头文件复制到相同的头目录中(需要帮助)
输出:
包括/
- my_library_name/
- third_party_name1/
- third_party_name2/
图书馆/
- 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 文件可能公开 filegroup
和 cc_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/BUILD
和 project/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
规则,以实现更好的模块化。