Bazel的建议是在每个包目录中定义一个BUILD文件。对于嵌套包,也要在每个级别的目录中定义一个BUILD文件。下面是一个示例:
my_project/
├── external/
│ ├── zlib/
│ │ ├── zlib.h
│ │ ├── zlib.cc
│ │ └── BUILD
│ └── BUILD
├── src/
│ ├── util/
│ │ ├── util.h
│ │ ├── util.cc
│ │ └── BUILD
│ ├── tool/
│ │ ├── tool.h
│ │ ├── tool.cc
│ │ ├── tool_main.cc
│ │ └── BUILD
│ └── BUILD
├── test/
│ ├── util_test.cc
│ └── BUILD
├── BUILD
├── WORKSPACE
└── bazelrc
在这个示例中,顶层的BUILD文件包含整个项目的工程设置,WORKSPACE文件包含对外部依赖的引用和其他设置。每个BUILD文件定义了该目录中的源代码及其依赖项。
例如,util目录下的BUILD文件可以如下所示:
cc_library(
name = "util_lib",
srcs = ["util.cc"],
hdrs = ["util.h"],
includes = ["."],
visibility = ["//src:__subpackages__"],
deps = ["//external:zlib"],
)
这个BUILD文件定义了一个名为util_lib的库,它依赖于zlib库。该库的源代码为util.cc和util.h。hdrs参数指定头文件,includes参数指定该库的包含路径。
总体来说,Bazel的建议是在每个包目录中定义一个BUILD文件,并使用依赖项指定所有需要的库。在嵌套包的情况下,需要在每个级别上重复这个过程,以确保每个BUILD文件都定义了对应目录中的源代码及其依赖项。