| load("//java/private:common.bzl", "has_maven_deps") |
| load("//java/private:dist_info.bzl", "DistZipInfo", "dist_aspect", "separate_first_and_third_party") |
| |
| def _java_dist_zip_impl(ctx): |
| files = [] |
| for file in ctx.files.files: |
| files.append("%s=%s" % (file.basename, file.path)) |
| |
| infos = [d[DistZipInfo] for d in ctx.attr.deps] |
| combined = depset(transitive = [i.dist_infos for i in infos]).to_list() |
| |
| inputs = depset( |
| ctx.files.files, |
| transitive = [i.binary_jars for i in combined] + [i.source_jars for i in combined], |
| ) |
| |
| (first, third) = separate_first_and_third_party(ctx.attr.third_party_prefixes, infos) |
| |
| first_party = [] |
| third_party = [] |
| |
| for info in first: |
| [first_party.append("%s.jar=%s" % (info.name, fp.path)) for fp in info.binary_jars.to_list()] |
| [first_party.append("%s-sources.jar=%s" % (info.name, fp.path)) for fp in info.source_jars.to_list()] |
| |
| for info in third: |
| [third_party.append("lib/%s.jar=%s" % (info.name, tp.path)) for tp in info.binary_jars.to_list()] |
| |
| out = ctx.actions.declare_file("%s.zip" % ctx.attr.name) |
| args = ctx.actions.args() |
| args.add_all(["c", out]) |
| args.add_all(sorted(files)) |
| args.add_all(sorted(first_party)) |
| args.add_all(sorted(third_party)) |
| |
| ctx.actions.run( |
| executable = ctx.executable._zip, |
| arguments = [args], |
| outputs = [out], |
| inputs = inputs, |
| ) |
| |
| return [ |
| DefaultInfo(files = depset([out])), |
| ] |
| |
| java_dist_zip = rule( |
| _java_dist_zip_impl, |
| attrs = { |
| "files": attr.label_list( |
| default = [], |
| allow_files = True, |
| ), |
| "deps": attr.label_list( |
| providers = [ |
| [DistZipInfo], |
| ], |
| aspects = [ |
| dist_aspect, |
| has_maven_deps, |
| ], |
| ), |
| "third_party_prefixes": attr.string_list(), |
| "_zip": attr.label( |
| default = "@bazel_tools//tools/zip:zipper", |
| executable = True, |
| cfg = "exec", |
| ), |
| }, |
| ) |