我是巴泽尔的新手。我有一个项目是和巴泽尔一起建造的。它还使用了一些第三方库,这些库也是从bazel(从源代码(构建的。
我现在正试图将我的项目作为一个独立的库导出给其他人。我可以将我的项目编译为so,并将相关的hpp文件复制到一个目录中。
但我不知道如何与第三方图书馆打交道。有什么奇特的方法吗?或者有什么我可以参考的例子吗?
我的目标是:
- 将项目编译为so文件。复制到特定目录。(已完成(
- 复制所有具有树形结构的头文件。(已完成(
- 将所有外部库也复制到specfic目录中(需要帮助(
- 将外部库的头文件复制到同一个头目录中(需要帮助(
输出:
-
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文件可能会公开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
规则,以实现更好的模块化。