# Copyright (C) 2016 The Android Open Source Project # # 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. # Port of Buck native gwt_binary() rule. See discussion in context of # https://github.com/facebook/buck/issues/109 load('//tools/bzl:genrule2.bzl', 'genrule2') load('//tools/bzl:gwt.bzl', 'gwt_module') jar_filetype = FileType(['.jar']) MODULE = 'com.google.gerrit.GerritGwtUI' GWT_COMPILER = "com.google.gwt.dev.Compiler" GWT_JVM_ARGS = ['-Xmx512m'] GWT_COMPILER_ARGS = [ '-XdisableClassMetadata', ] GWT_COMPILER_ARGS_RELEASE_MODE = GWT_COMPILER_ARGS + [ '-XdisableCastChecking', ] GWT_TRANSITIVE_DEPS = [ '//lib/gwt:ant', '//lib/gwt:colt', '//lib/gwt:javax-validation', '//lib/gwt:javax-validation_src', '//lib/gwt:jsinterop-annotations', '//lib/gwt:jsinterop-annotations_src', '//lib/gwt:tapestry', '//lib/gwt:w3c-css-sac', '//lib/ow2:ow2-asm', '//lib/ow2:ow2-asm-analysis', '//lib/ow2:ow2-asm-commons', '//lib/ow2:ow2-asm-tree', '//lib/ow2:ow2-asm-util', ] DEPS = GWT_TRANSITIVE_DEPS + [ '//gerrit-gwtexpui:CSS', '//lib:gwtjsonrpc', '//lib/gwt:dev', '@jgit_src//file', ] def _impl(ctx): output_zip = ctx.outputs.output output_dir = output_zip.path + '.gwt_output' deploy_dir = output_zip.path + '.gwt_deploy' deps = _get_transitive_closure(ctx) paths = [] for dep in deps: paths.append(dep.path) cmd = "external/local_jdk/bin/java %s -Dgwt.normalizeTimestamps=true -cp %s %s -war %s -deploy %s " % ( " ".join(ctx.attr.jvm_args), ":".join(paths), GWT_COMPILER, output_dir, deploy_dir, ) cmd += " ".join([ "-style %s" % ctx.attr.style, "-optimize %s" % ctx.attr.optimize, "-strict", " ".join(ctx.attr.compiler_args), " ".join(ctx.attr.modules) + "\n", "rm -rf %s/gwt-unitCache\n" % output_dir, "root=`pwd`\n", "cd %s; $root/%s Cc ../%s $(find .)\n" % ( output_dir, ctx.executable._zip.path, output_zip.basename, ) ]) ctx.action( inputs = list(deps) + ctx.files._jdk + ctx.files._zip, outputs = [output_zip], mnemonic = "GwtBinary", progress_message = "GWT compiling " + output_zip.short_path, command = "set -e\n" + cmd, ) def _get_transitive_closure(ctx): deps = set() for dep in ctx.attr.module_deps: deps += dep.java.transitive_runtime_deps deps += dep.java.transitive_source_jars for dep in ctx.attr.deps: if hasattr(dep, 'java'): deps += dep.java.transitive_runtime_deps elif hasattr(dep, 'files'): deps += dep.files return deps gwt_binary = rule( implementation = _impl, attrs = { "style": attr.string(default = "OBF"), "optimize": attr.string(default = "9"), "deps": attr.label_list(allow_files=jar_filetype), "modules": attr.string_list(mandatory=True), "module_deps": attr.label_list(allow_files=jar_filetype), "compiler_args": attr.string_list(), "jvm_args": attr.string_list(), "_jdk": attr.label( default=Label("//tools/defaults:jdk")), "_zip": attr.label( default=Label("@bazel_tools//tools/zip:zipper"), executable=True, single_file=True), }, outputs = { "output": "%{name}.zip", }, ) def gwt_genrule(suffix = ""): dbg = 'ui_dbg' + suffix opt = 'ui_opt' + suffix module_dep = ':ui_module' + suffix args = GWT_COMPILER_ARGS_RELEASE_MODE if suffix == "_r" else GWT_COMPILER_ARGS genrule2( name = 'ui_optdbg' + suffix, srcs = [ ':' + dbg, ':' + opt, ], cmd = 'cd $$TMP;' + 'unzip -q $$ROOT/$(location :%s);' % dbg + 'mv' + ' gerrit_ui/gerrit_ui.nocache.js' + ' gerrit_ui/dbg_gerrit_ui.nocache.js;' + 'unzip -qo $$ROOT/$(location :%s);' % opt + 'mkdir -p $$(dirname $@);' + 'zip -qr $$ROOT/$@ .', out = 'ui_optdbg' + suffix + '.zip', visibility = ['//visibility:public'], ) gwt_binary( name = opt, modules = [MODULE], module_deps = [module_dep], deps = DEPS, compiler_args = args, jvm_args = GWT_JVM_ARGS, ) gwt_binary( name = dbg, modules = [MODULE], style = 'PRETTY', optimize = "0", module_deps = [module_dep], deps = DEPS, compiler_args = GWT_COMPILER_ARGS, jvm_args = GWT_JVM_ARGS, ) def gen_ui_module(name, suffix = ""): gwt_module( name = name + suffix, srcs = native.glob(['src/main/java/**/*.java']), gwt_xml = 'src/main/java/%s.gwt.xml' % MODULE.replace('.', '/'), resources = native.glob( ['src/main/java/**/*'], exclude = ['src/main/java/**/*.java'] + ['src/main/java/%s.gwt.xml' % MODULE.replace('.', '/')]), deps = [ '//gerrit-gwtui-common:diffy_logo', '//gerrit-gwtui-common:client', '//gerrit-gwtexpui:CSS', '//lib/codemirror:codemirror' + suffix, '//lib/gwt:user', ], visibility = ['//visibility:public'], )