构建 nlohmann/json 作为 bazel 库会出现 'nothing to build' 错误
Building nlohmann/json as a bazel library gives 'nothing to build' error
我有一个非常简单的 bazel 项目,我试图在其中添加 https://github.com/nlohmann/json 作为依赖项。为此,我在本地克隆了 json
存储库,并在存储库的根目录中添加了一个 BUILD
文件,以生成一个包含单个包含 json.hpp
文件的 cc_library
。但是当我构建它时,它总是抱怨没有任何东西可以构建。
├── json
│ ├── BUILD
│ ├── // all files under nlohmann/json repo.
├── myproject
│ ├── BUILD
│ └── Main.cpp
└── WORKSPACE
json/BUILD:
cc_library(
name = "json",
hdrs = ["single_include/nlohmann/json.hpp"],
includes = ["json"],
visibility = ["//visibility:public"],
)
以上构建成功,但没有生成库。注意输出中的“(nothing to build)”消息。
bazel build :json
INFO: Analyzed target //json:json (0 packages loaded, 0 targets configured).
INFO: Found 1 target...
Target //json:json up-to-date (nothing to build)
INFO: Elapsed time: 0.065s, Critical Path: 0.00s
INFO: 1 process: 1 internal.
INFO: Build completed successfully, 1 total action
myproject/Main.cpp:
#include <single_include/nlohmann/json.hpp>
int main() {
...
}
myproject/BUILD:
cc_binary(
name = "main",
srcs = ["Main.cpp"],
deps = [ "//json:json"]
)
myproject
构建错误:
myproject/Main.cpp:1:44: fatal error: single_include/nlohmann/json.hpp: No such file or directory
compilation terminated.
知道我在这里遗漏了什么吗?我的目标是在我的 bazel 项目 myproject
.
中使用 json
存储库作为依赖项
问题是 cc_library
没有 DefaultInfo.files
,所以当你在命令行上指定它的目标时,Bazel 不知道要构建什么东西。尝试 bazel build :main
构建您的二进制文件。
此外,cc_library
本身确实有output groups。尝试类似 bazel build :json --output_groups=dynamic_library
的方法来获取构建其源文件的库。
请注意,一般来说,您应该为构建的任何输出创建一个 cc_binary
。即使你想要一个共享对象,创建一个名称以 .so
结尾的 cc_binary
而不是单独使用 cc_library
。 dynamic_library
输出不处理传递依赖项(尽管我猜这对于这个库来说并不重要,它无论如何都没有依赖项)。
最好使用 http_repository
/git_repository
机制来获取外部依赖项,因为它们不会混淆 repo 的历史,它们更容易更新,甚至不会被获取,如果您不构建任何东西,这取决于它。
# /WORKSPACE file
http_archive(
name = "com_github_nlohmann_json",
build_file = "//third_party:json.BUILD", # see below
sha256 = "4cf0df69731494668bdd6460ed8cb269b68de9c19ad8c27abc24cd72605b2d5b",
strip_prefix = "json-3.9.1",
urls = ["https://github.com/nlohmann/json/archive/v3.9.1.tar.gz"],
)
# /third_party/json.BUILD file
package(default_visibility = ["//visibility:public"])
load("@rules_cc//cc:defs.bzl", "cc_library")
licenses(["notice"]) # MIT license
cc_library(
name = "json",
hdrs = ["single_include/nlohmann/json.hpp"],
strip_include_prefix = "single_include/",
)
然后:
cc_binary(
name = "main",
srcs = ["Main.cpp"],
deps = [ "@com_github_nlohmann_json//:json"]
)
// Main.cpp file
#include "nlohmann/json.hpp"
我有一个非常简单的 bazel 项目,我试图在其中添加 https://github.com/nlohmann/json 作为依赖项。为此,我在本地克隆了 json
存储库,并在存储库的根目录中添加了一个 BUILD
文件,以生成一个包含单个包含 json.hpp
文件的 cc_library
。但是当我构建它时,它总是抱怨没有任何东西可以构建。
├── json
│ ├── BUILD
│ ├── // all files under nlohmann/json repo.
├── myproject
│ ├── BUILD
│ └── Main.cpp
└── WORKSPACE
json/BUILD:
cc_library(
name = "json",
hdrs = ["single_include/nlohmann/json.hpp"],
includes = ["json"],
visibility = ["//visibility:public"],
)
以上构建成功,但没有生成库。注意输出中的“(nothing to build)”消息。
bazel build :json
INFO: Analyzed target //json:json (0 packages loaded, 0 targets configured).
INFO: Found 1 target...
Target //json:json up-to-date (nothing to build)
INFO: Elapsed time: 0.065s, Critical Path: 0.00s
INFO: 1 process: 1 internal.
INFO: Build completed successfully, 1 total action
myproject/Main.cpp:
#include <single_include/nlohmann/json.hpp>
int main() {
...
}
myproject/BUILD:
cc_binary(
name = "main",
srcs = ["Main.cpp"],
deps = [ "//json:json"]
)
myproject
构建错误:
myproject/Main.cpp:1:44: fatal error: single_include/nlohmann/json.hpp: No such file or directory
compilation terminated.
知道我在这里遗漏了什么吗?我的目标是在我的 bazel 项目 myproject
.
json
存储库作为依赖项
问题是 cc_library
没有 DefaultInfo.files
,所以当你在命令行上指定它的目标时,Bazel 不知道要构建什么东西。尝试 bazel build :main
构建您的二进制文件。
此外,cc_library
本身确实有output groups。尝试类似 bazel build :json --output_groups=dynamic_library
的方法来获取构建其源文件的库。
请注意,一般来说,您应该为构建的任何输出创建一个 cc_binary
。即使你想要一个共享对象,创建一个名称以 .so
结尾的 cc_binary
而不是单独使用 cc_library
。 dynamic_library
输出不处理传递依赖项(尽管我猜这对于这个库来说并不重要,它无论如何都没有依赖项)。
最好使用 http_repository
/git_repository
机制来获取外部依赖项,因为它们不会混淆 repo 的历史,它们更容易更新,甚至不会被获取,如果您不构建任何东西,这取决于它。
# /WORKSPACE file
http_archive(
name = "com_github_nlohmann_json",
build_file = "//third_party:json.BUILD", # see below
sha256 = "4cf0df69731494668bdd6460ed8cb269b68de9c19ad8c27abc24cd72605b2d5b",
strip_prefix = "json-3.9.1",
urls = ["https://github.com/nlohmann/json/archive/v3.9.1.tar.gz"],
)
# /third_party/json.BUILD file
package(default_visibility = ["//visibility:public"])
load("@rules_cc//cc:defs.bzl", "cc_library")
licenses(["notice"]) # MIT license
cc_library(
name = "json",
hdrs = ["single_include/nlohmann/json.hpp"],
strip_include_prefix = "single_include/",
)
然后:
cc_binary(
name = "main",
srcs = ["Main.cpp"],
deps = [ "@com_github_nlohmann_json//:json"]
)
// Main.cpp file
#include "nlohmann/json.hpp"