blob: c4909609cbbb29e4387aead64a21c5caa5ce383f [file] [log] [blame]
"""
Copyright 2018-present Open Networking Foundation
Licensed 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("//tools/build/bazel:generate_workspace.bzl", "COMPILE", "TEST")
load("//tools/build/bazel:variables.bzl", "ONOS_VERSION")
load("//tools/build/bazel:generate_test_rules.bzl", "generate_test_rules")
def _all_java_sources():
return native.glob(["src/main/java/**/*.java"])
def _all_java_test_sources():
return native.glob(["src/test/java/**/*.java"])
def _all_test_resources():
return native.glob(["src/test/resources/**"])
def _all_resources(resources_root):
if resources_root == None:
return native.glob(["src/main/resources/**"])
else:
return native.glob([resources_root + "**"])
def _webapp():
return native.glob(["src/main/webapp/**"])
# Implementation of the rule to call bnd to make an OSGI jar file
def _bnd_impl(ctx):
if (len(ctx.files.source) == 1):
input_file = ctx.files.source[0]
else:
# this is a list of inputs. The one we want is the last one
# in the list that isn't a source jar
for file in reversed(ctx.files.source):
if ("-src" in file.path):
continue
else:
input_file = file
break
jar = input_file.path
output = ctx.outputs.osgi_jar.path
name = ctx.attr.source.label.name
group = ctx.attr.package_name_root
version = ctx.attr.version
license = ""
import_packages = ctx.attr.import_packages
exportPackages = "*"
includeResources = ""
web_context = ctx.attr.web_context
if web_context == None or web_context == "":
web_context = "NONE"
web_xml = ctx.attr.web_xml
dynamicimportPackages = ""
cp = ""
inputDependencies = [input_file]
# determine the dependencies and build the class path
for dep in ctx.attr.deps:
if java_common.provider in dep:
file = dep.files.to_list()[0]
if cp:
cp += ":"
cp += file.path
inputDependencies = inputDependencies + [file]
# extract the class files for use by bnd
classes = ctx.actions.declare_file("classes" + ctx.label.name.replace("/", "-"))
classesPath = classes.path
jarCommand = "mkdir -p %s && cp %s %s && cd %s && jar xf *.jar" % (classesPath, jar, classesPath, classesPath)
ctx.actions.run_shell(
inputs = inputDependencies,
outputs = [classes],
command = jarCommand,
progress_message = "Expanding jar file: %s" % jar,
)
inputDependencies += [classes]
web_xml_root_path = ""
if len(web_xml) != 0:
web_xml_root = web_xml[0].files.to_list()[0]
inputDependencies += [web_xml_root]
web_xml_root_path = web_xml_root.path.replace("WEB-INF/web.xml", "")
# call bnd to make the OSGI jar file
arguments = [
jar,
output,
cp,
name,
group,
version,
license,
import_packages,
exportPackages,
includeResources,
web_context,
web_xml_root_path,
dynamicimportPackages,
classesPath,
]
ctx.actions.run(
inputs = inputDependencies,
outputs = [ctx.outputs.osgi_jar],
arguments = arguments,
progress_message = "Running bnd wrapper on: %s" % ctx.attr.name,
executable = ctx.executable._bnd_exe,
)
deps = []
if java_common.provider in ctx.attr.source:
deps.append(ctx.attr.source[java_common.provider])
deps_provider = java_common.merge(deps)
return struct(
providers = [deps_provider],
)
_bnd = rule(
attrs = {
"deps": attr.label_list(),
"version": attr.string(),
"package_name_root": attr.string(),
"source": attr.label(),
"import_packages": attr.string(),
"web_context": attr.string(),
"web_xml": attr.label_list(allow_files = True),
"_bnd_exe": attr.label(
executable = True,
cfg = "host",
allow_files = True,
default = Label("//utils/osgiwrap:osgi-jar"),
),
},
fragments = ["java"],
outputs = {
"osgi_jar": "lib%{name}.jar",
},
implementation = _bnd_impl,
)
def wrapped_osgi_jar(
name,
jar,
deps,
version = ONOS_VERSION,
package_name_root = "org.onosproject",
import_packages = "*",
web_context = None,
web_xml = None,
visibility = ["//visibility:private"]):
_bnd(
name = name,
source = jar,
deps = deps,
version = version,
package_name_root = package_name_root,
visibility = visibility,
import_packages = import_packages,
web_xml = web_xml,
)
def osgi_jar_with_tests(
name = None,
deps = None,
test_deps = None,
package_name_root = "org.onosproject",
srcs = None,
resources_root = None,
resources = None,
test_srcs = None,
exclude_tests = None,
test_resources = None,
visibility = ["//visibility:public"],
version = ONOS_VERSION,
web_context = None,
api_title = "",
api_version = "",
api_description = "",
api_package = "",
import_packages = None):
if name == None:
name = "onos-" + native.package_name().replace("/", "-")
if srcs == None:
srcs = _all_java_sources()
if resources == None:
resources = _all_resources(resources_root)
if test_srcs == None:
test_srcs = _all_java_test_sources()
if test_resources == None:
test_resources = _all_test_resources()
if exclude_tests == None:
exclude_tests = []
if deps == None:
deps = COMPILE
if test_deps == None:
test_deps = TEST
if import_packages == None:
import_packages = "*"
tests_name = name + "-tests"
tests_jar_deps = list(depset(deps + test_deps)) + [name]
all_test_deps = tests_jar_deps + [tests_name]
web_xml = _webapp()
# compile the Java code
native.java_library(name = name + "-native", srcs = srcs, resources = resources, deps = deps, visibility = visibility)
_bnd(
name = name,
source = name + "-native",
deps = deps,
version = version,
package_name_root = package_name_root,
visibility = visibility,
import_packages = import_packages,
web_context = web_context,
web_xml = web_xml,
)
if test_srcs != []:
native.java_library(
name = tests_name,
srcs = test_srcs,
resources = test_resources,
deps = tests_jar_deps,
visibility = visibility,
)
generate_test_rules(
name = name + "-tests-gen",
test_files = test_srcs,
exclude_tests = exclude_tests,
deps = all_test_deps,
)
def osgi_jar(
name = None,
deps = None,
import_packages = None,
package_name_root = "org.onosproject",
srcs = None,
resources_root = None,
resources = None,
visibility = ["//visibility:public"],
version = ONOS_VERSION,
# TODO - implement these for swagger and web.xml
web_context = None,
api_title = "",
api_version = "",
api_description = "",
api_package = ""):
if srcs == None:
srcs = _all_java_sources()
if deps == None:
deps = COMPILE
osgi_jar_with_tests(
name = name,
deps = deps,
test_deps = [],
package_name_root = package_name_root,
srcs = srcs,
resources = resources,
resources_root = resources_root,
test_srcs = [],
exclude_tests = [],
test_resources = [],
visibility = visibility,
version = version,
import_packages = import_packages,
web_context = web_context,
)