Refactor of the OSGI bazel rules
- renamed the .bzl file to match the accepted snake case naming standard
- removed an uneccesary veneer method inside the rule implementation
Change-Id: I1e0f5aecf1d4b7b73e7376c1bb4c296960aaa5fc
diff --git a/tools/build/bazel/osgi_java_library.bzl b/tools/build/bazel/osgi_java_library.bzl
new file mode 100644
index 0000000..de8c28c
--- /dev/null
+++ b/tools/build/bazel/osgi_java_library.bzl
@@ -0,0 +1,221 @@
+"""
+ 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 + "**"])
+
+# 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 = ""
+ importPackages = "*"
+ exportPackages = "*"
+ includeResources = ""
+ webContext = "NONE"
+ dynamicimportPackages = ""
+ cp = ""
+
+ inputDependencies = [input_file]
+
+ # determine the dependencies and build the class path
+ for dep in ctx.attr.deps:
+ if len(dep.java.outputs.jars) == 0:
+ continue
+
+ file = dep.java.outputs.jars[0].class_jar
+
+ 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]
+
+ # call bnd to make the OSGI jar file
+ arguments = [
+ jar,
+ output,
+ cp,
+ name,
+ group,
+ version,
+ license,
+ importPackages,
+ exportPackages,
+ includeResources,
+ webContext,
+ 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,
+ )
+
+_bnd = rule(
+ attrs = {
+ "deps": attr.label_list(),
+ "version": attr.string(),
+ "package_name_root": attr.string(),
+ "source": attr.label(),
+ "_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", visibility = ["//visibility:private"]):
+ _bnd(name = name, source = jar, deps = deps, version = version, package_name_root = package_name_root, visibility = visibility)
+
+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):
+ 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
+ tests_name = name + "-tests"
+ tests_jar_deps = list(depset(deps + test_deps)) + [name]
+ all_test_deps = tests_jar_deps + [tests_name]
+
+ native.java_library(name = name, srcs = srcs, resources = resources, deps = deps, visibility = visibility)
+ _bnd(
+ name = name + "-osgi",
+ source = name,
+ deps = deps,
+ version = version,
+ package_name_root = package_name_root,
+ visibility = visibility,
+ )
+ 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,
+ package_name_root = "org.onosproject",
+ srcs = None,
+ resources_root = None,
+ resources = None,
+ visibility = ["//visibility:public"],
+ version = ONOS_VERSION):
+ 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,
+ )