blob: 1516033aea784eb4600bc989acd2fe399a5bb903 [file] [log] [blame]
#
# 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)