1

我正在开发一个 C++ 项目,我需要 Numpy 之类的 C++ 中的数组和功能。我找到了一些替代品,例如xtensorNumCpp等。这些是仅标头库。问题是我第一次尝试使用 Bazel,所以我不知道如何将仅标头库添加到 Bazel 工作区。关于 Bazel 的其他问题,有一些建议,例如 genrule-environment、rules-foreign-cc。我已将 http_archive 添加到 WORKSPACE 文件,但我不确定要在 BUILD 文件中添加什么。

工作区文件

load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")

all_content = """filegroup(name = "all", srcs = glob(["**"]), visibility = ["//visibility:public"])"""

http_archive(
    name = "xtensor",
    build_file_content = all_content,
    strip_prefix = "xtensor-master",
    urls = ["https://github.com/xtensor-stack/xtensor/archive/refs/heads/master.zip"],
)

http_archive(
    name = "NumCpp",
    build_file_content = all_content,
    strip_prefix = "NumCpp-master",
    urls = ["https://github.com/dpilger26/NumCpp/archive/refs/heads/master.zip"],
)

http_archive(
    name = "rules_foreign_cc",
    sha256 = "c2cdcf55ffaf49366725639e45dedd449b8c3fe22b54e31625eb80ce3a240f1e",
    strip_prefix = "rules_foreign_cc-0.1.0",
    url = "https://github.com/bazelbuild/rules_foreign_cc/archive/0.1.0.zip",
)

load("@rules_foreign_cc//:workspace_definitions.bzl", "rules_foreign_cc_dependencies")

rules_foreign_cc_dependencies()

我试图遵循文档,但每次都失败了。一些帮助将不胜感激。

4

1 回答 1

2

对于诸如仅标头库之类的简单事物,我会自己编写 BUILD 文件,而不使用 rules_foreign_cc。只写一个cc_library没有srcs。像这样的东西:

http_archive(
    name = "xtensor",
    build_file_content = all_content,
    strip_prefix = "xtensor-master",
    urls = ["https://github.com/xtensor-stack/xtensor/archive/refs/heads/master.zip"],
    build_file_content = """
cc_library(
    name = "xtensor",
    visibility = ["//visibility:public"],
    hdrs = glob(["xtensor/*.hpp"]),
    defines = [
        "XTENSOR_ENABLE_ASSERT",
    ],
    deps = [
        "@tbb",
    ],
)
""",
)

@xtensor将是您的 Bazel 存储库。将build_file_content用于在其中创建BUILD.bazel文件。这意味着您的代码可以通过 依赖于它@xtensor//:xtensor,可以将其缩短为@xtensor. 你也可以把它放在一个单独的文件中(比如build/BUILD.xtensor.bazel),然后使用build_file = "@build//:BUILD.xtensor.bazel"而不是把它内联在WORKSPACEvia中build_file_content

如果你设置了 rules_foreign_cc ,它会生成一些等价的东西,但这对我来说似乎比自己编写要麻烦得多。我设置definesdeps基于对 CMakeLists.txt 的扫描,您需要根据您想要的配置方式进行自定义。

我看到 CMakeLists 做的另一件事(除了查找依赖项和设置一些-D标志,如上所示)是生成一个包含所有其他文件的单个文件。如果你想这样做,我会做这样的事情(在 BUILD 文件中@xtensor):

genrule(
    name = "gen_single_include",
    outs = ["xtensor.hpp"],
    cmd = "\n".join([
        "cat > $@ <<'END'",
        "#ifndef XTENSOR",
        "#define XTENSOR",
    ] + ["#include \"%s\"" % h[len("xtensor/"):]
         for h in glob(["xtensor/*.hpp"])
         if h not in [
             "xtensor/xexpression_holder.hpp",
             "xtensor/xjson.hpp",
             "xtensor/xmime.hpp",
             "xtensor/xnpy.hpp",
          ]] + [
        "#endif",
        "END",
    ]),

我可能在这里没有得到完美的一切,但我的想法是构建文件,cat用于将标准输入复制到它,一个 bash here 文档来提供内容,以及 Python 样式的列表推导来实际构建内容。

于 2022-02-07T19:50:42.680 回答