0

我目前正在尝试将一些构建文件从 Bazel 0.19 更新到 Bazel 3.2.0

我有这个文件夹结构

Projectfolder/
    |-WORKSPACE
    |-third_party/
        |-openexr.BUILD

以前,我在 WORKSPACE 文件中定义了以下内容:

...

new_http_archive(
    name = "openexr",
    build_file = "third_party/openexr.BUILD",
    strip_prefix = "openexr-2.2.0",
    urls = ["https://github.com/openexr/openexr/archive/v2.2.0.zip"],
)
...

new_http_archive 和 http_archive 在 new bazel 中合并为一个,但我不确定现在正确的语法是什么。以下

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

http_archive(
    name = "openexr",
    build_file = "@//third_party:openexr.BUILD",
    strip_prefix = "openexr-2.2.0",
    urls = ["https://github.com/openexr/openexr/archive/v2.2.0.zip"],
)

给我以下错误:

Unable to load package for //third_party:openexr.BUILD: BUILD file not found in any of the following directories. Add a BUILD file to a directory to mark it as a package.

我为 build_file 尝试的其他语法是:

build_file = "third_party/openexr.BUILD",
build_file = "third_party:openexr.BUILD",
build_file = //third_party/openexr.BUILD",
build_file = //third_party:openexr.BUILD",

但他们都给了我一些错误。

与最新(3.2.0)Bazel 兼容的正确语法是什么?

//编辑:在 Windows 上执行此操作

4

2 回答 2

1

它与 bazel 如何指定和解析标签有关。

“@//third_party:openexr.BUILD”表示在目录third_party 中查找BUILD 文件,然后引用该目录中的openexr.BUILD 文件。

“@//:third_party/openexr.BUILD”表示在根目录中查找 WORKSPACE 文件旁边的 BUILD 文件,然后查找子目录 third_party(不包含 BUILD 文件),然后查找文件 openexr.BUILD。

因此,在third_party 目录中放置一个空的BUILD 文件是解决您问题的正确方法。

于 2020-06-10T14:11:08.300 回答
0

混淆有时源于这样一个事实,即 bazel 指的是包(而不是目录)方面的目标。这些结构是相关的,但并不完全相同。包是项目中的一个目录,其中包含一个BUILD文件。虽然可以根据其定义所在的目录来理解它,但并非每个目录都是一个包。因此,在一棵树中:

.
├── BUILD
├── WORKSPACE
└── third_party
    └── openexr.BUILD

的标签openexr.BUILD//:third_party/openexr.BUILD。即third_party/openexr.BUILD在根 ( //) 包中。

如果您将BUILD文件添加到third_party/目录,它会将其转换为(bazel)包并在此树中:

.
├── WORKSPACE
└── third_party
    ├── BUILD
    └── openexr.BUILD

同一个文件现在称为//third_party:openexr.BUILD.

于 2020-06-11T10:08:47.740 回答