blob: 36dda2f6aee4bea5b965c4e91a5da13f8477670d [file] [log] [blame]
def _py_import_impl(ctx):
# Unpack the file somewhere, and present as a python library. We need to
# know all the files in the zip, and that's problematic. For now, we might
# be able to get away with just creating and declaring the directory.
root = ctx.actions.declare_directory("%s-pyroot" % ctx.attr.name)
args = ctx.actions.args()
if ctx.file.wheel.path.endswith(".zip") or ctx.file.wheel.path.endswith(".whl"):
args.add("x")
args.add(ctx.file.wheel.path)
args.add_all(["-d", root.path])
ctx.actions.run(
outputs = [root],
inputs = [ctx.file.wheel],
arguments = [args],
executable = ctx.executable._zip,
)
elif ctx.file.wheel.path.endswith(".tar.gz"):
args.add(ctx.file.wheel.path)
args.add(root.path)
ctx.actions.run(
outputs = [root],
inputs = [ctx.file.wheel],
arguments = [args],
executable = ctx.executable._untar,
)
else:
fail("Unrecognised file extension: %s" % ctx.attr.wheel)
runfiles = ctx.runfiles(files = [root])
for dep in ctx.attr.deps:
runfiles = runfiles.merge(dep[DefaultInfo].default_runfiles)
imports = depset(
items = [
"%s/%s/%s-pyroot" % (ctx.workspace_name, ctx.label.package, ctx.label.name),
],
transitive = [dep[PyInfo].imports for dep in ctx.attr.deps],
)
transitive_sources = depset(
items = [],
transitive = [dep[PyInfo].transitive_sources for dep in ctx.attr.deps],
)
py_srcs = ctx.attr.srcs_version
info = PyInfo(
imports = imports,
has_py2_only_sources = py_srcs == "PY2",
has_py3_only_sources = py_srcs == "PY3",
transitive_sources = transitive_sources,
uses_shared_libraries = not ctx.attr.zip_safe,
)
return [
DefaultInfo(
files = depset(items = [root]),
default_runfiles = runfiles,
),
info,
]
py_import = rule(
_py_import_impl,
attrs = {
"wheel": attr.label(
allow_single_file = True,
mandatory = True,
),
"zip_safe": attr.bool(
default = True,
),
"python_version": attr.string(
default = "PY3",
values = ["PY2", "PY3"],
),
"srcs_version": attr.string(
default = "PY2AND3",
values = ["PY2", "PY3", "PY2AND3"],
),
"deps": attr.label_list(
allow_empty = True,
providers = [PyInfo],
),
"_zip": attr.label(
allow_single_file = True,
cfg = "host",
default = "@bazel_tools//tools/zip:zipper",
executable = True,
),
"_untar": attr.label(
cfg = "exec",
default = "//py:untar",
executable = True,
),
},
)