没有 srcs 的 Bazel cc_library 不会自行编译

Bazel cc_library with no srcs doesn't compile on its own

本文关键字:编译 library srcs Bazel cc 没有      更新时间:2023-10-16

我有一个cc_library,它只是头。每当我试图自己编译这样的库时,它实际上不会编译任何东西。我故意放一些错误,试图在编译时得到这样的错误,但巴泽尔实际上并没有编译任何东西。这里有一个小例子。

// test.h
This should not compile fdsafdsafdsa
int foo() { return 1; }
# BUILD
cc_library(
name = 'test',
hdrs = ['test.h']
)
// bazel build :test
INFO: Analyzed target //:test (2 packages loaded, 3 targets configured).
INFO: Found 1 target...
Target //:test up-to-date (nothing to build)
INFO: Elapsed time: 0.083s, Critical Path: 0.00s
INFO: 0 processes.
INFO: Build completed successfully, 1 total action

这种行为是故意的吗?

我也运行了同样的实验,但拆分了.h和.cc文件,在这种情况下,我在编译时出现了错误。

cc_library(其他规则也包括pkg_tar)不必具有任何源。这也是有效的:

cc_library(
name = "empty",
srcs = [],
)

它实际上也很有用。您可能具有可配置属性,如deps(或srcs),其中实际内容仅适用于特定条件:

cc_binary(
name = "mybinary",
srcs = ["main.c"],
deps = select({
":platform1": [":some_plat1_only_lib"],
":platform2": [":empty"],  # as defined in the above snippet
}),
)

或者(因为上面的[]可以很好地用于:platform2deps)如果你有一个更大的树,并且你希望开发人员只依赖于//somelib:somelib,你可以通过alias使用这个空库来给他们一个标签,而不必担心所有特定于平台的细节以及如何处理提供特定功能,其中:

# somelib/BUILD:
alias(
name = "somelib",
actual = select({
":platform1": [":some_plat1_only_lib"],
":platform2": [":empty"],  # as defined in the above snippet
}),
visibility = ["//visibility:public"],  # set appropriately
)

mybinary或任何其他目标现在都可以说:

cc_binary(
name = "mybinary",
srcs = ["main.c"],
deps = ["//somelib"],
)

当然,正如这里的另一个答案所说,有一些只有头的库。

还有你在问题中使用的例子。(无论是否为bazel)您通常不会(也不会很有用)单独编译头文件。您只会使用它的内容,然后在尝试构建标头为#included的源时才会看到编译器失败。也就是说,如果bazel build失败,另一个目标将不得不依赖于test#include "test.h"

一个只有头的库意味着您不需要构建任何东西。只需在程序中包含所需的标题并使用即可。