Update from Google.
--
MOE_MIGRATED_REVID=85702957
diff --git a/base_workspace/tools/build_rules/genproto.bzl b/base_workspace/tools/build_rules/genproto.bzl
new file mode 100644
index 0000000..14801e3
--- /dev/null
+++ b/base_workspace/tools/build_rules/genproto.bzl
@@ -0,0 +1,77 @@
+# Copyright 2014 Google Inc. 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.
+
+# This is a quick and dirty rule to make Bazel compile itself. It
+# only supports Java.
+
+
+# TODO(bazel-team): unify the OSS Java rules and load from another
+# file.
+jar_filetype = FileType([".jar"])
+
+proto_filetype = FileType([".proto"])
+
+def genproto_impl(ctx):
+ src = ctx.file.src
+ proto_compiler = ctx.file._proto_compiler
+ proto_dep = ctx.file._proto_dep
+ class_jar = ctx.outputs.java
+ proto_output = class_jar.path + ".proto_output"
+ build_output = class_jar.path + ".build_output"
+
+ inputs = [src, proto_dep, proto_compiler]
+ proto_compiler_path = proto_compiler.path
+
+ javapath = "tools/jdk/jdk/bin/"
+ cmd = ("set -e;" +
+ "rm -rf " + proto_output + ";" +
+ "mkdir " + proto_output + ";" +
+ "rm -rf " + build_output + ";" +
+ "mkdir " + build_output + "\n" +
+ proto_compiler_path + " --java_out=" +
+ proto_output +" " + src.path + "\n" +
+ "JAVA_FILES=$(find " + proto_output + " -name '*.java')\n" +
+ javapath + "javac" + " -classpath " + proto_dep.path +
+ " ${JAVA_FILES} -d " + build_output + "\n" +
+ javapath + "jar cf " + class_jar.path + " -C " + build_output + " .\n")
+ ctx.action(
+ inputs = inputs,
+ outputs = [class_jar],
+ mnemonic = 'CompileProtos',
+ command = cmd,
+ use_default_shell_env = True)
+
+ return struct(compile_time_jars = set([class_jar]),
+ runtime_jars = set([class_jar, proto_dep], order="link"))
+
+
+genproto = rule(genproto_impl,
+ # There should be a flag like gen_java, and only generate the jar if it's
+ # set. Skylark needs a bit of improvement first (concat structs).
+ attrs = {
+ "src": attr.label(allow_files=proto_filetype, single_file=True),
+ # TODO(bazel-team): this should be a hidden attribute with a default
+ # value, but Skylark needs to support select first.
+ "_proto_compiler": attr.label(
+ default=Label("//third_party:protoc"),
+ allow_files=True,
+ single_file=True),
+ "_proto_dep": attr.label(
+ default=Label("//third_party:protobuf"),
+ single_file=True,
+ allow_files=jar_filetype,
+ ),
+ },
+ outputs = {"java": "lib%{name}.jar"},
+)
diff --git a/base_workspace/tools/build_rules/go_rules.bzl b/base_workspace/tools/build_rules/go_rules.bzl
new file mode 100644
index 0000000..7e94a75
--- /dev/null
+++ b/base_workspace/tools/build_rules/go_rules.bzl
@@ -0,0 +1,181 @@
+# Copyright 2014 Google Inc. 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.
+
+"""These are bare-bones Go rules.
+
+Several issues:
+
+- For "a/b/c.go", the go tool creates library "a/b.a" with import path
+"a/b". We can probably simulate this with symlink trees.
+
+- Dependencies are not enforced; a symlink tree might help here too.
+
+- Hardcoded to 6g from the GC suite. We should be able to support GCC
+ and derive 6g from the CPU (from which configuration?)
+
+- It would be nice to be able to create a full-fledged Go
+ configuration in Skylark.
+
+- It would be nice to support zero-configuration
+go_library()/go_binary()/go_test() rules:
+
+ * name defaults to basename of directory
+ * srcs defaults to *.go
+
+- does not support checked in compilers.
+
+- No C++ interop.
+
+- deps must be populated by hand or using Glaze.
+
+- go_test must have both test and non-test files in srcs.
+"""
+
+go_filetype = FileType([".go"])
+go_lib_filetype = FileType([".a"])
+
+
+def go_compile_command(ctx, sources, out_lib):
+ args = [
+ ctx.files.go_root[0].path + "/bin/go",
+
+ "tool", "6g",
+ "-o", out_lib.path, "-pack",
+
+ # Import path.
+ "-I", ctx.configuration.bin_dir.path]
+
+ # Set -p to the import path of the library, ie.
+ # (ctx.label.package + "/" ctx.label.name) for now.
+ return ' '.join(args + cmd_helper.template(sources, "%{path}"))
+
+def go_library_impl(ctx):
+ sources = ctx.files.srcs
+ out_lib = ctx.outputs.lib
+
+ ctx.action(
+ inputs = sources + ctx.files.deps,
+ outputs = [out_lib],
+ mnemonic = "GoCompile",
+ env = {
+ "GOROOT": ctx.files.go_root[0].path,
+ },
+ command = go_compile_command(ctx, set(sources), out_lib))
+
+ out_nset = set([out_lib])
+ return struct(
+ files = out_nset,
+ go_library_object = out_nset)
+
+
+def go_link_action(ctx, lib, executable):
+ cmd = ' '.join([
+ ctx.files.go_root[0].path + "/bin/go",
+ "tool", "6l",
+ # Link search path.
+ "-L", ctx.configuration.bin_dir.path,
+ "-o", executable.path,
+ lib.path])
+ ctx.action(
+ inputs = [lib],
+ outputs = [executable],
+ command = cmd,
+ env = {
+ "GOROOT": ctx.files.go_root[0].path,
+ },
+ mnemonic = "GoLink")
+
+
+def go_binary_impl(ctx):
+ lib_result = go_library_impl(ctx)
+ executable = ctx.outputs.executable
+ lib_out = ctx.outputs.lib
+
+ go_link_action(ctx, lib_out, executable)
+ return struct(files = set([executable]) + lib_result.files)
+
+
+def go_test_impl(ctx):
+ lib_result = go_library_impl(ctx)
+ main_go = ctx.outputs.main_go
+
+ go_import = ctx.label.package + "/" + ctx.label.name
+
+ # Would be nice to use transitive info provider to get at sources of
+ # a dependent library.
+ sources = ctx.files.srcs
+ args = (["--package", go_import, "--output", ctx.outputs.main_go.path] +
+ cmd_helper.template(set(sources), "%{path}"))
+
+ ctx.action(
+ inputs = sources,
+ executable = ctx.executable.test_generator,
+ outputs = [main_go],
+ mnemonic = "GoTestGenTest",
+ arguments = args)
+
+ ctx.action(
+ inputs = [main_go, ctx.outputs.lib],
+ outputs = [ctx.outputs.main_lib],
+ command = go_compile_command(ctx, set([main_go]), ctx.outputs.main_lib),
+ env = {
+ "GOROOT": ctx.files.go_root[0].path,
+ },
+ mnemonic = "GoCompileTest")
+
+ go_link_action(ctx, ctx.outputs.main_lib, ctx.outputs.executable)
+
+ runfiles = ctx.runfiles(collect_data = True, files = [ctx.outputs.executable])
+ return struct(runfiles=runfiles)
+
+go_library_attrs = {
+ "data": attr.label_list(allow_files=True, cfg=DATA_CFG),
+ "srcs": attr.label_list(allow_files=go_filetype),
+ "deps": attr.label_list(
+ providers=["go_library_object"]),
+ "go_root": attr.label(
+ default=Label("//tools/go:go_root"),
+ allow_files=True,
+ cfg=HOST_CFG),
+ }
+
+go_library_outputs = {
+ "lib": "%{name}.a",
+ }
+
+go_library = rule(
+ go_library_impl,
+ attrs = go_library_attrs,
+ outputs =go_library_outputs)
+
+go_binary = rule(
+ go_binary_impl,
+ executable = True,
+ attrs = go_library_attrs,
+ outputs = go_library_outputs)
+
+go_test = rule(
+ go_test_impl,
+ executable = True,
+ test = True,
+ attrs = go_library_attrs + {
+ "test_generator": attr.label(
+ default=Label("//tools/go:generate_test_main"),
+ cfg=HOST_CFG, flags=["EXECUTABLE"])
+ },
+ outputs = {
+ "lib" : "%{name}.a",
+ "main_lib": "%{name}_main_test.a",
+ "main_go": "%{name}_main_test.go",
+ })
diff --git a/base_workspace/tools/build_rules/java_rules_oss.bzl b/base_workspace/tools/build_rules/java_rules_oss.bzl
new file mode 100644
index 0000000..dcd2329
--- /dev/null
+++ b/base_workspace/tools/build_rules/java_rules_oss.bzl
@@ -0,0 +1,233 @@
+# Copyright 2014 Google Inc. 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.
+
+java_filetype = FileType([".java"])
+jar_filetype = FileType([".jar"])
+srcjar_filetype = FileType([".jar", ".srcjar"])
+
+JAVA_PATH='tools/jdk/jdk/bin/'
+
+def is_windows(config):
+ return config.fragment(cpp).compiler.startswith("windows_")
+
+def path_separator(ctx):
+ if is_windows(ctx.configuration):
+ return ";"
+ else:
+ return ":"
+
+# This is a quick and dirty rule to make Bazel compile itself. It's not
+# production ready.
+
+def java_library_impl(ctx):
+ class_jar = ctx.outputs.class_jar
+ compile_time_jars = set(order="link")
+ runtime_jars = set(order="link")
+ for dep in ctx.targets.deps:
+ compile_time_jars += dep.compile_time_jars
+ runtime_jars += dep.runtime_jars
+
+ jars = jar_filetype.filter(ctx.files.jars)
+ compile_time_jars += jars
+ runtime_jars += jars
+ compile_time_jars_list = list(compile_time_jars) # TODO: This is weird.
+
+ build_output = class_jar.path + ".build_output"
+ sources = ctx.files.srcs
+
+ sources_param_file = ctx.new_file(
+ ctx.configuration.bin_dir, class_jar, "-2.params")
+ ctx.file_action(
+ output = sources_param_file,
+ content = cmd_helper.join_paths("\n", set(sources)),
+ executable = False)
+
+ # Cleaning build output directory
+ cmd = "set -e;rm -rf " + build_output + ";mkdir " + build_output + "\n"
+ if ctx.files.srcs:
+ cmd += JAVA_PATH + "javac"
+ if compile_time_jars:
+ cmd += " -classpath '" + cmd_helper.join_paths(path_separator(ctx), compile_time_jars) + "'"
+ cmd += " -d " + build_output + " @" + sources_param_file.path + "\n"
+
+ # We haven't got a good story for where these should end up, so
+ # stick them in the root of the jar.
+ for r in ctx.files.resources:
+ cmd += "cp %s %s\n" % (r.path, build_output)
+ cmd += (JAVA_PATH + "jar cf " + class_jar.path + " -C " + build_output + " .\n" +
+ "touch " + build_output + "\n")
+ ctx.action(
+ inputs = (sources + compile_time_jars_list + [sources_param_file] +
+ ctx.files.resources),
+ outputs = [class_jar],
+ mnemonic='Javac',
+ command=cmd,
+ use_default_shell_env=True)
+
+ runfiles = ctx.runfiles(collect_data = True)
+
+ return struct(files = set([class_jar]),
+ compile_time_jars = compile_time_jars + [class_jar],
+ runtime_jars = runtime_jars + [class_jar],
+ runfiles = runfiles)
+
+
+def java_binary_impl(ctx):
+ library_result = java_library_impl(ctx)
+
+ deploy_jar = ctx.outputs.deploy_jar
+ manifest = ctx.outputs.manifest
+ build_output = deploy_jar.path + ".build_output"
+ main_class = ctx.attr.main_class
+ ctx.file_action(
+ output = manifest,
+ content = "Main-Class: " + main_class + "\n",
+ executable = False)
+
+ # Cleaning build output directory
+ cmd = "set -e;rm -rf " + build_output + ";mkdir " + build_output + "\n"
+ for jar in library_result.runtime_jars:
+ cmd += "unzip -qn " + jar.path + " -d " + build_output + "\n"
+ cmd += (JAVA_PATH + "jar cmf " + manifest.path + " " +
+ deploy_jar.path + " -C " + build_output + " .\n" +
+ "touch " + build_output + "\n")
+
+ ctx.action(
+ inputs=list(library_result.runtime_jars) + [manifest],
+ outputs=[deploy_jar],
+ mnemonic='Deployjar',
+ command=cmd,
+ use_default_shell_env=True)
+
+ # Write the wrapper.
+ executable = ctx.outputs.executable
+ ctx.file_action(
+ output = executable,
+ content = '\n'.join([
+ "#!/bin/bash",
+ "# autogenerated - do not edit.",
+ "case \"$0\" in",
+ "/*) self=\"$0\" ;;",
+ "*) self=\"$PWD/$0\";;",
+ "esac",
+ "",
+ "if [[ -z \"$JAVA_RUNFILES\" ]]; then",
+ " if [[ -e \"${self}.runfiles\" ]]; then",
+ " export JAVA_RUNFILES=\"${self}.runfiles\"",
+ " fi",
+ " if [[ -n \"$JAVA_RUNFILES\" ]]; then",
+ " export TEST_SRCDIR=${TEST_SRCDIR:-$JAVA_RUNFILES}",
+ " fi",
+ "fi",
+ "",
+
+ "jvm_bin=%s" % (ctx.file.javabin.path),
+ "if [[ ! -x ${jvm_bin} ]]; then",
+ " jvm_bin=$(which java)",
+ "fi",
+
+ # We extract the .so into a temp dir. If only we could mmap
+ # directly from the zip file.
+ "DEPLOY=$(dirname $self)/$(basename %s)" % deploy_jar.path,
+
+ # This works both on Darwin and Linux, with the darwin path
+ # looking like tmp.XXXXXXXX.{random}
+ "SO_DIR=$(mktemp -d -t tmp.XXXXXXXXX)",
+ "function cleanup() {",
+ " rm -rf ${SO_DIR}",
+ "}",
+ "trap cleanup EXIT",
+ "unzip -q -d ${SO_DIR} ${DEPLOY} \"*.so\" \"*.dll\" \"*.dylib\" >& /dev/null",
+ ("${jvm_bin} -Djava.library.path=${SO_DIR} %s -jar $DEPLOY \"$@\""
+ % ' '.join(ctx.attr.jvm_flags)) ,
+ "",
+ ]),
+ executable = True)
+
+ runfiles = ctx.runfiles(files = [
+ deploy_jar, executable] + ctx.files.jvm, collect_data = True)
+ files_to_build = set([deploy_jar, manifest, executable])
+ files_to_build += library_result.files
+
+ return struct(files = files_to_build, runfiles = runfiles)
+
+
+def java_import_impl(ctx):
+ # TODO(bazel-team): Why do we need to filter here? The attribute
+ # already says only jars are allowed.
+ jars = set(jar_filetype.filter(ctx.files.jars))
+ runfiles = ctx.runfiles(collect_data = True)
+ return struct(files = jars,
+ compile_time_jars = jars,
+ runtime_jars = jars,
+ runfiles = runfiles)
+
+
+java_library_attrs = {
+ "data": attr.label_list(allow_files=True, cfg=DATA_CFG),
+ "resources": attr.label_list(allow_files=True),
+ "srcs": attr.label_list(allow_files=java_filetype),
+ "jars": attr.label_list(allow_files=jar_filetype),
+ "deps": attr.label_list(
+ allow_files=False,
+ providers = ["compile_time_jars", "runtime_jars"]),
+ }
+
+java_library = rule(
+ java_library_impl,
+ attrs = java_library_attrs,
+ outputs = {
+ "class_jar": "lib%{name}.jar",
+ })
+
+java_binary_attrs_common = java_library_attrs + {
+ "jvm_flags": attr.string_list(),
+ "jvm": attr.label(default=Label("//tools/jdk:jdk"), allow_files=True),
+ "javabin": attr.label(default=Label("//tools/jdk:java"), single_file=True),
+ "args": attr.string_list(),
+}
+
+java_binary_attrs = java_binary_attrs_common + {
+ "main_class": attr.string(mandatory=True),
+}
+
+java_binary_outputs = {
+ "class_jar": "lib%{name}.jar",
+ "deploy_jar": "%{name}_deploy.jar",
+ "manifest": "%{name}_MANIFEST.MF"
+}
+
+java_binary = rule(java_binary_impl,
+ executable = True,
+ attrs = java_binary_attrs,
+ outputs = java_binary_outputs)
+
+java_test = rule(java_binary_impl,
+ executable = True,
+ attrs = java_binary_attrs_common + {
+ "main_class": attr.string(default="org.junit.runner.JUnitCore"),
+ # TODO(bazel-team): it would be better if we could offer a
+ # test_class attribute, but the "args" attribute is hard
+ # coded in the bazel infrastructure.
+ },
+ outputs = java_binary_outputs,
+ test = True,
+)
+
+java_import = rule(
+ java_import_impl,
+ attrs = {
+ "jars": attr.label_list(allow_files=jar_filetype),
+ "srcjar": attr.label(allow_files=srcjar_filetype),
+ })
diff --git a/base_workspace/tools/build_rules/py_rules.bzl b/base_workspace/tools/build_rules/py_rules.bzl
new file mode 100644
index 0000000..ddd43df
--- /dev/null
+++ b/base_workspace/tools/build_rules/py_rules.bzl
@@ -0,0 +1,122 @@
+# Copyright 2014 Google Inc. 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.
+
+ZIP_PATH = "/usr/bin/zip"
+
+py_file_types = FileType([".py"])
+
+
+def collect_transitive_sources(ctx):
+ source_files = set(order="compile")
+ for dep in ctx.targets.deps:
+ source_files += dep.transitive_py_files
+
+ source_files += py_file_types.filter(ctx.files.srcs)
+ return source_files
+
+
+def py_library_impl(ctx):
+ transitive_sources = collect_transitive_sources(ctx)
+ return struct(
+ files = set(),
+ transitive_py_files = transitive_sources)
+
+
+def py_binary_impl(ctx):
+ main_file = py_file_types.filter(ctx.files.srcs)[0]
+ transitive_sources = collect_transitive_sources(ctx)
+ deploy_zip = ctx.outputs.deploy_zip
+
+ deploy_zip_nomain = ctx.new_file(
+ ctx.configuration.bin_dir, deploy_zip, ".nomain.zip")
+
+ # This is not very scalable, because we just construct a huge string instead
+ # of using a nested set. We need to do it this way because Skylark currently
+ # does not support actions with non-artifact executables but with an
+ # argument list (instead of just a single command)
+ command = ZIP_PATH +" -q " + deploy_zip_nomain.path + " " + " ".join([f.path for f in transitive_sources])
+ ctx.action(
+ inputs = list(transitive_sources),
+ outputs = [ deploy_zip_nomain ],
+ mnemonic = "PyZip",
+ command = command,
+ use_default_shell_env = False)
+
+ dirs = [f.path[:f.path.rfind('/')] for f in transitive_sources]
+ outdir = deploy_zip.path + ".out"
+
+ # Add __init__.py files and the __main__.py driver.
+ main_cmd = ("mkdir %s && " % outdir +
+ " cp %s %s/__main__.py && " % (main_file.path, outdir) +
+ " cp %s %s/main.zip && " % (deploy_zip_nomain.path, outdir) +
+ " (cd %s && " % outdir +
+ " mkdir -p %s && " % " ".join(dirs) +
+ " find -type d -exec touch -t 198001010000 '{}'/__init__.py ';' && " +
+ " chmod +w main.zip && " +
+ " %s -qR main.zip $(find -type f ) ) && " % (ZIP_PATH) +
+ " mv %s/main.zip %s " % (outdir, deploy_zip.path))
+
+ ctx.action(
+ inputs = [ deploy_zip_nomain, main_file ],
+ outputs = [ deploy_zip ],
+ mnemonic = "PyZipMain",
+ command = main_cmd)
+
+ executable = ctx.outputs.executable
+ ctx.action(
+ inputs = [ deploy_zip, ],
+ outputs = [ executable, ],
+ command = "echo '#!/usr/bin/env python' | cat - %s > %s && chmod +x %s" % (
+ deploy_zip.path, executable.path, executable.path))
+
+ runfiles_files = transitive_sources + [executable]
+
+ runfiles = ctx.runfiles(transitive_files = runfiles_files,
+ collect_default = True)
+
+ files_to_build = set([deploy_zip, executable])
+ return struct(files = files_to_build, runfiles = runfiles)
+
+
+py_srcs_attr = attr.label_list(
+ flags=["DIRECT_COMPILE_TIME_INPUT"],
+ allow_files = py_file_types)
+
+py_deps_attr = attr.label_list(
+ providers = ["transitive_py_files"],
+ allow_files = False)
+
+py_attrs = {
+ "srcs": py_srcs_attr,
+ "deps": py_deps_attr }
+
+py_library = rule(
+ py_library_impl,
+ attrs = py_attrs)
+
+py_binary_outputs = {
+ "deploy_zip": "%{name}.zip"
+ }
+
+py_binary = rule(
+ py_binary_impl,
+ executable = True,
+ attrs = py_attrs,
+ outputs = py_binary_outputs)
+
+py_test = rule(
+ py_binary_impl,
+ executable = True,
+ attrs = py_attrs,
+ outputs = py_binary_outputs)