Implement Bazel build

To run the tests:

  bazel test //...

To build the Gerrit plugin API, run:

  bazel build gerrit-plugin-api:plugin-api_deploy.jar

To build the Gerrit extension API, run:

  bazel build gerrit-extension-api:extension-api_deploy.jar

TODOs:

Licenses
Reduce visibility (all public for now)
Generate HTML Documentation
Core plugins
gerrit_plugin() rule to build plugins in tree and standalone modes
GWT UI (only gwt_module() skylark rule is provided, no gwt_binary())
PolyGerrit UI
WAR
Publish artifacts to Maven Central
Ask Bazel team to add Gerrit to their CI on ci.bazel.io

Contributed-By: Han-Wen Nienhuys <hanwen@google.com>
Change-Id: I9a86e670882a44a5c966579cdeb8ed79b1590de3
diff --git a/lib/BUILD b/lib/BUILD
new file mode 100644
index 0000000..e89e63c
--- /dev/null
+++ b/lib/BUILD
@@ -0,0 +1,204 @@
+java_library(
+  name = 'servlet-api-3_1',
+  neverlink = 1,
+  exports = ['@servlet_api_3_1//jar'],
+  visibility = ['//visibility:public'],
+)
+
+java_library(
+  name = 'servlet-api-3_1-without-neverlink',
+  exports = ['@servlet_api_3_1//jar'],
+  visibility = ['//visibility:public'],
+)
+
+java_library(
+  name = 'gwtjsonrpc',
+  exports = ['@gwtjsonrpc//jar'],
+  visibility = ['//visibility:public'],
+)
+
+java_library(
+  name = 'gwtjsonrpc_src',
+  exports = ['@gwtjsonrpc_src//jar'],
+  visibility = ['//visibility:public'],
+)
+
+java_library(
+  name = 'gson',
+  exports = ['@gson//jar'],
+  visibility = ['//visibility:public'],
+)
+
+java_library(
+  name = 'gwtorm_client',
+  exports = ['@gwtorm_client//jar'],
+  visibility = ['//visibility:public'],
+)
+
+java_library(
+  name = 'gwtorm_client_src',
+  exports = ['@gwtorm_client_src//jar'],
+  visibility = ['//visibility:public'],
+)
+
+java_library(
+  name = 'protobuf',
+  exports = ['@protobuf//jar'],
+  visibility = ['//visibility:public'],
+)
+
+java_library(
+  name = 'gwtorm',
+  exports = [':gwtorm_client'],
+  runtime_deps = [':protobuf'],
+  visibility = ['//visibility:public'],
+)
+
+java_library(
+  name = 'guava',
+  exports = ['@guava//jar'],
+  visibility = ['//visibility:public'],
+)
+
+java_library(
+  name = 'velocity',
+  exports = ['@velocity//jar'],
+  runtime_deps = [
+    '//lib/commons:collections',
+    '//lib/commons:lang',
+    '//lib/commons:oro',
+  ],
+  visibility = ['//visibility:public'],
+)
+
+java_library(
+  name = 'jsch',
+  exports = ['@jsch//jar'],
+  visibility = ['//visibility:public'],
+)
+
+java_library(
+  name = 'juniversalchardet',
+  exports = ['@juniversalchardet//jar'],
+  visibility = ['//visibility:public'],
+)
+
+java_library(
+  name = 'args4j',
+  exports = ['@args4j//jar'],
+  visibility = ['//visibility:public'],
+)
+
+java_library(
+  name = 'automaton',
+  exports = ['@automaton//jar'],
+  visibility = ['//visibility:public'],
+)
+
+java_library(
+  name = 'pegdown',
+  exports = ['@pegdown//jar'],
+  runtime_deps = [':grappa'],
+  visibility = ['//visibility:public'],
+)
+
+java_library(
+  name = 'grappa',
+  exports = ['@grappa//jar'],
+  runtime_deps = [
+    ':jitescript',
+    '//lib/ow2:ow2-asm',
+    '//lib/ow2:ow2-asm-analysis',
+    '//lib/ow2:ow2-asm-tree',
+    '//lib/ow2:ow2-asm-util',
+  ],
+  visibility = ['//visibility:public'],
+)
+
+java_library(
+  name = 'jitescript',
+  exports = ['@jitescript//jar'],
+  visibility = ['//visibility:public'],
+)
+
+java_library(
+  name = 'tukaani-xz',
+  exports = ['@tukaani_xz//jar'],
+  visibility = ['//visibility:public'],
+)
+
+java_library(
+  name = 'mime-util',
+  exports = ['@mime_util//jar'],
+  visibility = ['//visibility:public'],
+)
+
+java_library(
+  name = 'guava-retrying',
+  exports = ['@guava_retrying//jar'],
+  runtime_deps = [':jsr305'],
+  visibility = ['//visibility:public'],
+)
+
+java_library(
+  name = 'jsr305',
+  exports = ['@jsr305//jar'],
+)
+
+java_library(
+  name = 'blame-cache',
+  exports = ['@blame_cache//jar'],
+  visibility = ['//visibility:public'],
+)
+
+java_library(
+  name = 'h2',
+  exports = ['@h2//jar'],
+  visibility = ['//visibility:public'],
+)
+
+
+java_library(
+  name = 'jimfs',
+  exports = ['@jimfs//jar'],
+  runtime_deps = [':guava'],
+  visibility = ['//visibility:public'],
+)
+
+java_library(
+  name = 'junit',
+  exports = [
+    '@junit//jar',
+    ':hamcrest-core',
+  ],
+  runtime_deps = [':hamcrest-core'],
+  visibility = ['//visibility:public'],
+)
+
+java_library(
+  name = 'hamcrest-core',
+  exports = ['@hamcrest_core//jar'],
+  visibility = ['//visibility:public'],
+)
+
+java_library(
+  name = 'truth',
+  exports = [
+    '@truth//jar',
+    ':guava',
+    ':junit',
+  ],
+  visibility = ['//visibility:public'],
+)
+
+java_library(
+  name = 'javassist',
+  exports = ['@javassist//jar'],
+  visibility = ['//visibility:public'],
+)
+
+java_library(
+  name = 'derby',
+  exports = ['@derby//jar'],
+  visibility = ['//visibility:public'],
+)
diff --git a/lib/antlr/BUILD b/lib/antlr/BUILD
new file mode 100644
index 0000000..ede7665
--- /dev/null
+++ b/lib/antlr/BUILD
@@ -0,0 +1,31 @@
+
+[java_library(
+  name = n,
+  exports = ['@%s//jar' % n],
+) for n in [
+  'antlr27',
+  'stringtemplate',
+]]
+
+java_library(
+  name = 'java_runtime',
+  exports = ['@java_runtime//jar'],
+  visibility = ['//visibility:public'],
+)
+
+java_binary(
+  name = 'antlr-tool',
+  main_class = 'org.antlr.Tool',
+  runtime_deps = [':tool'],
+  visibility = ['//gerrit-antlr:__pkg__'],
+)
+
+java_library(
+  name = 'tool',
+  exports = ['@org_antlr//jar'],
+  runtime_deps = [
+    ':antlr27',
+    ':java_runtime',
+    ':stringtemplate',
+  ],
+)
diff --git a/lib/auto/BUILD b/lib/auto/BUILD
new file mode 100644
index 0000000..e07c36d
--- /dev/null
+++ b/lib/auto/BUILD
@@ -0,0 +1,21 @@
+java_plugin(
+  name = 'auto-annotation-plugin',
+  processor_class = 'com.google.auto.value.processor.AutoAnnotationProcessor',
+  deps = ['@auto_value//jar'],
+)
+
+java_plugin(
+  name = 'auto-value-plugin',
+  processor_class = 'com.google.auto.value.processor.AutoValueProcessor',
+  deps = ['@auto_value//jar'],
+)
+
+java_library(
+  name = 'auto-value',
+  exported_plugins = [
+    ':auto-annotation-plugin',
+    ':auto-value-plugin',
+  ],
+  exports = ['@auto_value//jar'],
+  visibility = ['//visibility:public'],
+)
diff --git a/lib/bouncycastle/BUILD b/lib/bouncycastle/BUILD
new file mode 100644
index 0000000..49c54ba
--- /dev/null
+++ b/lib/bouncycastle/BUILD
@@ -0,0 +1,38 @@
+java_library(
+  name = 'bcprov',
+  neverlink = 1,
+  exports = ['@bcprov//jar'],
+  visibility = ['//visibility:public'],
+)
+
+java_library(
+  name = 'bcprov-without-neverlink',
+  exports = ['@bcprov//jar'],
+  visibility = ['//visibility:public'],
+)
+
+java_library(
+  name = 'bcpg',
+  neverlink = 1,
+  exports = ['@bcpg//jar'],
+  visibility = ['//visibility:public'],
+)
+
+java_library(
+  name = 'bcpg-without-neverlink',
+  exports = ['@bcpg//jar'],
+  visibility = ['//visibility:public'],
+)
+
+java_library(
+  name = 'bcpkix',
+  neverlink = 1,
+  exports = ['@bcpkix//jar'],
+  visibility = ['//visibility:public'],
+)
+
+java_library(
+  name = 'bcpkix-without-neverlink',
+  exports = ['@bcpkix//jar'],
+  visibility = ['//visibility:public'],
+)
diff --git a/lib/commons/BUILD b/lib/commons/BUILD
new file mode 100644
index 0000000..8c42e53f
--- /dev/null
+++ b/lib/commons/BUILD
@@ -0,0 +1,54 @@
+java_library(
+  name = 'codec',
+  exports = ['@commons_codec//jar'],
+  visibility = ['//visibility:public'],
+)
+
+java_library(
+  name = 'collections',
+  exports = ['@commons_collections//jar'],
+  visibility = ['//visibility:public'],
+)
+
+java_library(
+  name = 'compress',
+  exports = ['@commons_compress//jar'],
+  visibility = ['//visibility:public'],
+)
+
+java_library(
+  name = 'lang',
+  exports = ['@commons_lang//jar'],
+  visibility = ['//visibility:public'],
+)
+
+java_library(
+  name = 'net',
+  exports = ['@commons_net//jar'],
+  visibility = ['//visibility:public'],
+)
+
+java_library(
+  name = 'dbcp',
+  exports = ['@commons_dbcp//jar'],
+  runtime_deps = [':pool'],
+  visibility = ['//visibility:public'],
+)
+
+java_library(
+  name = 'pool',
+  exports = ['@commons_pool//jar'],
+  visibility = ['//visibility:public'],
+)
+
+java_library(
+  name = 'oro',
+  exports = ['@commons_oro//jar'],
+  visibility = ['//visibility:public'],
+)
+
+java_library(
+  name = 'validator',
+  exports = ['@commons_validator//jar'],
+  visibility = ['//visibility:public'],
+)
diff --git a/lib/dropwizard/BUILD b/lib/dropwizard/BUILD
new file mode 100644
index 0000000..9d4a8d3
--- /dev/null
+++ b/lib/dropwizard/BUILD
@@ -0,0 +1,5 @@
+java_library(
+  name = 'dropwizard-core',
+  exports = ['@dropwizard_core//jar'],
+  visibility = ['//visibility:public'],
+)
diff --git a/lib/easymock/BUILD b/lib/easymock/BUILD
new file mode 100644
index 0000000..df77128
--- /dev/null
+++ b/lib/easymock/BUILD
@@ -0,0 +1,22 @@
+java_library(
+  name = 'easymock',
+  exports = ['@easymock//jar'],
+  runtime_deps = [
+    ':cglib-2_2',
+    ':objenesis',
+  ],
+  visibility = ['//visibility:public'],
+)
+
+java_library(
+  name = 'cglib-2_2',
+  exports = ['@cglib_2_2//jar'],
+  visibility = ['//visibility:public'],
+)
+
+java_library(
+  name = 'objenesis',
+  exports = ['@objenesis//jar'],
+  visibility = ['//visibility:public'],
+)
+
diff --git a/lib/guice/BUILD b/lib/guice/BUILD
new file mode 100644
index 0000000..acade50
--- /dev/null
+++ b/lib/guice/BUILD
@@ -0,0 +1,39 @@
+java_library(
+  name = 'guice',
+  exports = [
+    ':guice_library',
+    ':javax-inject',
+  ],
+  visibility = ['//visibility:public'],
+)
+
+java_library(
+  name = 'guice_library',
+  exports = ['@guice_library//jar'],
+  runtime_deps = ['aopalliance'],
+  visibility = ['//visibility:public'],
+)
+
+java_library(
+  name = 'guice-assistedinject',
+  exports = ['@guice_assistedinject//jar'],
+  runtime_deps = [':guice'],
+  visibility = ['//visibility:public'],
+)
+
+java_library(
+  name = 'guice-servlet',
+  exports = ['@guice_servlet//jar'],
+  runtime_deps = [':guice'],
+  visibility = ['//visibility:public'],
+)
+
+java_library(
+  name = 'aopalliance',
+  exports = ['@aopalliance//jar'],
+)
+
+java_library(
+  name = 'javax-inject',
+  exports = ['@javax_inject//jar'],
+)
diff --git a/lib/gwt/BUILD b/lib/gwt/BUILD
new file mode 100644
index 0000000..2168bb4
--- /dev/null
+++ b/lib/gwt/BUILD
@@ -0,0 +1,9 @@
+[java_library(
+  name = n,
+  exports = ['@%s//jar' % n.replace("-", "_")],
+  visibility = ["//visibility:public"],
+) for n in [
+  'javax-validation',
+  'dev',
+  'user',
+]]
diff --git a/lib/httpcomponents/BUILD b/lib/httpcomponents/BUILD
new file mode 100644
index 0000000..74ab00a
--- /dev/null
+++ b/lib/httpcomponents/BUILD
@@ -0,0 +1,29 @@
+java_library(
+  name = 'fluent-hc',
+  exports = ['@fluent_hc//jar'],
+  runtime_deps = [':httpclient'],
+  visibility = ['//visibility:public'],
+)
+
+java_library(
+  name = 'httpclient',
+  exports = ['@httpclient//jar'],
+  runtime_deps = [
+    '//lib/commons:codec',
+    ':httpcore',
+    '//lib/log:jcl-over-slf4j',
+  ],
+  visibility = ['//visibility:public'],
+)
+
+java_library(
+  name = 'httpcore',
+  exports = ['@httpcore//jar'],
+  visibility = ['//visibility:public'],
+)
+
+java_library(
+  name = 'httpmime',
+  exports = ['@httpmime//jar'],
+  visibility = ['//visibility:public'],
+)
diff --git a/lib/jetty/BUILD b/lib/jetty/BUILD
new file mode 100644
index 0000000..da3af1c
--- /dev/null
+++ b/lib/jetty/BUILD
@@ -0,0 +1,67 @@
+java_library(
+  name = 'servlet',
+  exports = ['@jetty_servlet//jar'],
+  runtime_deps = [':security'],
+  visibility = ['//visibility:public'],
+)
+
+java_library(
+  name = 'security',
+  exports = ['@jetty_security//jar'],
+  runtime_deps = [':server'],
+  visibility = ['//visibility:public'],
+)
+
+java_library(
+  name = 'servlets',
+  exports = ['@jetty_servlets//jar'],
+  visibility = ['//visibility:public'],
+)
+
+java_library(
+  name = 'server',
+  exports = [
+    '@jetty_server//jar',
+    ':continuation',
+    ':http',
+  ],
+  visibility = ['//visibility:public'],
+)
+
+java_library(
+  name = 'jmx',
+  exports = [
+    '@jetty_jmx//jar',
+    ':continuation',
+    ':http',
+  ],
+  visibility = ['//visibility:public'],
+)
+
+java_library(
+  name = 'continuation',
+  exports = ['@jetty_continuation//jar'],
+  visibility = ['//visibility:public'],
+)
+
+java_library(
+  name = 'http',
+  exports = [
+    '@jetty_http//jar',
+    ':io',
+  ],
+  visibility = ['//visibility:public'],
+)
+
+java_library(
+  name = 'io',
+  exports = [
+    '@jetty_io//jar',
+    ':util',
+  ],
+)
+
+java_library(
+  name = 'util',
+  exports = ['@jetty_util//jar'],
+)
diff --git a/lib/jgit/org.eclipse.jgit.archive/BUILD b/lib/jgit/org.eclipse.jgit.archive/BUILD
new file mode 100644
index 0000000..8fa94f2
--- /dev/null
+++ b/lib/jgit/org.eclipse.jgit.archive/BUILD
@@ -0,0 +1,6 @@
+java_library(
+  name = 'jgit-archive',
+  exports = ['@jgit_archive//jar'],
+  runtime_deps = ['//lib/jgit/org.eclipse.jgit:jgit'],
+  visibility = ['//visibility:public'],
+)
diff --git a/lib/jgit/org.eclipse.jgit.http.server/BUILD b/lib/jgit/org.eclipse.jgit.http.server/BUILD
new file mode 100644
index 0000000..6a442cc
--- /dev/null
+++ b/lib/jgit/org.eclipse.jgit.http.server/BUILD
@@ -0,0 +1,6 @@
+java_library(
+  name = 'jgit-servlet',
+  exports = ['@jgit_servlet//jar'],
+  runtime_deps = ['//lib/jgit/org.eclipse.jgit:jgit'],
+  visibility = ['//visibility:public'],
+)
diff --git a/lib/jgit/org.eclipse.jgit.junit/BUILD b/lib/jgit/org.eclipse.jgit.junit/BUILD
new file mode 100644
index 0000000..d00b82c9
--- /dev/null
+++ b/lib/jgit/org.eclipse.jgit.junit/BUILD
@@ -0,0 +1,6 @@
+java_library(
+  name = 'junit',
+  exports = ['@jgit_junit//jar'],
+  runtime_deps = ['//lib/jgit/org.eclipse.jgit:jgit'],
+  visibility = ['//visibility:public'],
+)
diff --git a/lib/jgit/org.eclipse.jgit/BUILD b/lib/jgit/org.eclipse.jgit/BUILD
new file mode 100644
index 0000000..a1f9cad
--- /dev/null
+++ b/lib/jgit/org.eclipse.jgit/BUILD
@@ -0,0 +1,12 @@
+java_library(
+  name = 'jgit',
+  exports = ['@jgit//jar'],
+  runtime_deps = [':ewah'],
+  visibility = ['//visibility:public'],
+)
+
+java_library(
+  name = 'ewah',
+  exports = ['@ewah//jar'],
+  visibility = ['//visibility:public'],
+)
diff --git a/lib/joda/BUILD b/lib/joda/BUILD
new file mode 100644
index 0000000..a673bf5
--- /dev/null
+++ b/lib/joda/BUILD
@@ -0,0 +1,11 @@
+java_library(
+  name = 'joda-time',
+  exports = ['@joda_time//jar'],
+  runtime_deps = ['joda-convert'],
+  visibility = ['//visibility:public'],
+)
+
+java_library(
+  name = 'joda-convert',
+  exports = ['@joda_convert//jar'],
+)
diff --git a/lib/log/BUILD b/lib/log/BUILD
new file mode 100644
index 0000000..ac92ab6
--- /dev/null
+++ b/lib/log/BUILD
@@ -0,0 +1,47 @@
+java_library(
+  name = 'api',
+  exports = ['@log_api//jar'],
+  visibility = ['//visibility:public'],
+)
+
+java_library(
+  name = 'nop',
+  exports = ['@log_nop//jar'],
+  runtime_deps = [':api'],
+  visibility = ['//visibility:public'],
+)
+
+java_library(
+  name = 'impl_log4j',
+  exports = ['@impl_log4j//jar'],
+  runtime_deps = [':log4j'],
+  visibility = ['//visibility:public'],
+)
+
+java_library(
+  name = 'jcl-over-slf4j',
+  exports = ['@jcl_over_slf4j//jar'],
+  visibility = ['//visibility:public'],
+)
+
+java_library(
+  name = 'log4j',
+  exports = ['@log4j//jar'],
+  visibility = ['//visibility:public'],
+)
+
+java_library(
+  name = 'jsonevent-layout',
+  exports = ['@jsonevent_layout//jar'],
+  runtime_deps = [
+    ':json-smart',
+    '//lib/commons:lang'
+  ],
+  visibility = ['//visibility:public'],
+)
+
+java_library(
+  name = 'json-smart',
+  exports = ['@json_smart//jar'],
+  visibility = ['//visibility:public'],
+)
diff --git a/lib/lucene/BUILD b/lib/lucene/BUILD
new file mode 100644
index 0000000..679c9f0
--- /dev/null
+++ b/lib/lucene/BUILD
@@ -0,0 +1,33 @@
+load('//tools/bzl:maven.bzl', 'merge_maven_jars')
+
+# core and backward-codecs both provide
+# META-INF/services/org.apache.lucene.codecs.Codec, so they must be merged.
+merge_maven_jars(
+  name = 'lucene-core-and-backward-codecs',
+  srcs = [
+    '@backward_codecs//jar',
+    '@lucene_core//jar',
+  ],
+  visibility = ['//visibility:public'],
+)
+
+java_library(
+  name = 'lucene-analyzers-common',
+  exports = ['@lucene_analyzers_common//jar'],
+  runtime_deps = [':lucene-core-and-backward-codecs'],
+  visibility = ['//visibility:public'],
+)
+
+java_library(
+  name = 'lucene-misc',
+  exports = ['@lucene_misc//jar'],
+  runtime_deps = [':lucene-core-and-backward-codecs'],
+  visibility = ['//visibility:public'],
+)
+
+java_library(
+  name = 'lucene-queryparser',
+  exports = ['@lucene_queryparser//jar'],
+  runtime_deps = [':lucene-core-and-backward-codecs'],
+  visibility = ['//visibility:public'],
+)
diff --git a/lib/mina/BUILD b/lib/mina/BUILD
new file mode 100644
index 0000000..52468a4
--- /dev/null
+++ b/lib/mina/BUILD
@@ -0,0 +1,12 @@
+java_library(
+  name = 'sshd',
+  exports = ['@sshd//jar'],
+  visibility = ['//visibility:public'],
+  runtime_deps = [':core'],
+)
+
+java_library(
+  name = 'core',
+  exports = ['@mina_core//jar'],
+  visibility = ['//visibility:public'],
+)
diff --git a/lib/openid/BUILD b/lib/openid/BUILD
new file mode 100644
index 0000000..7d97a86
--- /dev/null
+++ b/lib/openid/BUILD
@@ -0,0 +1,23 @@
+java_library(
+  name = 'consumer',
+  exports = ['@openid_consumer//jar'],
+  runtime_deps = [
+    ':nekohtml',
+    ':xerces',
+    '//lib/httpcomponents:httpclient',
+    '//lib/log:jcl-over-slf4j',
+    '//lib/guice:guice',
+  ],
+  visibility = ['//visibility:public'],
+)
+
+java_library(
+  name = 'nekohtml',
+  exports = ['@nekohtml//jar'],
+  runtime_deps = [':xerces'],
+)
+
+java_library(
+  name = 'xerces',
+  exports = ['@xerces//jar'],
+)
diff --git a/lib/ow2/BUILD b/lib/ow2/BUILD
new file mode 100644
index 0000000..0b99b6f
--- /dev/null
+++ b/lib/ow2/BUILD
@@ -0,0 +1,30 @@
+java_library(
+  name = 'ow2-asm',
+  exports = ['@ow2_asm//jar'],
+  visibility = ["//visibility:public"],
+)
+
+java_library(
+  name = 'ow2-asm-analysis',
+  exports = ['@ow2_asm_analysis//jar'],
+  visibility = ["//visibility:public"],
+)
+
+java_library(
+  name = 'ow2-asm-commons',
+  exports = ['@ow2_asm_commons//jar'],
+  runtime_deps = [':ow2-asm-tree'],
+  visibility = ["//visibility:public"],
+)
+
+java_library(
+  name = 'ow2-asm-tree',
+  exports = ['@ow2_asm_tree//jar'],
+  visibility = ["//visibility:public"],
+)
+
+java_library(
+  name = 'ow2-asm-util',
+  exports = ['@ow2_asm_util//jar'],
+  visibility = ["//visibility:public"],
+)
diff --git a/lib/powermock/BUILD b/lib/powermock/BUILD
new file mode 100644
index 0000000..8dc7d23
--- /dev/null
+++ b/lib/powermock/BUILD
@@ -0,0 +1,60 @@
+java_library(
+  name = 'powermock-module-junit4',
+  exports = [
+    '@powermock_module_junit4//jar',
+    ':powermock-module-junit4-common',
+    '//lib:junit',
+  ],
+  visibility = ['//visibility:public'],
+)
+
+java_library(
+  name = 'powermock-module-junit4-common',
+  exports = [
+    '@powermock_module_junit4_common//jar',
+    ':powermock-reflect',
+    '//lib:junit',
+  ],
+  visibility = ['//visibility:public'],
+)
+
+java_library(
+  name = 'powermock-reflect',
+  exports = [
+    '@powermock_reflect//jar',
+    '//lib:junit',
+    '//lib/easymock:objenesis',
+  ],
+  visibility = ['//visibility:public'],
+)
+
+java_library(
+  name = 'powermock-api-easymock',
+  exports = [
+    '@powermock_api_easymock//jar',
+    ':powermock-api-support',
+    '//lib/easymock:easymock',
+  ],
+  visibility = ['//visibility:public'],
+)
+
+java_library(
+  name = 'powermock-api-support',
+  exports = [
+    '@powermock_api_support//jar',
+    ':powermock-core',
+    ':powermock-reflect',
+    '//lib:junit',
+  ],
+  visibility = ['//visibility:public'],
+)
+
+java_library(
+  name = 'powermock-core',
+  exports = [
+    ':powermock-reflect',
+    '//lib:javassist',
+    '//lib:junit',
+  ],
+  visibility = ['//visibility:public'],
+)
diff --git a/lib/prolog/BUILD b/lib/prolog/BUILD
new file mode 100644
index 0000000..74d8b80
--- /dev/null
+++ b/lib/prolog/BUILD
@@ -0,0 +1,47 @@
+java_library(
+  name = 'runtime',
+  exports = ['@prolog_runtime//jar'],
+  visibility = ['//visibility:public'],
+)
+
+java_library(
+  name = 'compiler',
+  exports = ['@prolog_compiler//jar'],
+  runtime_deps = [
+    ':io',
+    ':runtime',
+  ],
+  visibility = ['//visibility:public'],
+)
+
+java_library(
+  name = 'io',
+  exports = ['@prolog_io//jar'],
+)
+
+java_library(
+  name = 'cafeteria',
+  exports = ['@cafeteria//jar'],
+  runtime_deps = [
+    'io',
+    'runtime',
+  ],
+  visibility = ['//visibility:public'],
+)
+
+java_binary(
+  name = 'compiler_bin',
+  main_class = 'BuckPrologCompiler',
+  runtime_deps = [':compiler_lib'],
+  visibility = ['//visibility:public'],
+)
+
+java_library(
+  name = 'compiler_lib',
+  srcs = ['java/BuckPrologCompiler.java'],
+  deps = [
+    ':compiler',
+    ':runtime',
+  ],
+  visibility = ['//visibility:public'],
+)
diff --git a/lib/prolog/prolog.bzl b/lib/prolog/prolog.bzl
new file mode 100644
index 0000000..3afb031
--- /dev/null
+++ b/lib/prolog/prolog.bzl
@@ -0,0 +1,36 @@
+# 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.
+
+load('//tools/bzl:genrule2.bzl', 'genrule2')
+
+def prolog_cafe_library(
+    name,
+    srcs,
+    deps = [],
+    visibility = []):
+  genrule2(
+    name = name + '__pl2j',
+    cmd = '$(location //lib/prolog:compiler_bin) ' +
+      '$$TMP $@ ' +
+      '$(SRCS)',
+    srcs = srcs,
+    tools = ['//lib/prolog:compiler_bin'],
+    out = name + '.srcjar',
+  )
+  native.java_library(
+    name = name,
+    srcs = [':' + name + '__pl2j'],
+    deps = ['//lib/prolog:runtime'] + deps,
+    visibility = visibility,
+  )