Gazelle now handles imports from `@bazel_tools` (#273)

`@bazel_tools` is tricky since it is effectively a part of the standard
library that can not have a `bzl_library` attached to it. As a simple
fix for this, `bzl_library` can have a srcs dependency on it so that it
includes the transitive closure of all of its dependencies.

`@bazel_tools` imports are rewritten into the `srcs` attribute since
they are `exports_files`ed from the @bazel_tools.

Co-authored-by: c-parsons <cparsons@google.com>
This commit is contained in:
Andrew Z Allen 2020-10-19 10:49:17 -06:00 committed by GitHub
parent a81c2c0efe
commit b2ffc94b17
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 56 additions and 14 deletions

View File

@ -161,26 +161,37 @@ func (*bzlLibraryLang) Resolve(c *config.Config, ix *resolve.RuleIndex, rc *repo
// the index only contains absolute labels, not relative
impLabel = impLabel.Abs(from.Repo, from.Pkg)
if impLabel.Repo == "bazel_tools" {
// The @bazel_tools repo is tricky because it is a part of the "shipped
// with bazel" core library for interacting with the outside world.
// This means that it can not depend on skylib. Fortunately there is a
// fairly simple workaround for this, which is that you can add those
// bzl files as `deps` entries.
deps = append(deps, imp)
continue
}
if impLabel.Repo != "" || !c.IndexLibraries {
// This is a dependency that is external to the current repo, or indexing
// is disabled so take a guess at what hte target name should be.
deps = append(deps, strings.TrimSuffix(imp, fileType))
} else {
res := resolve.ImportSpec{
Lang: languageName,
Imp: impLabel.String(),
}
matches := ix.FindRulesByImport(res, languageName)
continue
}
if len(matches) == 0 {
log.Printf("%s: %q (%s) was not found in dependency index. Skipping. This may result in an incomplete deps section and require manual BUILD file intervention.\n", from.String(), imp, impLabel.String())
}
res := resolve.ImportSpec{
Lang: languageName,
Imp: impLabel.String(),
}
matches := ix.FindRulesByImport(res, languageName)
for _, m := range matches {
depLabel := m.Label
depLabel = depLabel.Rel(from.Repo, from.Pkg)
deps = append(deps, depLabel.String())
}
if len(matches) == 0 {
log.Printf("%s: %q (%s) was not found in dependency index. Skipping. This may result in an incomplete deps section and require manual BUILD file intervention.\n", from.String(), imp, impLabel.String())
}
for _, m := range matches {
depLabel := m.Label
depLabel = depLabel.Rel(from.Repo, from.Pkg)
deps = append(deps, depLabel.String())
}
}

View File

@ -0,0 +1,6 @@
# Some comment to be preserved
filegroup(
name = "allfiles",
srcs = glob(["**"]),
)

View File

@ -0,0 +1,15 @@
load("@bazel_skylib//:bzl_library.bzl", "bzl_library")
# Some comment to be preserved
filegroup(
name = "allfiles",
srcs = glob(["**"]),
)
bzl_library(
name = "foo",
srcs = ["foo.bzl"],
visibility = ["//visibility:public"],
deps = ["@bazel_tools//tools/build_defs/repo:http.bzl"],
)

View File

View File

@ -0,0 +1,10 @@
"""
Doc string
"""
load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
def wrapped_http_archive(**kwargs):
http_archive(
**kwargs
)