| # |
| # Licensed to the Apache Software Foundation (ASF) under one |
| # or more contributor license agreements. See the NOTICE file |
| # distributed with this work for additional information |
| # regarding copyright ownership. The ASF licenses this file |
| # to you under the Apache License, Version 2.0 (the |
| # "License"); you may not use this file except in compliance |
| # with the License. You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, |
| # software distributed under the License is distributed on an |
| # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| # KIND, either express or implied. See the License for the |
| # specific language governing permissions and limitations |
| # under the License. |
| # |
| |
| load(":version.bzl", "VERSION") |
| |
| def _impl(ctx): |
| bnd_file = ctx.new_file(ctx.configuration.bin_dir, "bnd_file") |
| instructions = { |
| "Bundle-Version": VERSION, |
| "Bundle-SymbolicName": ctx.attr.symbolic_name, |
| "Private-Package": ",".join(ctx.attr.private_packages), |
| "Export-Package": ",".join(ctx.attr.export_packages), |
| "Import-Package": ",".join(ctx.attr.import_packages), |
| "-removeheaders": "Bnd-LastModified,Build-Jdk,Built-By,Private-Package,Include-Resource", |
| "-nodefaultversion": "true", |
| "-consumer-policy": "", |
| "Include-Resource": "@%s!/**" % ctx.files.resource_jar[0].path.split("/")[-1], |
| } |
| if ctx.attr.activator: |
| instructions["Bundle-Activator"] = ctx.attr.activator |
| if ctx.attr.activation_policy: |
| instructions["Bundle-ActivationPolicy"] = ctx.attr.activation_policy |
| ctx.file_action( |
| output = bnd_file, |
| content = "\n".join(["%s: %s" % e for e in instructions.items()])) |
| bundle_jar = ctx.outputs.bundle_jar |
| dep_jars = list(java_common.merge([dep[java_common.provider] for dep in ctx.attr.deps]).transitive_runtime_jars) |
| args = ["buildx", "-f", "-o", bundle_jar.path.split("/")[-1]] |
| for f in dep_jars: |
| args.extend(["-c", f.path]) |
| args.append(bnd_file.path) |
| ctx.action( |
| inputs=dep_jars + ctx.files.resource_jar + [bnd_file], |
| outputs=[bundle_jar], |
| arguments=args, |
| progress_message="Building bundle %s" % bundle_jar.short_path, |
| executable=ctx.executable._bnd) |
| |
| _bundle = rule( |
| implementation = _impl, |
| attrs = { |
| "deps": attr.label_list( |
| allow_files=False, |
| ), |
| "resource_jar": attr.label(allow_files=False), |
| "symbolic_name": attr.string(mandatory=True), |
| "private_packages": attr.string_list(), |
| "export_packages": attr.string_list(), |
| "import_packages": attr.string_list(), |
| "activator": attr.string(), |
| "activation_policy": attr.string(), |
| "_bnd": attr.label( |
| default=Label("//buildutils:bnd"), |
| allow_files=True, |
| executable=True, |
| cfg="host", |
| ), |
| }, |
| outputs = { |
| "bundle_jar": "%{name}.jar", |
| }, |
| ) |
| |
| def bundle(name, resources=[], **kwargs): |
| native.java_library( |
| name = "%s_resources" % name, |
| resources = resources, |
| ) |
| _bundle( |
| name = name, |
| resource_jar = ":%s_resources" % name, |
| **kwargs) |