intellij/internal/intellij_toolchain/intellij_toolchain.bzl (70 lines of code) (raw):
load(":plugins_directory.bzl", "plugins_directory")
load("//intellij/internal:utils.bzl", "label_utils")
Intellij = provider(
doc = "Information about intellij",
fields = {
"id": "Intellij Id",
"binary": "Intellij binary",
"binary_path": "Intellij binary path",
"plugins": "Plugins",
"home_directory": "Intellij home directory",
"plugins_directory": "Plugins Directory",
"files": "Runfiles for intellij",
}
)
def _intellij_toolchain_impl(ctx):
toolchain_info = platform_common.ToolchainInfo(
intellij = Intellij(
id = ctx.attr.id,
binary = ctx.attr.binary,
binary_path = label_utils.directory_with_name(ctx.attr.binary.label),
plugins = ctx.files.plugins,
home_directory = label_utils.directory(ctx.attr.binary.label),
plugins_directory = label_utils.directory_with_name(ctx.attr.plugins.label),
files = ctx.files.files,
),
)
return [toolchain_info]
_intellij_toolchain = rule(
implementation = _intellij_toolchain_impl,
attrs = {
"id": attr.string(
doc = "Some unique Intellij Id",
mandatory = True,
),
"binary": attr.label(
doc = "Intellij binary",
),
"plugins": attr.label(
doc = "Plugins files",
allow_files = True,
),
"files": attr.label_list(
doc = "Runfiles for intellij",
allow_files = True,
),
},
provides = [ platform_common.ToolchainInfo ],
)
def intellij_toolchain(name, intellij_repo, plugins = {}):
reverse_plugins = {}
for pname, archive in plugins.items():
reverse_plugins[archive] = pname
if "indexing" not in plugins:
reverse_plugins["@%s//indexing" % intellij_repo] = "indexing"
plugins_directory(
name = "%s_plugins" % name,
plugins = reverse_plugins,
)
_intellij_toolchain(
name = name,
id = intellij_repo,
binary = "@%s//:binary" % intellij_repo,
plugins = ":%s_plugins" % name,
files = [
"@%s//:runfiles" % intellij_repo,
"@%s//lib:runfiles" % intellij_repo,
"@%s//plugins:runfiles" % intellij_repo,
],
visibility = ["//visibility:public"],
)