当在 Bazel 中可以利用相同的规则和源文件生成相同的输出文件时,可能会发生同一目标的重复构建。解决该问题的方法是使用 bazel query 命令,并在规则中指定生成的输出文件。比如:
cc_library(
name = "mylib",
srcs = ["mylib.cc"],
hdrs = ["mylib.h"],
deps = [":mydep"],
)
cc_binary(
name = "mybin",
srcs = ["mybin.cc"],
deps = [":mylib"],
)
在这个例子中,构建 mybin 时会同时构建 mylib,因为 mylib 是 mybin 的依赖项。如果同时构建其它需要 mylib 的目标,比如 mytest,也会再次构建 mylib。为了避免重复构建,可以利用 bazel query 命令打印出需要生成的输出文件,然后在依赖规则中使用 outputs 和 out 参数。比如:
output_files("libmylib.a")
cc_library(
name = "mylib",
srcs = ["mylib.cc"],
hdrs = ["mylib.h"],
deps = [":mydep"],
outputs = ["libmylib.a"],
)
cc_binary(
name = "mybin",
srcs = ["mybin.cc"],
deps = [":mylib"],
out = "mybin",
)
在这个例子中,mylib 的输出文件名是 libmylib.a,而 mybin 的输出文件名是 mybin。通过使用 outputs 和 out 参数,Bazel 将只构建需要的输出文件,从而避免了重复构建。