197 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			197 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
# 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'],
 | 
						|
  )
 |