| # Copyright 2017 The Bazel Authors. All rights reserved. |
| # |
| # 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. |
| |
| # TODO(dmarting): Provide checksums for those files. |
| _EQUINOX_MIRROR_URL="https://storage.googleapis.com/bazel-mirror/download.eclipse.org/eclipse/updates" |
| _ECLIPSE_VERSION="4.5.2-201602121500" |
| _DOWNLOAD_URL = "%s/%s/R-%s/plugins/%s_%s.jar" % ( |
| _EQUINOX_MIRROR_URL, |
| ".".join(_ECLIPSE_VERSION.split(".", 3)[0:2]), |
| _ECLIPSE_VERSION, |
| "%s", |
| "%s") |
| |
| # TODO(dmarting): make this configurable? |
| _DECLARED_DEPS = [ |
| "org.eclipse.ui.console", |
| "org.eclipse.ui", |
| "org.eclipse.core.resources", |
| "org.eclipse.ui.ide", |
| "org.eclipse.jdt.core", |
| "org.eclipse.core.runtime", |
| "javax.inject", |
| ] |
| |
| _ECLIPSE_PLUGIN_DEPS = { |
| # Declared deps. |
| "org.eclipse.ui.console": "3.6.100.v20150822-1912", |
| "javax.inject": "1.0.0.v20091030", |
| "org.eclipse.core.runtime": "3.11.1.v20150903-1804", |
| "org.eclipse.ui": "3.107.0.v20150507-1945", |
| "org.eclipse.jdt.core": "3.11.2.v20160128-0629", |
| "org.eclipse.core.resources": "3.10.1.v20150725-1910", |
| "org.eclipse.ui.ide": "3.11.0.v20150825-2158", |
| # implicit deps |
| "org.eclipse.swt": "3.104.2.v20160212-1350", |
| # TODO(dmarting): make it works cross platform. This is not a problem while |
| # we are using the dependency to compile but this might become an issue if |
| # we need to run the plugin (e.g. to test it). |
| # |
| # Available platforms: cocoa.macosx.x86_64 gtk.aix.ppc gtk.aix.ppc64 |
| # gtk.hpux.ia64 gtk.linux.ppc gtk.linux.ppc64 gtk.linux.ppc64le gtk.linux.s390 |
| # gtk.linux.s390x gtk.linux.x86 gtk.linux.x86_64 gtk.solaris.sparc |
| # gtk.solaris.x86 win32.win32.x86 win32.win32.x86_64 |
| "org.eclipse.swt.gtk.linux.ppc": "3.104.2.v20160212-1350", |
| "org.eclipse.jface": "3.11.1.v20160128-1644", |
| "org.eclipse.core.commands": "3.7.0.v20150422-0725", |
| "org.eclipse.ui.workbench": "3.107.1.v20160120-2131", |
| "org.eclipse.e4.ui.workbench3": "0.13.0.v20150422-0725", |
| "org.eclipse.jdt.compiler.apt": "1.2.0.v20150514-0146", |
| "org.eclipse.jdt.compiler.tool": "1.1.0.v20150513-2007", |
| "javax.annotation": "1.2.0.v201401042248", |
| "org.eclipse.osgi": "3.10.102.v20160118-1700", |
| "org.eclipse.osgi.compatibility.state": "1.0.100.v20150402-1551", |
| "org.eclipse.equinox.common": "3.7.0.v20150402-1709", |
| "org.eclipse.core.jobs": "3.7.0.v20150330-2103", |
| "org.eclipse.core.runtime.compatibility.registry": "3.6.0.v20150318-1505", |
| "org.eclipse.equinox.registry": "3.6.0.v20150318-1503", |
| "org.eclipse.equinox.preferences": "3.5.300.v20150408-1437", |
| "org.eclipse.core.contenttype": "3.5.0.v20150421-2214", |
| "org.eclipse.equinox.app": "1.3.300.v20150423-1356", |
| "org.eclipse.ui.views": "3.8.0.v20150422-0725", |
| } |
| |
| |
| def _load_eclipse_dep(plugin, version): |
| native.http_file( |
| name = plugin.replace(".", "_"), |
| url = _DOWNLOAD_URL % (plugin, version), |
| ) |
| |
| load("//tools/build_defs:eclipse_platform.bzl", "eclipse_platform") |
| |
| def load_eclipse_deps(): |
| """Load dependencies of the Eclipse plugin.""" |
| for plugin in _ECLIPSE_PLUGIN_DEPS: |
| _load_eclipse_dep(plugin, _ECLIPSE_PLUGIN_DEPS[plugin]) |
| eclipse_platform(name="org_eclipse_equinox", version=_ECLIPSE_VERSION) |
| |
| |
| def eclipse_plugin(name, version, bundle_name, activator=None, |
| vendor=None, **kwargs): |
| """A macro to generate an eclipse plugin (see java_binary).""" |
| jars = ["@%s//file" % plugin.replace(".", "_") |
| for plugin in _ECLIPSE_PLUGIN_DEPS] |
| native.java_import( |
| name = name + "-deps", |
| neverlink = 1, |
| jars = jars, |
| ) |
| deps = [name + "-deps"] |
| if "deps" in kwargs: |
| deps = deps + kwargs["deps"] |
| args = {k: kwargs[k] |
| for k in kwargs |
| if k not in [ |
| "deps", |
| "classpath_resources", |
| "deploy_manifest_lines", |
| "visibility", |
| "main_class"]} |
| visibility = kwargs["visibility"] if "visibility" in kwargs else None |
| # Generate the .api_description to put in the final jar |
| native.genrule( |
| name = name + ".api_description", |
| srcs = [], |
| outs = [name + "/.api_description"], |
| cmd = """ |
| cat <<EOF >$@ |
| <?xml version="1.0" encoding="UTF-8" standalone="no"?> |
| <component name="%s_%s" version="1.2"> |
| <plugin id="%s_%s"/> |
| </component> |
| EOF |
| """ % (name, version, name, version)) |
| # Generate the final jar (a deploy jar) |
| native.java_binary( |
| name = name + "-bin", |
| main_class = "does.not.exist", |
| classpath_resources = [ |
| ":%s/.api_description" % name, |
| # TODO(dmarting): this add the plugin.xml dependency here, maybe we |
| # should move that to the BUILD file to avoid surprise? |
| "plugin.xml", |
| ] + (kwargs["classpath_resources"] |
| if "classpath_resources" in kwargs else []), |
| deploy_manifest_lines = [ |
| "Bundle-ManifestVersion: 2", |
| "Bundle-Name: " + bundle_name, |
| # TODO(dmarting): We mark always as singleton, make it configurable? |
| "Bundle-SymbolicName: %s;singleton:=true" % name, |
| "Bundle-Version: " + version, |
| "Require-Bundle: " + ", ".join(_DECLARED_DEPS), |
| # TODO(dmarting): Take the java version from java_toolchain. |
| "Bundle-RequiredExecutionEnvironment: JavaSE-1.8", |
| "Bundle-ActivationPolicy: lazy", |
| "Bundle-ClassPath: .", |
| ] + ( |
| ["Bundle-Activator: " + activator] if activator else [] |
| ) + ( |
| ["Bundle-Vendor: " + vendor] if vendor else [] |
| ) + (kwargs["deploy_manifest_lines"] |
| if "deploy_manifest_lines" in kwargs else []), |
| deps = deps, |
| **args) |
| # Rename the output to the correct name |
| native.genrule( |
| name = name, |
| srcs = [":%s-bin_deploy.jar" % name], |
| outs = ["%s_%s.jar" % (name, version)], |
| cmd = "cp $< $@", |
| output_to_bindir = 1, |
| visibility = visibility, |
| ) |
| |
| |
| def _eclipse_feature_impl(ctx): |
| feature_xml = ctx.new_file(ctx.outputs.out, ctx.label.name + ".xml") |
| ctx.action( |
| outputs = [feature_xml], |
| inputs = [ctx.file.license], |
| executable = ctx.executable._builder, |
| arguments = [ |
| "--output=" + feature_xml.path, |
| "--id=" + ctx.label.name, |
| "--label=" + ctx.attr.label, |
| "--version=" + ctx.attr.version, |
| "--provider=" + ctx.attr.provider, |
| "--url=" + ctx.attr.url, |
| "--description=" + ctx.attr.description, |
| "--copyright=" + ctx.attr.copyright, |
| "--license_url=" + ctx.attr.license_url, |
| "--license=" + ctx.file.license.path] + [ |
| "--site=%s=%s" % (site, ctx.attr.sites[site]) |
| for site in ctx.attr.sites] + [ |
| "--plugin=" + p.basename for p in ctx.files.plugins]) |
| ctx.action( |
| outputs = [ctx.outputs.out], |
| inputs = [feature_xml], |
| executable = ctx.executable._zipper, |
| arguments = ["c", |
| ctx.outputs.out.path, |
| "feature.xml=" + feature_xml.path], |
| ) |
| return struct( |
| eclipse_feature=struct( |
| file=ctx.outputs.out, |
| id=ctx.label.name, |
| version=ctx.attr.version, |
| plugins=ctx.files.plugins |
| ) |
| ) |
| |
| |
| eclipse_feature = rule( |
| implementation=_eclipse_feature_impl, |
| attrs = { |
| "label": attr.string(mandatory=True), |
| "version": attr.string(mandatory=True), |
| "provider": attr.string(mandatory=True), |
| "description": attr.string(mandatory=True), |
| "url": attr.string(mandatory=True), |
| "copyright": attr.string(mandatory=True), |
| "license_url": attr.string(mandatory=True), |
| "license": attr.label(mandatory=True, allow_single_file=True), |
| "sites": attr.string_dict(), |
| # TODO(dmarting): restrict what can be passed to the plugins attribute. |
| "plugins": attr.label_list(), |
| "_zipper": attr.label(default=Label("@bazel_tools//tools/zip:zipper"), |
| executable=True, |
| cfg="host"), |
| "_builder": attr.label(default=Label("//tools/build_defs:feature_builder"), |
| executable=True, |
| cfg="host"), |
| }, |
| outputs = {"out": "%{name}_%{version}.jar"}) |
| """Create an eclipse feature jar.""" |
| |
| |
| def _eclipse_p2updatesite_impl(ctx): |
| feat_files = [f.eclipse_feature.file for f in ctx.attr.eclipse_features] |
| args = [ |
| "--output=" + ctx.outputs.out.path, |
| "--java=" + ctx.executable._java.path, |
| "--eclipse_launcher=" + ctx.file._eclipse_launcher.path, |
| "--name=" + ctx.attr.label, |
| "--url=" + ctx.attr.url, |
| "--description=" + ctx.attr.description] |
| |
| _plugins = {} |
| for f in ctx.attr.eclipse_features: |
| args.append("--feature=" + f.eclipse_feature.file.path) |
| args.append("--feature_id=" + f.eclipse_feature.id) |
| args.append("--feature_version=" + f.eclipse_feature.version) |
| for p in f.eclipse_feature.plugins: |
| if p.path not in _plugins: |
| _plugins[p.path] = p |
| plugins = [_plugins[p] for p in _plugins] |
| |
| ctx.action( |
| outputs=[ctx.outputs.out], |
| inputs=[ |
| ctx.executable._java, |
| ctx.file._eclipse_launcher, |
| ] + ctx.files._jdk + ctx.files._eclipse_platform + feat_files + plugins, |
| executable = ctx.executable._site_builder, |
| arguments = args + ["--bundle=" + p.path for p in plugins]) |
| |
| |
| eclipse_p2updatesite = rule( |
| implementation=_eclipse_p2updatesite_impl, |
| attrs = { |
| "label": attr.string(mandatory=True), |
| "description": attr.string(mandatory=True), |
| "url": attr.string(mandatory=True), |
| "eclipse_features": attr.label_list(providers=["eclipse_feature"]), |
| "_site_builder": attr.label( |
| default=Label("//tools/build_defs:site_builder"), |
| executable=True, |
| cfg="host"), |
| "_zipper": attr.label( |
| default=Label("@bazel_tools//tools/zip:zipper"), |
| executable=True, |
| cfg="host"), |
| "_java": attr.label( |
| default=Label("@bazel_tools//tools/jdk:java"), |
| executable=True, |
| cfg="host"), |
| "_jdk": attr.label(default=Label("@bazel_tools//tools/jdk:jdk")), |
| "_eclipse_launcher": attr.label( |
| default=Label("@org_eclipse_equinox//:launcher"), |
| allow_single_file=True), |
| "_eclipse_platform": attr.label(default=Label("@org_eclipse_equinox//:platform")), |
| }, |
| outputs = {"out": "%{name}.zip"}) |
| """Create an eclipse p2update site inside a ZIP file.""" |