48 lines
1.2 KiB
Python
48 lines
1.2 KiB
Python
"""Interop with Java."""
|
|
|
|
load("@bazel_skylib//lib:collections.bzl", "collections")
|
|
|
|
JavaInteropInfo = provider(
|
|
doc = "Information needed for interop with Java rules.",
|
|
fields = {
|
|
"inputs": "Files needed during build.",
|
|
"env": "Dict with env variables that should be set during build.",
|
|
},
|
|
)
|
|
|
|
def java_interop_info(ctx):
|
|
"""Gather information from any Java dependencies.
|
|
|
|
Args:
|
|
ctx: Rule context.
|
|
|
|
Returns:
|
|
JavaInteropInfo: Information needed for Java interop.
|
|
"""
|
|
|
|
inputs = depset(
|
|
transitive = [
|
|
# We only expose direct dependencies, though we could
|
|
# expose transitive ones as well. Only exposing the direct
|
|
# ones corresponds to Bazel's "strict Java dependencies"
|
|
# mode. See
|
|
# https://github.com/tweag/rules_haskell/issues/96.
|
|
dep[JavaInfo].compile_jars
|
|
for dep in ctx.attr.deps
|
|
if JavaInfo in dep
|
|
],
|
|
)
|
|
|
|
env_dict = dict()
|
|
uniq_classpath = collections.uniq([
|
|
f.path
|
|
for f in inputs
|
|
])
|
|
|
|
if len(uniq_classpath) > 0:
|
|
env_dict["CLASSPATH"] = ":".join(uniq_classpath)
|
|
|
|
return JavaInteropInfo(
|
|
inputs = inputs,
|
|
env = env_dict,
|
|
)
|